独家解读 | 滴滴机器学习平台架构演进之路
現在很多互聯網公司都有自己的機器學習平臺,冠以之名雖然形形色色,但就平臺所要解決的問題和技術選型基本還是大同小異。
所謂大同是指大家所要處理的問題都相似,技術架構和選型也差不太多,比如都會使用 GPU 集群、采用 Spark 或 K8s 平臺等。所謂小異是指各家規模不同,各家都在結合自己的情況、所處的階段并根據自己的特點解決平臺化的問題。
滴滴機器學習平臺的治理思路主要是:減少重復、提高效率。本文將對滴滴的機器學習平臺進行全面解讀,重點分享機器學習平臺不同階段所要解決的問題,以及解決問題的思路和技術方案。希望能夠對大家有所幫助。
機器學習平臺1.0:從“作坊”向“集中化”過渡
滴滴的機器學習平臺建設開始于2016年,當時滴滴內部各算法團隊逐步開展機器學習、深度學習等AI相關的研究和實踐應用,這類算法大都屬計算密集型應用,一般都會使用單價較昂貴的GPU服務器。但隨著業務的開展,各算法團隊僅針對各自的問題做規劃,由此導致了一種小作坊式的生產局面。作坊式生產方式在早期有其積極的一面,能夠保證創新的靈活性,但是越往后,這種小作坊式算法生產模式的局限就越明顯:資源缺乏統籌調度,無法形成規模化效應,大量重復性工作,自擁算力有限。逐漸增多的這種小作坊式生產方式致使整體投入產出的效益大打折扣。滴滴機器學習平臺在這種背景下應運而生,這個階段也主要致力于解決這些問題。
這期間機器學習平臺所采用的架構和技術選型主要針對作坊式生產方式的問題來展開,也就是提高復用性和規模化能力。
首先要解決的問題就是統一資源管理,這個“統一”要解決包括線下和線上兩類問題。線下“統一”的問題著重解決GPU的服務器選型、測試、引入、上線等的集中化。這類集中化一方面提高了服務器引入的上線質量;另一方面相比于作坊式模式,由于有GPU相關專業人員參與進來,GPU的選型也避免了一味追新的盲目性和發散性;再者,由于集中化能夠和公司整體大局結合起來,從而可以做最優化的選型和引入方案。
線上“統一”需要解決的問題細分為資源管理問題和任務調度問題,使資源使用方能夠用即申請,完即釋放,從而盤活整個資源大池,對平臺要求則需要做到資源的隔離和管理。
這個階段需要解決資源統一管理后如何避免重復性工作的問題。此時所謂的避免重復性,意在讓各個算法業務不需重復諸如Caffe、TensorFlow、PyTorch等運行環境的構建,而是要一次構建所有用戶都可用。這對平臺來講,需要做到應用環境管理、用戶自定義環境、快速環境部署。
厘清這些需求之后,結合當時的技術環境和成熟度來看及以上的基本要求,平臺選擇當下盛行的Docker來兼做環境的管理、資源的弱隔離和任務的調度;但由于此時支持GPU資源調度的資源管理器乏善可陳,所以我們選擇對Yarn做了擴展以支持GPU資源維度上的資源管理和任務調度,環境上平臺同時提供Notebook、Jupyter的交互接口給用戶。
統一資源管理、環境管理后,不得不面對的問題是多個資源節點間數據共享的問題,用戶在當前資源釋放后申請新資源時往往對之前的數據有依賴。多節點數據共享在作坊式時期受限于單個的規模,問題不會十分突出,但是集中化之后隨用戶增多就會逐漸尖銳起來乃至是個大的技術挑戰。因為:1. 機器學習的任務計算特點依賴于GPU的高速計算,它們對數據訪問延遲有一定要求,這要求必須有足夠高的IO帶寬做支持;2. 用戶數量增加,對存儲帶寬的需求會變的非常大;3. 對存儲系統來說,支持POSIX接口的要求使得現有技術方案大大減小,另外也需在高可靠性、高性能以及成本之間做折中。
滴滴機器學習平臺在存儲系統上的嘗試還是借用傳統超算使用的PFS作為整個數據存儲的一級,底層網絡基礎設施使用高帶寬的以太網絡,使用RoCE協議做RDMA的支持,并往這個方向演進。
總的來看,這個階段所面對的問題以內部問題為主,從作坊式到集中化生產的發展階段,要解決的相關重復性的問題也比較簡單。其中有些問題本質屬于集中化后產生的問題,但是解決思路還是作坊式的,技術選型上的局限性也沒有完全暴露出來。
機器學習平臺2.0:平臺發展
隨著作坊逐漸消失,機器學習平臺作為一種集中化的生產方式呈現給公司所有算法團隊。平臺功能開始完整和完善,監控體系,運維體系,更加精細化的資源隔離、管理及優化;根據用戶不同的任務性質也提供了不同性質的任務支持。
經歷了前一個階段,雖然有效降低了作坊生產的重復性工作,但也幾乎是必然的產生了一些新形態的重復工作。用戶接入的增多,用戶任務的性質也多樣化,有些是實驗性質的、有些是在線生產任務、有些是單卡任務、有些是多卡多機的訓練任務,等等。
每種性質的任務都有各自重復的具體形式,比如用戶在模型生產后要部署模型服務,就需要解決服務的HA、負載均衡等生產服務問題,每一個在線模型都要解決這類問題;再比如,用戶訓練時往往需要調參,而這些參數都是同形的,只是數值上的變化,這種值上的變化后就是一個個獨立的任務,需要用戶提交任務的流程,這提交流程也是重復性的工作;再比如,用戶在運行多機多卡時需要參數服務器,低效的參數服務器把大量的時間浪費在通信上,這種浪費會加重用戶資源使用上的重復;與這種重復形式相似的,還有比如模型服務要上線,為了滿足服務的延遲、QPS、資源的約束,需要做從服務、到深度學習框架、再到計算庫的全棧優化,基本上,大部分模型上線也需要經歷這個優化過程。
針對上述新出現的問題,平臺需要更加強大的資源管理和任務調度能力。在上一時期選用作為資源管理和任務調度器的Yarn開始呈現出疲態,具體表現在K8s日臻成熟,與Docker的結合更加合理和完整,并能夠整合多種維度的資源,使用K8s為解決模型服務的自動化部署提供了環境和條件,也降低了服務的運維成本,綜合K8s和Yarn各自的利弊,滴滴機器學習平臺開始由Yarn架構向K8s建構遷移。
針對用戶同形調參的效率問題,平臺對用戶的Python代碼做語義分析以自動識別出哪些參數可能會是需要調整的參數,用戶只需要設置值域和步距就可以自動獲取整套參數的模型訓練任務以及最終的結果。
針對多機多卡訓練效率問題,平臺結合自己的硬件特點和通信模式特點,開發了滴滴參數服務器。滴滴參數服務器采取環狀結構,實現了高效的RDMA通信的Allreduce算法。環狀結構而非中心集中的server-client模式,消除了網絡傳輸可能的帶寬競爭和網絡擁塞。底層自研的高效RDMA通信庫,規避了設備廠家提供用戶態 Verbs 內部分性能損失,重寫的底層通信庫實現了 sig/read 及 post/recv 兩種模式,盡量規避了RDMA固有的通信開銷,充分挖掘了硬件的屬性來提高性能。另外,自研的Allreduce算法巧妙重疊了計算和傳輸,盡量減少了不必要的內存拷貝來減少額外代價,并充分考慮了GPU拓撲、CPU親和性等硬件屬性來提高性能。
在機房40G帶寬的RoCE v2 RDMA網絡實際測試中,對比業界的OpenMPI和Nvidia的NCCL2方案,滴滴參數服務器有明顯優勢。
針對模型服務部署和優化,平臺結合自己的場景特點開發了DDL(DiDi Deep Learning) Serving服務框架、IFX框架和Autotuning優化庫,極大的加速了模型上線部署和優化過程。DDL Serving獨創自適應的batch機制,優化RPC協議,解決Tensorflow Serving的缺陷,相比于Tensorflow Serving性能對比加速如下:
DDL Serving框架服務本身不再成為整個服務鏈路中的瓶頸點,對于一些輕量模型可以有3倍的性能提升,包括RT和QPS的提升, 而對于一般模型,性能熱點落在深度學習框架層。
因此,針對框架層,我們自主研發了深度學習框架IFX,并同時適配于GPU服務器和移動端平臺。在GPU服務器上,由于CUDA存在context管理的問題,所以我們設計實現了一種GPU上的并發機制,有效地繞開了這些問題所帶來的額外開銷,另外對大量的OP做了優化,使得IFX的性能遠高于Tensoflow乃至TensorRT ;IFX針對移動端的不同硬件配置,比如:流水線長度、順序亂序、超標量等特點進行指令重排、訪存優化,結合業務的計算特點,使得IFX的性能取得不俗的表現:
在IFX的優化過程中,大量的重復工作基本在Tuning Blas計算,由于硬件架構不同,不同模型的計算量、計算訪存比、計算訪存模式都不同,在極高性能要求下都需要綜合這些具體的情況做針對性的優化。這些優化都很底層,并且調優都相對繁瑣,對于上層服務用戶來講,不必關心這些底層細節。
為解決這類問題,平臺開發了Autotuning工具鏈,包括Kepler、Pascal、Volta 架構的原生匯編器。對于用戶來講,只需要把GPU上的二進制代碼發給平臺,平臺就可產生在該GPU平臺上幾乎是最優,也就是當前最高性能優化后的二進制代碼。滴滴機器學習平臺團隊也是目前除了NV 以外,自己掌握 NV GPU 原生匯編器支持版本最多,對 NV GPU 微架構最了解的。
這些“重復問題”隨著集中化和平臺化產生,也在平臺化的環境下使得解決這些“重復”變得有意義。集中化、平臺化帶來的第二個好處便是在此基礎上,通用性的需求逐漸會沉淀為平臺的服務。比如相似檢索的需求在滴滴地圖的POI優化、人臉檢索、視頻圖像內容檢索等業務場景中都是共性需求,因此平臺會獲得足夠的業務信息來開發這種平臺級的服務,而在作坊式時代很難獲得這類跨業務場景的需求而自發的沉淀出平臺服務,大多還是自掃門前雪。
機器學習平臺2.1:內外云平臺成形
集中化生產后的第二個影響,隨著平臺能力的增加以及孵化落地算法逐步豐富,加上滴滴內部數據、AI工程和算法逐步積累成熟,機器學習平臺的功能、定位也變得多樣化。除了服務好滴滴內部機器學習平臺用戶,進一步夯實資源調度、任務管理、監控運維等能力外,平臺開始承接內部能力對外輸出的職能,期間機器學習平臺和滴滴云著手在公有云上打造從底層資源到上層平臺、從公有云到私有云的解決方案。
機器學習內部的集中化生產也給滴滴機器學習平臺能力的輸出做了儲備,但外部客戶的技術產品要求相對更復雜。這個復雜首先體現在產品要求的多層次性:有對資源乃至對硬件的直接要求、有對具體服務的需求、也有例如在私有云中對平臺能力的需求;其次, 產品考量因素的多維性:資源的性價比往往只是一方面,安全性、穩定性、與其他基礎設施的整合能力等也都是影響用戶決策的因素;最后,橫向各友商競品的對比。
所有這些問題都是滴滴機器學習平臺對外服務碰到的問題,但是這些問題不可能做到“畢其功于一役”,都是分階段分步驟,有側重的解決此間的問題。第一步要解決的是基礎問題,如何透出能力,如何保證客戶的安全性,如何在前兩個能力的基礎上,盡最大力減少外部用戶的重復性工作(用戶使用的成本)和滴滴機器學習平臺的重復性工作(產品性價比)。
GPU資源:減少資源的重復性工作
相比于內部的用戶,外部用戶使用資源需要有一個安全的隔離環境,僅用Docker的弱隔離方式無法給用戶提供安全且隔離的環境。所以滴滴云上GPU云資源使用KVM和GPU透傳的方式把GPU資源透傳給用戶。滴滴機器學習平臺技術團隊對GPU的使用頗有心得,團隊成員也是早期一批在工業界嘗試GPU的團隊,積累了豐富的GPU使用一線的知識和經驗,而且這些在滴滴內部被佐證十分有效,從GPU資源、拓撲和相關配套上都特別花心思,所以相同GPU型號,用戶往往可以獲得更好的性能,對比如下圖。這部分的沉淀也減少了外部用戶在探索使用GPU過程中的重復性工作,降低了使用的隱性成本。
彈性推理服務(EIS):減少服務部署優化的重復
所有的算法模型最終都需要用于生產服務,國外有很多PAML平臺能夠部署機器學習模型服務,機器學習平臺在滴滴云上也提供了一種模型部署服務——EIS(彈性預測服務)。EIS服務根植于內部使用的DDL Serving服務,但因在云上服務我們對一些理念的堅持,所以大家可能會產生我們有“起大早趕晚集”的疑問,誠然,EIS在滴滴內部以DDL的形式出現的相對不算晚,但這一塊的服務市場現在只能說是剛剛起步,產品的差異化和多樣化會是必然的趨勢,對用戶來講也有更好更大的選擇空間。
目前,市面上大大小小提供PA服務的廠商大都有各自的特點,但總的來說他們對這個產品的定位依然僅是作為資源產品的輔助角色,著重為用戶解決資源和部署問題。這種輔助角色,有他的好處,主要包括:一是模式簡單,把服務轉化為最小粒度資源開銷,按最小單位資源消耗來計費;二是對基礎設施的能力要求降低,簡化為資源開銷,本質上只是多了一種資源的售賣形式;三是服務廠商的工作最小化,雖然用戶可以選擇多種資源,并且每種資源的都有各自理論上的計算能力,用戶怎么利用好這些資源是用戶自己的事情。
這個模式的問題在于服務商雖然為客戶解決了一部分問題,但是對用戶實際的服務部署考慮仍然不周。為什么?原因在DDL描述中也提到過,模型服務部署服務都需要用戶自己優化服務以滿足RT、QPS的要求,更進一步說,成本如何最優化,用戶使用云服務,成本幾乎是必然會面對和慎重考慮的。
所以,從這個點來看,PA服務提供商以資源為主,服務為輔的模式的缺點也顯而易見: 一,最小粒度資源的粒度對模型服務來說,粒度依舊比較粗,如若使用到GPU,問題更加突出;二,資源的理論計算能力對用戶來講往往僅是個理論數字,受限于硬件的限制和客戶自己的技術能力,客戶往往并不能充分利用PA廠商提供的資源的計算能力,而一般利用率都有限,這實際使用和標稱的理論數字之間的資源費用實際是由用戶買單的,而更甚者,對用戶來講這里有兩部分工作是重復的:資源的使用優化的重復,服務部署的運維相關工作的重復。
根據我們內部用戶和一些外部用戶的經驗,服務最核心的技術指標是QPS和RT,進而才是滿足這兩個指標情況下的部署成本和使用成本。而這些成本的降低則必須在盡可能減少用戶的重復工作和“實用實銷”的基礎上,除了一般服務部署需要的HA和運維支持外,EIS從技術架構設計上側重于解決這兩方面問題。
從RT來講:用戶服務RT的開銷受限于網絡鏈路和實際前向計算的開銷,為了減少網絡鏈路的開銷,滴滴云花了不少時間,在公有云上實現了純公有云化的Gateway,這一方面用于支持用戶自定義的鑒權等操作,另一方面也最小化網路跳數以降低網絡的開銷,保證用戶服務的RT;從QPS來講,EIS使用滴滴機器學習平臺的DDL Serving作為服務引擎框架,使用DDL Serving的用戶可以忽略底層硬件的細節,從而可以避免用戶重復地去做服務框架層面的已知的優化工作,這樣也為實現用戶“實用實銷”提供了條件。可以通過以下的架構圖了解:
要做到“實用實銷”,還有一個非常關鍵的環節就是需要知道用戶的模型實際的計算需求量,以及某一種硬件下的計算利用率。我們開發了一個自動壓測模塊,用戶提供模型和部署輸入就可以獲得使用DDL Serving在某種硬件下的計算性能,進一步回歸出某種RT性能要求下的QPS能力。對用戶來講,用戶折算出業務需總的QPS后按QPS橫向擴容即可,相當于用戶只負擔了實際消耗的計算性能的那部分資源,這比之前的模式是更加細粒度的資源控制。
用戶優化上的重復性工作的減少,如之前講過的除了服務框架的優化外,還有一部分優化是花在計算性能的優化上,但計算性能的優化往往取決于程序的計算特性和相關的硬件特性,并且每種模型都有各自的特點,這部分工作EIS也提供了Autotuning的優化服務,用戶需要提供他的二進制代碼,通過Autotuning服務后會產生某種模型和框架下在指定硬件下幾乎是最優的性能代碼。
Autotuning服務除了能降低重復基礎的和瑣碎的優化工作外,也能夠提升用戶模型服務RT和每QPS實際資源消耗資源。目前EIS已經接入滴滴內部大量的業務,其整個功能模塊圖如下。因為一些限制,對外部客戶,當前滴滴云EIS服務還是通過提交工單接入的方法,用戶自助的方式馬上會上線。
簡樞:降低用戶重復平臺建設
同EIS一樣,機器學習平臺級產品在內部積累了豐富的一線平臺經驗,基于此,機器學習平臺在滴滴云上開發了平臺級產品簡樞。簡樞包裝了多種平臺能力,弱隔離方案的資源管理、多種任務管理、監控報警、在線服務快速部署等,能夠幫助其他公司在平臺化過程中少踩坑,快速具備平臺能力,提高生產效益。
未來展望
對于機器學習來講,計算力仍然是最具革命性的力量,正如2011年開始的這波深度學習浪潮的助力正是GPU一樣,未來計算力還是工程層面的制約力。正如Jeff Dean所言“事實證明,我們真正需要的是超過現在100萬倍的計算能力,而不僅僅是幾十倍的增長。”因此,對平臺來講,如何更好的管理不斷爆發式增加的計算力、如何有效的釋放出這些計算力,如何駕馭好這些計算力仍然需要平臺不斷的探索、實踐、技術升級等等。
所有平臺的生命力源自于生產效率的綜合提高,降低整體成本。對于滴滴機器學習平臺而言,內部第一目標是要降低滴滴在使用最新的機器學習、深度學習、強化學習等技術上能夠保證整體效率和成本控制,同時兼顧創新的活力;對于外部來講,秉承持續為客戶創造價值的理念,深化云平臺產品的各項產品功能、質量和成本,為客戶打造物美價廉的技術產品。
機器學習平臺3.0具體來說,滴滴機器學習平臺要實現3.0階段,也即從硬件選型到基礎設施到上層整個軟件棧,能夠做到內外統一架構,降低內外兩部分的重復性工作。同時會從AI解決問題的效率和規模兩方面著手,在平臺上提供更豐富的功能,比如開發算法市場、模型市場、數據市場、GUI界面以提高用戶使用各種學習技術的效率,也會繼續沉淀更多的具體服務,比如:人臉比對、語音識別、翻譯等等。
總結
以上是生活随笔為你收集整理的独家解读 | 滴滴机器学习平台架构演进之路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webpack之proxyTable配置
- 下一篇: 结合JDK源码看设计模式——简单工厂、工