杭州2018年7月(yue)11日電(dian) /美(mei)通社/ -- 5月(yue)26 日下午,在第二十八(ba)期七牛云架(jia)構師實踐日,李(li)朝(chao)光進行(xing)了題為《深度(du)學習平臺 AVA 及海量資源管(guan)理(li)》的(de)實戰(zhan)分享。本文是對演(yan)講內(nei)容的(de)整理(li)。
七牛云在深度訓練平臺里如何管理數據以及 GPU ?
深度訓練平臺有兩個核心,一個是數據管理,一個是計算資源管理。首先提數據管理的原因是,從傳統意義上使用數據到深度訓練訪問數據,會發現一個有趣的問題:數據量已經大到沒法管理的地步了。李(li)朝(chao)光表示,“比如以往,我們用網盤或搭一個 CEPH,數據一般都是少數幾個 T 的級別,但等到真正運作深度訓練的時候,會發現跑一個訓練,比如圖像分類或視頻檢索訓練,就能消耗幾十個 T 的空間。怎么有效把這些數據喂到深度訓練里?七牛云 AVA 平臺的誕生就是要想辦法解決這個問題。”
第二是計算資源的管理。這里的計算資源,基本指 GPU,一般來說是 NVIDIA 的 GPU。七牛云實驗室里,現在已經有百臺級別的 GPU,里面有各種型號,比如 M4、K80,到 P100、V100 都有。這些資源怎么有效地管理、使用,是個難題。七牛云開始是用非常原始的方(fang)式,比(bi)如搶占方(fang)式,后(hou)來再慢慢把資(zi)源管理模塊化、精細化,最后(hou)才做到 AVA 這個(ge)平(ping)臺。
七牛云目前圍繞的是數據創新服務。但七牛云是做存儲起步的,開始是集中在海量(對象)存儲,后面進入了機器學習、智能多媒體服務,這些的共用特點是對數據本身的存儲管理,比如對象存儲。怎么把這么多數據存儲起來?怎么高效地把它放在 CDN 里,快速地進行轉發?目前七牛云已經基本實現了第一步:把數據有效地管理起來。第二步,怎么發現數據之間的關系?如何根據數據內容做創新?比如一個視頻有幾千幀,幀和幀之間有什么關系?一個圖片,是否屬于黃色或暴恐的?七牛(niu)云重點做圖片、視頻的檢索、分類,還有人(ren)臉識別等。
一個圖片過來,不能直接喂到七牛(niu)云深度訓練系統里,第一步就要做數據處理。之前七牛云有個 DORA 系統,是做圖片視頻處理的,比如裁減翻轉、加(jia)水印(yin)等(deng)。這(zhe)樣可以(yi)把數據(ju)轉換成深(shen)(shen)度(du)訓練需要的(de)(de)格式(shi),然后(hou)喂(wei)到(dao)深(shen)(shen)度(du)訓練系統里(li),這(zhe)是(shi)(shi)目前正(zheng)在做的(de)(de)一(yi)塊工(gong)作。數據(ju)喂(wei)進(jin)來(lai)以(yi)后(hou),經(jing)過(guo)深(shen)(shen)度(du)訓練、視頻截幀,發現其(qi)中的(de)(de)關(guan)系,比(bi)如判斷圖片是(shi)(shi)不(bu)(bu)是(shi)(shi)暴力(li)的(de)(de)、恐怖(bu)的(de)(de),再重新把數據(ju)放在結構化存儲里(li)。然后(hou)反過(guo)來(lai)做一(yi)個(ge)迭代(dai)。做一(yi)個(ge)基礎模型(xing),內容分(fen)發,重新進(jin)入系統做一(yi)個(ge)循環。在這(zhe)個(ge)循環的(de)(de)不(bu)(bu)停(ting)迭代(dai)中,不(bu)(bu)停(ting)改變訓練的(de)(de)精度(du),輸出(chu)一(yi)個(ge)最終想(xiang)(xiang)要的(de)(de)結果。這(zhe)大體上(shang)現在 AVA 平臺想(xiang)(xiang)做的(de)(de)事情,它的(de)(de)背景就是(shi)(shi)從傳統的(de)(de)內容服務,慢(man)慢(man)過(guo)渡到(dao)數據(ju)挖(wa)掘,這(zhe)部分(fen)就是(shi)(shi)通過(guo)七牛(niu)云深(shen)(shen)度(du)訓練平臺來(lai)實現的(de)(de)。
七牛云 AVA 平臺的概貌
上面一層是七牛云 AI 實驗室主打的方向,是對外部可見的業務層,大部分的業務都是圍繞圖像、視頻定制化,包括鑒黃產品、目標檢(jian)測等。因為(wei)網絡上充斥的(de)(de)(de)黃(huang)(huang)色(se)圖(tu)片(pian)(pian)太多,很多客(ke)戶每天有幾千萬張(zhang)甚至上億張(zhang)圖(tu)片(pian)(pian)存到七牛云。根(gen)據國家(jia)的(de)(de)(de)法(fa)規,這(zhe)(zhe)些(xie)圖(tu)片(pian)(pian)可能(neng)會有相當(dang)一部(bu)分是(shi)不(bu)(bu)適(shi)宜在(zai)網上出(chu)(chu)現的(de)(de)(de)。但有時候客(ke)戶也不(bu)(bu)知道,不(bu)(bu)可能(neng)靠人把(ba)(ba)這(zhe)(zhe)些(xie)圖(tu)搜出(chu)(chu)來,我們怎么把(ba)(ba)這(zhe)(zhe)樣的(de)(de)(de)圖(tu)片(pian)(pian)拎出(chu)(chu)來?這(zhe)(zhe)就需(xu)要做一個自動化處理(li)(li),把(ba)(ba)圖(tu)片(pian)(pian)自動識別。在(zai)七牛云這(zhe)(zhe)端,把(ba)(ba)圖(tu)片(pian)(pian)清(qing)理(li)(li)掉,網站(zhan)就不(bu)(bu)會把(ba)(ba)黃(huang)(huang)色(se)圖(tu)片(pian)(pian)或敏感圖(tu)片(pian)(pian)放出(chu)(chu)去。這(zhe)(zhe)是(shi)通過深(shen)度訓(xun)練平(ping)臺(tai),利用(yong)算法(fa)識別出(chu)(chu)不(bu)(bu)同的(de)(de)(de)模型,然后(hou)在(zai)毫秒(miao)級(ji)別把(ba)(ba)圖(tu)片(pian)(pian)識別出(chu)(chu)來。下面一層(ceng)提供(gong)基礎的(de)(de)(de)服務(wu)功能(neng),即 AVA 深(shen)度訓(xun)練平(ping)臺(tai)。
七牛云 AVA 平臺能為大家提供一些什么?
AVA 平臺(tai)(tai)最初是(shi)直接(jie)服務于算(suan)(suan)(suan)法(fa)(fa)工(gong)程師(shi)的(de)。通過引(yin)入 CEPH,屏蔽掉存(cun)儲(chu)管理(li)細(xi)節,引(yin)入 Kubernetes 屏蔽容器(qi)管理(li)細(xi)節,并把不(bu)同(tong)的(de)深(shen)度訓(xun)練框(kuang)架打(da)包到(dao) Docker 鏡(jing)像中,方(fang)便算(suan)(suan)(suan)法(fa)(fa)工(gong)程師(shi)使用(yong)(yong)。算(suan)(suan)(suan)法(fa)(fa)工(gong)程師(shi)可以聚焦(jiao)于算(suan)(suan)(suan)法(fa)(fa)本(ben)(ben)身(shen)的(de)設計,不(bu)用(yong)(yong)關心下面資源(yuan)(yuan)(yuan)如何提供的(de)。開始(shi)的(de)時候機器(qi)比(bi)較少,GPU 資源(yuan)(yuan)(yuan)有限,大(da)家使用(yong)(yong)方(fang)式(shi)基本(ben)(ben)是(shi)獨占模式(shi),直接(jie)面對存(cun)儲(chu)和 GPU 資源(yuan)(yuan)(yuan)。后來隨(sui)著業務量增(zeng)大(da),機器(qi)資源(yuan)(yuan)(yuan)增(zeng)多(duo),平臺(tai)(tai)的(de)靈活(huo)性和擴展性越發顯得重要。AVA 平臺(tai)(tai)重點從對資源(yuan)(yuan)(yuan)的(de)包裝到(dao)對資源(yuan)(yuan)(yuan)的(de)靈活(huo)調度轉(zhuan)變。算(suan)(suan)(suan)法(fa)(fa)人員已經解除對資源(yuan)(yuan)(yuan)的(de)直接(jie)依賴,一個簡單的(de)命令或 GUI 操作就能啟動訓(xun)練。除了針對算(suan)(suan)(suan)法(fa)(fa)人員,目前這(zhe)套系統(tong)也開始(shi)提供給外部(bu)用(yong)(yong)戶使用(yong)(yong),首先會(hui)給高校(xiao)學生(sheng)提供一個免費嘗(chang)試(shi)深(shen)度訓(xun)練的(de)平臺(tai)(tai),后面將會(hui)具體介紹(shao)。
七牛云 AVA 平臺主要有哪些部分組成?
第一個部分是數據集管理。這(zhe)里講的(de)(de)數據(ju)(ju)集(ji)管理包含(han)幾(ji)個部分(fen)。第(di)(di)一(yi)是如(ru)何管理 P 級別的(de)(de)云上(shang)云下(xia)數據(ju)(ju),并能及時有效(xiao)地提(ti)供給(gei)深(shen)度訓(xun)練(lian)。第(di)(di)二是對數據(ju)(ju)進行(xing)(xing)加工(gong)處(chu)理,比(bi)如(ru)圖片(pian)裁剪,把(ba)數據(ju)(ju)打包成不同深(shen)度訓(xun)練(lian)框架所需的(de)(de)格式,自動掛載入深(shen)度訓(xun)練(lian)平臺進行(xing)(xing)訓(xun)練(lian)。還有一(yi)種是如(ru)何把(ba)訓(xun)練(lian)產生的(de)(de)結(jie)果(guo)自動回(hui)傳(chuan)。
第二就是標注。機器其實并不是一上來就能識別圖片,很多時候需要人工輔助它,即要人先教會它怎么做。在信息大爆炸的時代,每天進來、出去可能 60% 以上都是圖像、視頻,這不是現有模型倉庫里能準確識別出來的。AVA 平臺提供一套打標機制(LabelX),讓非專業或專業人士,通過標注手段,告訴平臺這些圖片到底是哪種類型,然后輸入到訓練算法進行模型迭代、更新,最后輸出標準模型。基于產生的模型,我們就可以通過推理來判斷新輸入的圖片是屬于什么分類了,比如黃色,暴恐的等。目前七(qi)牛云對(dui)黃圖識別的準確率(lv)已(yi)經(jing)達到 96% 以上(shang)。
同時,深度訓練是平臺比較重頭的一塊,包括對 GPU 資源的管理、存儲資源的管理、訓練管理, Quota 管理、以及跟深度訓練相關的聯合調度。現在七牛云有(you)比(bi)(bi)較好(hao)的(de)調度(du)(du)(du)系統,比(bi)(bi)如(ru)(ru) Kubernetes,但當真正使用(yong)的(de)時候,發現 Kubernetes 能(neng)做(zuo)的(de)非(fei)常有(you)限,調度(du)(du)(du)管理(li)粒(li)度(du)(du)(du)比(bi)(bi)較粗,只(zhi)能(neng)調度(du)(du)(du)到(dao)容器的(de)級(ji)別。做(zuo)到(dao)容器級(ji)別,可部(bu)分解(jie)決資源(yuan)共享問題,比(bi)(bi)如(ru)(ru) 100 臺 GPU,可以(yi)全部(bu)用(yong)起來。但如(ru)(ru)果(guo)有(you)成(cheng)千上(shang)萬(wan)的(de)并發訓練任(ren)務,Kubernetes 的(de)管理(li)就(jiu)有(you)點捉(zhuo)襟見肘了,比(bi)(bi)如(ru)(ru)不同(tong)機器的(de) GPU 怎(zen)(zen)么(me)聯合調度(du)(du)(du)、通信(xin)怎(zen)(zen)么(me)管、資源(yuan)怎(zen)(zen)么(me)分配更合理(li)等。七牛(niu)云現在要做(zuo)的(de)一件事,就(jiu)是在 Kubernetes 調度(du)(du)(du)之(zhi)上(shang),細化對 GPU、CPU 的(de)管理(li),引入 RDMA 的(de)技術,把(ba)資源(yuan)管理(li)、通信(xin)和調度(du)(du)(du)做(zuo)深,做(zuo)細,達到(dao)更好(hao)的(de)資源(yuan)共享和使用(yong)。
最后一個部分,是評估推理。前期的(de)訓練做了大量準備(bei)工作,準備(bei)好了評估模型(xing)(xing)。推理評估要(yao)做的(de)就比較(jiao)簡單,是把新的(de)少量圖片加上(shang)模型(xing)(xing)再(zai)訓練一次,在毫秒級別能夠得(de)出結果(guo)。這一部(bu)分大都與業務結合比較(jiao)緊密(mi)。
AVA 平臺的技術架構是怎樣的?
下圖顯示的是 AVA 平臺的技術架構,主要分為三層。最下面一層屬于硬件和資源管理層,我們現在基本不會買單臺 GPU 做訓練,一般我們都是做一個集群,這一塊交給 Kubernetes 就可以了。最上面一層是業務系統,包括模型、推理、標注和(he)各個不同的(de)訓(xun)練(lian)系統(tong),七牛(niu)云 AI 實驗室業(ye)務大部分業(ye)務都在這(zhe)層。中(zhong)間這(zhe)層是 AVA 平(ping)臺(tai)重點(dian)要發力(li)的(de)地方,也是我們現(xian)在重點(dian)在做的(de)。
這層有三個部分:
第一部分是存儲系統。這一部分的核心是如何把大量的數據管起來。較早我們的數據是直接搭在 CEPH 上使用,但數據量一旦達到幾十 T 的規模,問題就開始顯現了。舉個例子,一個視頻訓練有幾十 T 容量,包含十多億張文件,存在 CEPH PVC 上,有一天突然發現數據讀不了了,找了半天才發現是文件系統 inode 用完了。另外一個例子是,當 PVC 空間滿了之后,新的數據進不來,老的數據不知道哪些該刪,很被動。七牛云現在的(de)一個策(ce)略,就是(shi)不(bu)再基(ji)于 CEPH 做(zuo)訓練(lian),而是(shi)基(ji)于云做(zuo)訓練(lian),CEPH 可(ke)以(yi)做(zuo)中(zhong)間緩存。目(mu)前中(zhong)等規模(mo)的(de)訓練(lian)已經(jing)完全跑通,對(dui)于 IO 吞吐要(yao)求不(bu)是(shi)特別高(gao)的(de)訓練(lian),和在 CEPH 上訓練(lian)沒(mei)有顯著差(cha)別。目(mu)前 AVA 是(shi)通過 Alluxio 把本地(di)訓練(lian)和云上的(de)數據對(dui)接起來。
第二是數據管理。所有數(shu)據(ju)都(dou)來源于互聯網,開始都(dou)是(shi)存在對(dui)象存儲中。AVA 剛做的(de)時候,必(bi)(bi)須把數(shu)據(ju)拉(la)(la)到(dao)(dao)本地來才能訓(xun)練(lian)。標準用(yong)法是(shi),用(yong)戶提供一(yi)(yi)個(ge) json 文(wen)件,里(li)面每(mei)行是(shi)七牛對(dui)象存儲的(de) URL,AVA 會(hui)把 json 中每(mei)個(ge)文(wen)件都(dou)下載,放(fang)到(dao)(dao)一(yi)(yi)個(ge) PVC 中并掛載到(dao)(dao) Kubernetes 的(de) Pod 中進(jin)(jin)行訓(xun)練(lian)。在存放(fang)到(dao)(dao) PVC 之前,還會(hui)調(diao)用(yong)七牛的(de)圖像(xiang)處理系統 Dora 對(dui)數(shu)據(ju)進(jin)(jin)行一(yi)(yi)些必(bi)(bi)要的(de)操作如旋轉,裁剪等。在現實使(shi)用(yong)中,大家(jia)會(hui)不(bu)停地調(diao)整數(shu)據(ju)內容并進(jin)(jin)行迭代訓(xun)練(lian),每(mei)次調(diao)整都(dou)重新把數(shu)據(ju)拉(la)(la)取一(yi)(yi)遍將是(shi)很繁瑣的(de)事情。現在我們(men)的(de)做法,一(yi)(yi)個(ge)是(shi)直(zhi)接(jie)在云(yun)上訓(xun)練(lian),這樣(yang)對(dui)數(shu)據(ju)的(de)改動直(zhi)接(jie)反(fan)饋到(dao)(dao)云(yun)端,另外(wai)一(yi)(yi)個(ge)是(shi)引(yin)入(ru)結構化(hua)存儲,把數(shu)據(ju)和元數(shu)據(ju)信(xin)息存放(fang)到(dao)(dao) Mongo 中,并通(tong)過打快照的(de)方(fang)式,方(fang)便靈活的(de)選擇不(bu)同版(ban)本數(shu)據(ju)進(jin)(jin)行訓(xun)練(lian)。
第三是調度管理系統。在七牛內部,現有比較成熟的框架比如 Caffe、MXNet、Pytorch、TensorFlow 等都在使用。最初是直接使用,后來遷移到七牛容器云,由 Kubernetes 提供調度,這樣的調度還是比較簡單的。比如, Kubernetes 現在的調度策略是,選中了 GPU 機器后,對 GPU 卡是隨機選擇。但是,一臺機器上的兩張 GPU 卡,處于不同拓撲連接方式,性能相差非常大。比如 QPI 連接帶寬可能是 3GB,而 P2P 模式可能達到 12GB。AVA 通過檢查 GPU 的 Affinity 模式,改寫 Kubernetes 的 scheduler,避免選擇處于不同 CPU 通道上的 GPU 卡。還有,現有的調度策略是讓所有 GPU 機器卡使用比較均衡,但如果一個訓練需要使用 8 張卡,系統中卡總數滿足,可能沒有一臺機器可以提供完整的 8 張卡,AVA 通過定制策略,提供特殊的 scheduler,可以選擇優先把 Pod 調度到部分分配的 GPU 機器上。對于分布式訓練,七牛云調研過 Tensorflow、MXNet 等,最終選擇 MXNet ps-lite 作為基礎。MXNet 可以做分布式訓練,但只能把任務調到機器里,調過去 GPU 怎么共享、使用,依然有很多東西可以優化。后續七牛(niu)云會基于 MXNet 的 PS-LITE 框架,把分布式調度往深里做,滿足深度訓練的需要。七牛(niu)云也正在引進 RDMA 機(ji)(ji)制,通(tong)過(guo) RDMA 機(ji)(ji)制把(ba) GPU 跟 GPU 之(zhi)間聯系打(da)通(tong),提升運行的性能。
對海量數據,七(qi)牛云(yun)怎么管?
之前數(shu)(shu)據管理(li)的(de)現狀是(shi):大部(bu)分的(de)數(shu)(shu)據會(hui)存(cun)放在(zai)對(dui)象存(cun)儲中(zhong),做訓(xun)練的(de)時候(hou),會(hui)把數(shu)(shu)據拉到本(ben)地(di)(di)來。所謂本(ben)地(di)(di),一(yi)般指本(ben)地(di)(di)的(de)一(yi)個(ge)集(ji)群或本(ben)地(di)(di)一(yi)臺(tai)機器,一(yi)般玩法,都(dou)是(shi)搭(da)一(yi)個(ge)本(ben)地(di)(di) CEPH 集(ji)群,通過 Kubernetes 調度,把 PVC 掛上去(qu),然(ran)后訓(xun)練數(shu)(shu)據從對(dui)象存(cun)儲導到這里,可(ke)以(yi)在(zai)里面跑(pao)訓(xun)練,跑(pao)一(yi)兩個(ge)月或是(shi)一(yi)兩天都(dou)可(ke)以(yi)。這樣做的(de)問題是(shi)用(yong)戶(hu)數(shu)(shu)據不(bu)能(neng)(neng)共(gong)享,大家如果(guo)用(yong)過 CEPH 就知道,CEPH RBD 在(zai) Kubernetes 中(zhong)不(bu)能(neng)(neng)共(gong)享讀寫(xie),CEPH FS 可(ke)以(yi),但性能(neng)(neng)有點差(cha)距。還有,CEPH 提供的(de)存(cun)儲空(kong)間對(dui)于深度訓(xun)練的(de)數(shu)(shu)據量來說(shuo)是(shi)杯水車薪。
去年七(qi)牛云搭了(le)一(yi)(yi)(yi)(yi)個(ge) 100T 的集(ji)群,在真正(zheng)用的時(shi)候感覺還是(shi)(shi)比較吃(chi)力,會碰到各種問題。一(yi)(yi)(yi)(yi)個(ge)訓(xun)練,就可能(neng)有(you)幾(ji)十 T,把 CEPH 會一(yi)(yi)(yi)(yi)下子撐爆。這只是(shi)(shi)七牛內(nei)部(bu)一(yi)(yi)(yi)(yi)個(ge)正(zheng)常的訓(xun)練,算上對(dui)外(wai)開放(fang)的用戶,還有(you)內(nei)部(bu)上百號人(ren)同(tong)時(shi)使用,這個(ge)集(ji)群明顯(xian)不能(neng)滿足(zu)要求。
視頻(pin)數據一下占(zhan)幾(ji)十 T,其他人沒(mei)(mei)(mei)法(fa)玩了,這(zhe)是比較頭痛的(de)一個問(wen)題。運(yun)維(wei)空間不(bu)(bu)夠,可以(yi)加(jia)盤(pan),加(jia)了幾(ji)次以(yi)后(hou)就(jiu)沒(mei)(mei)(mei)法(fa)加(jia)了,或(huo)者盤(pan)位沒(mei)(mei)(mei)了,然后(hou)再加(jia)機器,形成(cheng)惡性循環。幾(ji)十T的(de)數據可能前面半個月用了一半數據就(jiu)不(bu)(bu)用了,這(zhe)個時候其實放在(zai)云(yun)上對象(xiang)存儲里就(jiu)可以(yi)了。但剛開始沒(mei)(mei)(mei)有這(zhe)個機制,大部(bu)分的(de)數據都躺著(zhu)“睡覺”,而其他人又沒(mei)(mei)(mei)有空間可用
對 GPU 也是類似,如果一個集群中的 GPU 不能充分利用,到最后會發現運維就是不停加盤、加機器,用戶不停倒數據。這過程還會影響帶寬,陷入惡性循環。怎么破這個問題?這是七牛(niu)云 AVA 要解決的(de)問(wen)題,AVA 首先要解決痛(tong)點問(wen)題,然后(hou)才解決好用的(de)問(wen)題。
存儲問題怎么解決?
七牛云引入了一個 Alluxio 的特性。對七牛云來講不只是單純把一個開源系統引進,七牛云還會做(zuo)優化、定(ding)制化,后期也(ye)(ye)會開源出去。Alluxio 這(zhe)(zhe)個(ge)系(xi)統(tong)現在(zai)相(xiang)對比較成熟(shu)了,支持的廠家也(ye)(ye)很(hen)多,微軟(ruan)、百度(du)、京東都(dou)用了這(zhe)(zhe)個(ge)系(xi)統(tong),這(zhe)(zhe)個(ge)系(xi)統(tong)還算成熟(shu)。將來大(da)家的數據可以直(zhi)接(jie)放到七牛(niu)云存儲上,直(zhi)接(jie)利用 AVA 平臺做(zuo)訓(xun)練,當然其中也(ye)(ye)會有些優化、定(ding)制。
為什么選 Alluxio?它有以下幾個特性:
第一,支持多對象存儲,海量空間。對七牛云來講(jiang),CEPH 按(an)百 T 級別,運維(wei)就(jiu)很難做了。但對對象存儲來講(jiang),上 P 都(dou)不是問(wen)題,可能稍微慢一點,但數據放在這(zhe)里(li),總歸可以做訓(xun)練,雖然有時候會慢,但通過(guo)其他(ta)的手(shou)段(duan)解決(jue),至少先把空(kong)間(jian)問(wen)題解決(jue)了。
第二,統一命名空間。通(tong)過(guo) Alluxio 做,就(jiu)是(shi)一個大系統,做訓練的時候,數據(ju)放到任何地方(fang)照樣可以把(ba)數據(ju)拉過(guo)來,導入七牛云的深度(du)訓練平臺(tai),訓練完以后把(ba)結(jie)果再導回原來的地方(fang)。
第三,內存分布式文件系統。比如一百臺機器,每個機器貢獻幾百 G 內存形成幾個 T 的內存系統,可以把數據放在里面,后續所有訓練都是從內存讀取,不會從云上讀取,這是非常好的一個好處。在實際訓練中,七牛(niu)云經常(chang)用到這個(ge)內存(cun)文(wen)件系統的特性(xing)。
第四,Multiple tier 緩存系統。內存可能是幾個 T 的級別,現在七(qi)牛云(yun)本身訓練數據已經到了 P 級別,加上后續平臺開放出去,可能要到 E 級別,T 級別的內存系統對 E 級別的云上數據肯定不可用,這里就可以做一個多層的緩存系統,內存放不下了可以放在本地的硬盤。這一塊可以不落 CEPH 空間,因為 CEPH 空間可能還要再走一次網絡,速度會受影響,七(qi)牛(niu)云(yun)可以直接落到(dao)本地緩存系統。
Alluxio 在七牛的應用
首先為了考慮穩定性,七牛云(yun)會搭兩套集群。
一個(ge)是(shi)(shi)只讀(du) Alluxio 集(ji)群(qun),會分(fen)配(pei)大(da)(da)量(liang)的(de)(de)(de) RAM,還有基于(yu) SSD 裸盤作二(er)級緩存(cun),大(da)(da)部分(fen)的(de)(de)(de)云(yun)上(shang)訓練數(shu)據,可以落(luo)(luo)到這里(li)。平(ping)時(shi)不繁忙的(de)(de)(de)時(shi)候(hou),數(shu)據可以完全(quan)落(luo)(luo)在 RAM 空間里(li)。另外一個(ge)是(shi)(shi) Alluxio 寫(xie)集(ji)群(qun),可以把訓練過程(cheng)產生的(de)(de)(de)模型(xing)、log、qw、h 新(xin)文件等寫(xie)入它,并通過同步(bu)或異步(bu)方式傳回云(yun)上(shang)。寫(xie)集(ji)群(qun)對接(jie)的(de)(de)(de)不是(shi)(shi) SSD 裸盤,而是(shi)(shi) CEPH 集(ji)群(qun)。為什么考慮 CEPH?因為可以保證機器故障的(de)(de)(de)時(shi)候(hou),數(shu)據不會丟。寫(xie)集(ji)群(qun)分(fen)配(pei)的(de)(de)(de) RAM 容量(liang)較少,數(shu)據寫(xie)入的(de)(de)(de)時(shi)候(hou)直接(jie)落(luo)(luo)入 CEPH,再次訪(fang)問的(de)(de)(de)時(shi)候(hou)才(cai)提升(sheng)到 RAM 中。大(da)(da)部分(fen)的(de)(de)(de)加速(su)(su)會在 Alluxio 讀(du)緩存(cun)集(ji)群(qun), Alluxio 寫(xie)集(ji)群(qun)也(ye)有加速(su)(su)功能,但不是(shi)(shi)主要(yao)的(de)(de)(de)。
再上面對接的是 FUSE Adapter。這是基于 Kubernetes 的 Flex Volume 做的,可以把云上數據通過 Alluxio 直接導到訓練平臺。采用 Adapter 是為了安全原因,再通過 FUSE 就可以把數據掛進來。比如每個用戶在七牛云 AVA 平臺訓練的時候,把 bucket 直接掛進來就行了,之后七(qi)牛(niu)云會自(zi)動把數(shu)據緩(huan)存(cun)到(dao)本(ben)地(di)的(de)系(xi)(xi)統(tong)(tong),后續所有(you)讀(du)(du)寫訓(xun)練(lian)都走(zou)本(ben)地(di)系(xi)(xi)統(tong)(tong)。從使(shi)用者角(jiao)度(du)(du)來(lai)看(kan),相當(dang)于在(zai)本(ben)地(di)系(xi)(xi)統(tong)(tong)里做(zuo)訓(xun)練(lian)。通過這種方式,很大程度(du)(du)上簡化了(le)用戶(hu)的(de)使(shi)用。 AVA 把外面(mian)的(de)這些東西(xi)都掩(yan)蓋(gai)了(le),用戶(hu)做(zuo)訓(xun)練(lian)的(de)時(shi)候,根本(ben)看(kan)不(bu)到(dao)自(zi)己的(de) bucket,只看(kan)到(dao)自(zi)己的(de)目錄,當(dang)做(zuo)本(ben)地(di)目錄直接讀(du)(du)寫就行(xing)了(le)。 ??
數(shu)據讀寫流程約為:
訓練(lian)開始的(de)(de)時候,可以(yi)對(dui)數(shu)(shu)據(ju)(ju)預(yu)熱,讀取(qu)到(dao)本地 Alluxio 集(ji)群(qun)緩存起來,大部(bu)分框架都(dou)有這(zhe)樣的(de)(de)預(yu)取(qu)功能。或者(zhe)不做預(yu)熱,這(zhe)樣訓練(lian)速(su)度可能受(shou)損(sun),但(dan)訓練(lian)完(wan)全沒有問題。RAM 充滿(man)以(yi)后,會把(ba)(ba)數(shu)(shu)據(ju)(ju)下沉到(dao)下一層的(de)(de) SSD 盤。通過(guo) FUSE 系(xi)統,訓練(lian)所在(zai)的(de)(de) POD 可以(yi)直接讀取(qu) Alluxio 的(de)(de)數(shu)(shu)據(ju)(ju),就像讀取(qu)本地文件(jian)系(xi)統文件(jian)一樣。讀取(qu)的(de)(de)其實不是云上(shang)的(de)(de)內容(rong),內容(rong)已(yi)經存在(zai)集(ji)群(qun)內部(bu)了(le)。這(zhe)個集(ji)群(qun)容(rong)量(liang)完(wan)全可以(yi)替代原(yuan)來的(de)(de) CEPH 集(ji)群(qun),另外的(de)(de)好處(chu)是數(shu)(shu)據(ju)(ju)不用的(de)(de)時候可以(yi)自動剔掉,大部(bu)分在(zai)使用的(de)(de)數(shu)(shu)據(ju)(ju),在(zai)這(zhe)個集(ji)群(qun)里都(dou)可以(yi)找得到(dao),相當(dang)于把(ba)(ba)加速(su)性能發揮到(dao)了(le)極(ji)致。
而對寫也是一樣,但寫七牛云有(you)個(ge)不一樣(yang)的(de)地方(fang)。為了保(bao)證(zheng)數(shu)據(ju)(ju)安全(quan),寫(xie)的(de)話可以直接穿過(guo) RAM 寫(xie)入(ru) CEPH,最終(zhong) RAM 或 CEPH 空間到(dao)達高水(shui)位了,可以自動(dong)把寫(xie)入(ru)數(shu)據(ju)(ju)推到(dao)云上。訓練(lian)完以后,異步的(de)把一些干凈數(shu)據(ju)(ju)淘汰,臟數(shu)據(ju)(ju)送回云上。
七牛云通過(guo)這(zhe)(zhe)個(ge)流程(cheng),把(ba)海量(liang)數據(ju)(ju)管理(li)起來。用了這(zhe)(zhe)套系統(tong)(tong)后,大家(jia)就(jiu)不需要(yao)頻繁(fan)倒數據(ju)(ju)了,因為系統(tong)(tong)就(jiu)可以自(zi)動把(ba)冷數據(ju)(ju)踢(ti)掉,也不會(hui)存在空間(jian)不夠(gou)的問題了。以前用 CEPH 的時候盤很(hen)快(kuai)會(hui)滿,很(hen)多工程(cheng)師不知道哪(na)些(xie)(xie)數據(ju)(ju)該丟哪(na)些(xie)(xie)該留,現在不需要(yao)考慮這(zhe)(zhe)些(xie)(xie)問題了。AVA 會(hui)自(zi)動把(ba)冷數據(ju)(ju)踢(ti)掉,自(zi)動把(ba)臟數據(ju)(ju)上傳云(yun)。
計算資源管理
七牛云剛開始對 GPU 的使用還是比較原始的。比如通過 Kubernetes 啟動 Pod 綁定 GPU,綁定以后跑訓練,綁定以后,GPU 不能共享,而且 Pod 基本是停留在那,不釋放。正確的使用方式應該是做一個 GPU 的池子,訓練開始的時候分配、綁定 GPU,結束后馬上歸還,這是可以做到的。現在七牛云對計算資源的使用,也是遵循這個模式。七牛云采用了 workspace 和(he)訓練(lian)(lian)(lian)兩(liang)種(zhong)方(fang)式來管理使用計算資源。 Workspace 和(he)訓練(lian)(lian)(lian)共享(xiang)用戶的存儲。用戶通(tong)過workspace來編(bian)輯代碼,準備數據(ju)并做簡單的編(bian)譯(yi)、調試。一切準備就緒后(hou),從(cong) AVA 平臺啟動訓練(lian)(lian)(lian)實例,綁定 GPU,訓練(lian)(lian)(lian)結束后(hou),歸(gui)還 GPU 到池(chi)子里,后(hou)面的訓練(lian)(lian)(lian)可循環使用。
現在所有的新用戶不能直接看到 GPU,具體訓練的時候他不知道用的是哪幾個 GPU,放在哪里。較早的時候大家占住幾個 GPU 一直使用,不釋放,別人沒法共享。現在七牛云把它做成一個池子, GPU 就完全可以流轉起來。以后的目標,就是用少數的 GPU 可以做大量的訓練。目前,七牛云(yun)正在加一(yi)些新的特性,比如加 quota,分(fen)組機制(zhi),這(zhe)樣可(ke)以避免少數人無(wu)限制(zhi)地霸(ba)占 GPU。
如何解決使用 GPU 存在問題?
如何解決使用 GPU 存在問題,典型的問題是:GPU 的調度問題。
Kubernetes 的(de)調(diao)(diao)度策(ce)略是(shi)比(bi)較簡單的(de),先通(tong)過 predicate 檢查(cha),再通(tong)過 priority 檢查(cha),然后(hou)由 Kubelet 具體分配綁(bang)定資(zi)源。假如有(you)兩臺(tai)(tai) GPU 機(ji)(ji)器(qi),每(mei)(mei)臺(tai)(tai) 8 張(zhang)卡(ka)(ka),第一(yi)臺(tai)(tai)已經分配出去 2 張(zhang)卡(ka)(ka)了(le),再次申請 2 張(zhang)卡(ka)(ka)的(de)時候,Kubernetes 很(hen)可能(neng)會調(diao)(diao)度到第二(er)(er)臺(tai)(tai)機(ji)(ji)器(qi)上(shang),這樣每(mei)(mei)臺(tai)(tai)機(ji)(ji)器(qi)都使(shi)用(yong)了(le) 2 張(zhang)卡(ka)(ka)。如果這時有(you)個訓(xun)練要(yao)求使(shi)用(yong)同(tong)一(yi)臺(tai)(tai)機(ji)(ji)器(qi)上(shang)的(de) 8 張(zhang)卡(ka)(ka)訓(xun)練,調(diao)(diao)度將失敗。這個時候需要(yao)把調(diao)(diao)度改(gai)掉,第二(er)(er)次分配在選(xuan)(xuan)(xuan)(xuan)擇(ze)第一(yi)臺(tai)(tai)機(ji)(ji)器(qi)的(de) GPU,第二(er)(er)臺(tai)(tai)機(ji)(ji)器(qi)的(de) 8 張(zhang)卡(ka)(ka)可以(yi)完整留(liu)下來。通(tong)過不(bu)同(tong)策(ce)略就可以(yi)滿足不(bu)同(tong)的(de)需求。還有(you),假設是(shi)單臺(tai)(tai)機(ji)(ji)器(qi)上(shang)選(xuan)(xuan)(xuan)(xuan)擇(ze)兩張(zhang) GPU 訓(xun)練,如果選(xuan)(xuan)(xuan)(xuan) GPU1 和(he) GPU3,它(ta)(ta)們(men)屬于不(bu)同(tong) CPU,通(tong)過 QPI 鏈接,它(ta)(ta)們(men)之(zhi)間帶(dai)(dai)寬(kuan)可能(neng)只(zhi)有(you)是(shi) 3 個 GB 每(mei)(mei)秒(miao)。如果選(xuan)(xuan)(xuan)(xuan)擇(ze) GPU0 和(he) GPU1,它(ta)(ta)們(men)之(zhi)間屬于同(tong)一(yi)個 CPU,那么帶(dai)(dai)寬(kuan)可能(neng)達(da)到 12G 每(mei)(mei)秒(miao)。調(diao)(diao)度的(de)時候盡量(liang)要(yao)選(xuan)(xuan)(xuan)(xuan)擇(ze) GPU0 和(he) GPU1 在一(yi)起。
實測中,七牛(niu)云也(ye)發現(xian),比如內存和 CPU 有一定限制的(de)情況下(xia),通過不(bu)同的(de) GPU 分配方(fang)式跑的(de)訓練時間差異(yi)非常大,最多性能差距達到1倍以上。將(jiang)來(lai)一旦(dan)擴(kuo)大到整個(ge)集群,差別會更大。所以 GPU 的(de)調度模式對訓練影響(xiang)會非常大。
AVA 平臺的展望
原來七牛云內部從業務角度出發,也做了一個分布式的訓練系統 ESPP,用于圖像和視頻訓練,其中也用到了 Kubernetes 和一些訓練框架,但是針對于特定業務系統的。現在七牛云準備把原來的(de)(de)業務(wu)系統都(dou)收編到 AVA 平臺(tai)。 RDMA 這一塊也(ye)是要重點考慮的(de)(de),正在跟廠家做一些溝通交流,馬上就(jiu)要布(bu)上去(qu),加上分布(bu)式調度系統,以(yi)后訓練(lian)會比現在快很(hen)多。
雖然說現在 AVA 有了分布式的調度機制和 RDMA 機制,但從算法模型的生產角度講,還處在一個手工階段,大家還是通過手工方式不停的調整參數,然后不停的跑訓練,以期調試出一個滿意的模型。目前 Google 已經通過 AutoML 的方式自動能產生出很好的模型,七牛云還有很多路要走。七牛云正在和(he)算法團(tuan)隊一起研究,如果讓模型訓練變得更(geng)高效(xiao),更(geng)自(zi)動化(hua),更(geng)智能化(hua)。
總結
這套 AVA 系統,不僅七牛云內部使用,現在已經推廣給高校學生免費使用。第一步(bu)已經準備了幾十張 GPU 卡和常用的訓練框架,登(deng)陸到平臺(tai)后就(jiu)可直(zhi)接使用。高(gao)校學生(sheng)遵循下面幾個(ge)步(bu)驟(zou)就(jiu)可以非常方便的使用 AVA 平臺(tai):