杭州2018年7月11日電 /美通社/ -- 5月26 日下午,在第二十八期七牛云架構(gòu)師實(shí)踐日,李朝光進(jìn)行了題為《深度學(xué)習(xí)平臺(tái) AVA 及海量資源管理》的實(shí)戰(zhàn)分享。本文是對(duì)演講內(nèi)容的整理。
七牛云在深度訓(xùn)練平臺(tái)里如何管理數(shù)據(jù)以及 GPU ?
深度訓(xùn)練平臺(tái)有兩個(gè)核心,一個(gè)是數(shù)據(jù)管理,一個(gè)是計(jì)算資源管理。首先提數(shù)據(jù)管理的原因是,從傳統(tǒng)意義上使用數(shù)據(jù)到深度訓(xùn)練訪問(wèn)數(shù)據(jù),會(huì)發(fā)現(xiàn)一個(gè)有趣的問(wèn)題:數(shù)據(jù)量已經(jīng)大到?jīng)]法管理的地步了。李朝光表示,“比如以往,我們用網(wǎng)盤或搭一個(gè) CEPH,數(shù)據(jù)一般都是少數(shù)幾個(gè) T 的級(jí)別,但等到真正運(yùn)作深度訓(xùn)練的時(shí)候,會(huì)發(fā)現(xiàn)跑一個(gè)訓(xùn)練,比如圖像分類或視頻檢索訓(xùn)練,就能消耗幾十個(gè) T 的空間。怎么有效把這些數(shù)據(jù)喂到深度訓(xùn)練里?七牛云 AVA 平臺(tái)的誕生就是要想辦法解決這個(gè)問(wèn)題。”
第二是計(jì)算資源的管理。這里的計(jì)算資源,基本指 GPU,一般來(lái)說(shuō)是 NVIDIA 的 GPU。七牛云實(shí)驗(yàn)室里,現(xiàn)在已經(jīng)有百臺(tái)級(jí)別的 GPU,里面有各種型號(hào),比如 M4、K80,到 P100、V100 都有。這些資源怎么有效地管理、使用,是個(gè)難題。七牛云開(kāi)始是用非常原始的方式,比如搶占方式,后來(lái)再慢慢把資源管理模塊化、精細(xì)化,最后才做到 AVA 這個(gè)平臺(tái)。
七牛云目前圍繞的是數(shù)據(jù)創(chuàng)新服務(wù)。但七牛云是做存儲(chǔ)起步的,開(kāi)始是集中在海量(對(duì)象)存儲(chǔ),后面進(jìn)入了機(jī)器學(xué)習(xí)、智能多媒體服務(wù),這些的共用特點(diǎn)是對(duì)數(shù)據(jù)本身的存儲(chǔ)管理,比如對(duì)象存儲(chǔ)。怎么把這么多數(shù)據(jù)存儲(chǔ)起來(lái)?怎么高效地把它放在 CDN 里,快速地進(jìn)行轉(zhuǎn)發(fā)?目前七牛云已經(jīng)基本實(shí)現(xiàn)了第一步:把數(shù)據(jù)有效地管理起來(lái)。第二步,怎么發(fā)現(xiàn)數(shù)據(jù)之間的關(guān)系?如何根據(jù)數(shù)據(jù)內(nèi)容做創(chuàng)新?比如一個(gè)視頻有幾千幀,幀和幀之間有什么關(guān)系?一個(gè)圖片,是否屬于黃色或暴恐的?七牛云重點(diǎn)做圖片、視頻的檢索、分類,還有人臉識(shí)別等。
一個(gè)圖片過(guò)來(lái),不能直接喂到七牛云深度訓(xùn)練系統(tǒng)里,第一步就要做數(shù)據(jù)處理。之前七牛云有個(gè) DORA 系統(tǒng),是做圖片視頻處理的,比如裁減翻轉(zhuǎn)、加水印等。這樣可以把數(shù)據(jù)轉(zhuǎn)換成深度訓(xùn)練需要的格式,然后喂到深度訓(xùn)練系統(tǒng)里,這是目前正在做的一塊工作。數(shù)據(jù)喂進(jìn)來(lái)以后,經(jīng)過(guò)深度訓(xùn)練、視頻截幀,發(fā)現(xiàn)其中的關(guān)系,比如判斷圖片是不是暴力的、恐怖的,再重新把數(shù)據(jù)放在結(jié)構(gòu)化存儲(chǔ)里。然后反過(guò)來(lái)做一個(gè)迭代。做一個(gè)基礎(chǔ)模型,內(nèi)容分發(fā),重新進(jìn)入系統(tǒng)做一個(gè)循環(huán)。在這個(gè)循環(huán)的不停迭代中,不停改變訓(xùn)練的精度,輸出一個(gè)最終想要的結(jié)果。這大體上現(xiàn)在 AVA 平臺(tái)想做的事情,它的背景就是從傳統(tǒng)的內(nèi)容服務(wù),慢慢過(guò)渡到數(shù)據(jù)挖掘,這部分就是通過(guò)七牛云深度訓(xùn)練平臺(tái)來(lái)實(shí)現(xiàn)的。
七牛云 AVA 平臺(tái)的概貌
上面一層是七牛云 AI 實(shí)驗(yàn)室主打的方向,是對(duì)外部可見(jiàn)的業(yè)務(wù)層,大部分的業(yè)務(wù)都是圍繞圖像、視頻定制化,包括鑒黃產(chǎn)品、目標(biāo)檢測(cè)等。因?yàn)榫W(wǎng)絡(luò)上充斥的黃色圖片太多,很多客戶每天有幾千萬(wàn)張甚至上億張圖片存到七牛云。根據(jù)國(guó)家的法規(guī),這些圖片可能會(huì)有相當(dāng)一部分是不適宜在網(wǎng)上出現(xiàn)的。但有時(shí)候客戶也不知道,不可能靠人把這些圖搜出來(lái),我們?cè)趺窗堰@樣的圖片拎出來(lái)?這就需要做一個(gè)自動(dòng)化處理,把圖片自動(dòng)識(shí)別。在七牛云這端,把圖片清理掉,網(wǎng)站就不會(huì)把黃色圖片或敏感圖片放出去。這是通過(guò)深度訓(xùn)練平臺(tái),利用算法識(shí)別出不同的模型,然后在毫秒級(jí)別把圖片識(shí)別出來(lái)。下面一層提供基礎(chǔ)的服務(wù)功能,即 AVA 深度訓(xùn)練平臺(tái)。
七牛云 AVA 平臺(tái)能為大家提供一些什么?
AVA 平臺(tái)最初是直接服務(wù)于算法工程師的。通過(guò)引入 CEPH,屏蔽掉存儲(chǔ)管理細(xì)節(jié),引入 Kubernetes 屏蔽容器管理細(xì)節(jié),并把不同的深度訓(xùn)練框架打包到 Docker 鏡像中,方便算法工程師使用。算法工程師可以聚焦于算法本身的設(shè)計(jì),不用關(guān)心下面資源如何提供的。開(kāi)始的時(shí)候機(jī)器比較少,GPU 資源有限,大家使用方式基本是獨(dú)占模式,直接面對(duì)存儲(chǔ)和 GPU 資源。后來(lái)隨著業(yè)務(wù)量增大,機(jī)器資源增多,平臺(tái)的靈活性和擴(kuò)展性越發(fā)顯得重要。AVA 平臺(tái)重點(diǎn)從對(duì)資源的包裝到對(duì)資源的靈活調(diào)度轉(zhuǎn)變。算法人員已經(jīng)解除對(duì)資源的直接依賴,一個(gè)簡(jiǎn)單的命令或 GUI 操作就能啟動(dòng)訓(xùn)練。除了針對(duì)算法人員,目前這套系統(tǒng)也開(kāi)始提供給外部用戶使用,首先會(huì)給高校學(xué)生提供一個(gè)免費(fèi)嘗試深度訓(xùn)練的平臺(tái),后面將會(huì)具體介紹。
七牛云 AVA 平臺(tái)主要有哪些部分組成?
第一個(gè)部分是數(shù)據(jù)集管理。這里講的數(shù)據(jù)集管理包含幾個(gè)部分。第一是如何管理 P 級(jí)別的云上云下數(shù)據(jù),并能及時(shí)有效地提供給深度訓(xùn)練。第二是對(duì)數(shù)據(jù)進(jìn)行加工處理,比如圖片裁剪,把數(shù)據(jù)打包成不同深度訓(xùn)練框架所需的格式,自動(dòng)掛載入深度訓(xùn)練平臺(tái)進(jìn)行訓(xùn)練。還有一種是如何把訓(xùn)練產(chǎn)生的結(jié)果自動(dòng)回傳。
第二就是標(biāo)注。機(jī)器其實(shí)并不是一上來(lái)就能識(shí)別圖片,很多時(shí)候需要人工輔助它,即要人先教會(huì)它怎么做。在信息大爆炸的時(shí)代,每天進(jìn)來(lái)、出去可能 60% 以上都是圖像、視頻,這不是現(xiàn)有模型倉(cāng)庫(kù)里能準(zhǔn)確識(shí)別出來(lái)的。AVA 平臺(tái)提供一套打標(biāo)機(jī)制(LabelX),讓非專業(yè)或?qū)I(yè)人士,通過(guò)標(biāo)注手段,告訴平臺(tái)這些圖片到底是哪種類型,然后輸入到訓(xùn)練算法進(jìn)行模型迭代、更新,最后輸出標(biāo)準(zhǔn)模型?;诋a(chǎn)生的模型,我們就可以通過(guò)推理來(lái)判斷新輸入的圖片是屬于什么分類了,比如黃色,暴恐的等。目前七牛云對(duì)黃圖識(shí)別的準(zhǔn)確率已經(jīng)達(dá)到 96% 以上。
同時(shí),深度訓(xùn)練是平臺(tái)比較重頭的一塊,包括對(duì) GPU 資源的管理、存儲(chǔ)資源的管理、訓(xùn)練管理, Quota 管理、以及跟深度訓(xùn)練相關(guān)的聯(lián)合調(diào)度。現(xiàn)在七牛云有比較好的調(diào)度系統(tǒng),比如 Kubernetes,但當(dāng)真正使用的時(shí)候,發(fā)現(xiàn) Kubernetes 能做的非常有限,調(diào)度管理粒度比較粗,只能調(diào)度到容器的級(jí)別。做到容器級(jí)別,可部分解決資源共享問(wèn)題,比如 100 臺(tái) GPU,可以全部用起來(lái)。但如果有成千上萬(wàn)的并發(fā)訓(xùn)練任務(wù),Kubernetes 的管理就有點(diǎn)捉襟見(jiàn)肘了,比如不同機(jī)器的 GPU 怎么聯(lián)合調(diào)度、通信怎么管、資源怎么分配更合理等。七牛云現(xiàn)在要做的一件事,就是在 Kubernetes 調(diào)度之上,細(xì)化對(duì) GPU、CPU 的管理,引入 RDMA 的技術(shù),把資源管理、通信和調(diào)度做深,做細(xì),達(dá)到更好的資源共享和使用。
最后一個(gè)部分,是評(píng)估推理。前期的訓(xùn)練做了大量準(zhǔn)備工作,準(zhǔn)備好了評(píng)估模型。推理評(píng)估要做的就比較簡(jiǎn)單,是把新的少量圖片加上模型再訓(xùn)練一次,在毫秒級(jí)別能夠得出結(jié)果。這一部分大都與業(yè)務(wù)結(jié)合比較緊密。
AVA 平臺(tái)的技術(shù)架構(gòu)是怎樣的?
下圖顯示的是 AVA 平臺(tái)的技術(shù)架構(gòu),主要分為三層。最下面一層屬于硬件和資源管理層,我們現(xiàn)在基本不會(huì)買單臺(tái) GPU 做訓(xùn)練,一般我們都是做一個(gè)集群,這一塊交給 Kubernetes 就可以了。最上面一層是業(yè)務(wù)系統(tǒng),包括模型、推理、標(biāo)注和各個(gè)不同的訓(xùn)練系統(tǒng),七牛云 AI 實(shí)驗(yàn)室業(yè)務(wù)大部分業(yè)務(wù)都在這層。中間這層是 AVA 平臺(tái)重點(diǎn)要發(fā)力的地方,也是我們現(xiàn)在重點(diǎn)在做的。
這層有三個(gè)部分:
第一部分是存儲(chǔ)系統(tǒng)。這一部分的核心是如何把大量的數(shù)據(jù)管起來(lái)。較早我們的數(shù)據(jù)是直接搭在 CEPH 上使用,但數(shù)據(jù)量一旦達(dá)到幾十 T 的規(guī)模,問(wèn)題就開(kāi)始顯現(xiàn)了。舉個(gè)例子,一個(gè)視頻訓(xùn)練有幾十 T 容量,包含十多億張文件,存在 CEPH PVC 上,有一天突然發(fā)現(xiàn)數(shù)據(jù)讀不了了,找了半天才發(fā)現(xiàn)是文件系統(tǒng) inode 用完了。另外一個(gè)例子是,當(dāng) PVC 空間滿了之后,新的數(shù)據(jù)進(jìn)不來(lái),老的數(shù)據(jù)不知道哪些該刪,很被動(dòng)。七牛云現(xiàn)在的一個(gè)策略,就是不再基于 CEPH 做訓(xùn)練,而是基于云做訓(xùn)練,CEPH 可以做中間緩存。目前中等規(guī)模的訓(xùn)練已經(jīng)完全跑通,對(duì)于 IO 吞吐要求不是特別高的訓(xùn)練,和在 CEPH 上訓(xùn)練沒(méi)有顯著差別。目前 AVA 是通過(guò) Alluxio 把本地訓(xùn)練和云上的數(shù)據(jù)對(duì)接起來(lái)。
第二是數(shù)據(jù)管理。所有數(shù)據(jù)都來(lái)源于互聯(lián)網(wǎng),開(kāi)始都是存在對(duì)象存儲(chǔ)中。AVA 剛做的時(shí)候,必須把數(shù)據(jù)拉到本地來(lái)才能訓(xùn)練。標(biāo)準(zhǔn)用法是,用戶提供一個(gè) json 文件,里面每行是七牛對(duì)象存儲(chǔ)的 URL,AVA 會(huì)把 json 中每個(gè)文件都下載,放到一個(gè) PVC 中并掛載到 Kubernetes 的 Pod 中進(jìn)行訓(xùn)練。在存放到 PVC 之前,還會(huì)調(diào)用七牛的圖像處理系統(tǒng) Dora 對(duì)數(shù)據(jù)進(jìn)行一些必要的操作如旋轉(zhuǎn),裁剪等。在現(xiàn)實(shí)使用中,大家會(huì)不停地調(diào)整數(shù)據(jù)內(nèi)容并進(jìn)行迭代訓(xùn)練,每次調(diào)整都重新把數(shù)據(jù)拉取一遍將是很繁瑣的事情。現(xiàn)在我們的做法,一個(gè)是直接在云上訓(xùn)練,這樣對(duì)數(shù)據(jù)的改動(dòng)直接反饋到云端,另外一個(gè)是引入結(jié)構(gòu)化存儲(chǔ),把數(shù)據(jù)和元數(shù)據(jù)信息存放到 Mongo 中,并通過(guò)打快照的方式,方便靈活的選擇不同版本數(shù)據(jù)進(jìn)行訓(xùn)練。
第三是調(diào)度管理系統(tǒng)。在七牛內(nèi)部,現(xiàn)有比較成熟的框架比如 Caffe、MXNet、Pytorch、TensorFlow 等都在使用。最初是直接使用,后來(lái)遷移到七牛容器云,由 Kubernetes 提供調(diào)度,這樣的調(diào)度還是比較簡(jiǎn)單的。比如, Kubernetes 現(xiàn)在的調(diào)度策略是,選中了 GPU 機(jī)器后,對(duì) GPU 卡是隨機(jī)選擇。但是,一臺(tái)機(jī)器上的兩張 GPU 卡,處于不同拓?fù)溥B接方式,性能相差非常大。比如 QPI 連接帶寬可能是 3GB,而 P2P 模式可能達(dá)到 12GB。AVA 通過(guò)檢查 GPU 的 Affinity 模式,改寫(xiě) Kubernetes 的 scheduler,避免選擇處于不同 CPU 通道上的 GPU 卡。還有,現(xiàn)有的調(diào)度策略是讓所有 GPU 機(jī)器卡使用比較均衡,但如果一個(gè)訓(xùn)練需要使用 8 張卡,系統(tǒng)中卡總數(shù)滿足,可能沒(méi)有一臺(tái)機(jī)器可以提供完整的 8 張卡,AVA 通過(guò)定制策略,提供特殊的 scheduler,可以選擇優(yōu)先把 Pod 調(diào)度到部分分配的 GPU 機(jī)器上。對(duì)于分布式訓(xùn)練,七牛云調(diào)研過(guò) Tensorflow、MXNet 等,最終選擇 MXNet ps-lite 作為基礎(chǔ)。MXNet 可以做分布式訓(xùn)練,但只能把任務(wù)調(diào)到機(jī)器里,調(diào)過(guò)去 GPU 怎么共享、使用,依然有很多東西可以優(yōu)化。后續(xù)七牛云會(huì)基于 MXNet 的 PS-LITE 框架,把分布式調(diào)度往深里做,滿足深度訓(xùn)練的需要。七牛云也正在引進(jìn) RDMA 機(jī)制,通過(guò) RDMA 機(jī)制把 GPU 跟 GPU 之間聯(lián)系打通,提升運(yùn)行的性能。
對(duì)海量數(shù)據(jù),七牛云怎么管?
之前數(shù)據(jù)管理的現(xiàn)狀是:大部分的數(shù)據(jù)會(huì)存放在對(duì)象存儲(chǔ)中,做訓(xùn)練的時(shí)候,會(huì)把數(shù)據(jù)拉到本地來(lái)。所謂本地,一般指本地的一個(gè)集群或本地一臺(tái)機(jī)器,一般玩法,都是搭一個(gè)本地 CEPH 集群,通過(guò) Kubernetes 調(diào)度,把 PVC 掛上去,然后訓(xùn)練數(shù)據(jù)從對(duì)象存儲(chǔ)導(dǎo)到這里,可以在里面跑訓(xùn)練,跑一兩個(gè)月或是一兩天都可以。這樣做的問(wèn)題是用戶數(shù)據(jù)不能共享,大家如果用過(guò) CEPH 就知道,CEPH RBD 在 Kubernetes 中不能共享讀寫(xiě),CEPH FS 可以,但性能有點(diǎn)差距。還有,CEPH 提供的存儲(chǔ)空間對(duì)于深度訓(xùn)練的數(shù)據(jù)量來(lái)說(shuō)是杯水車薪。
去年七牛云搭了一個(gè) 100T 的集群,在真正用的時(shí)候感覺(jué)還是比較吃力,會(huì)碰到各種問(wèn)題。一個(gè)訓(xùn)練,就可能有幾十 T,把 CEPH 會(huì)一下子撐爆。這只是七牛內(nèi)部一個(gè)正常的訓(xùn)練,算上對(duì)外開(kāi)放的用戶,還有內(nèi)部上百號(hào)人同時(shí)使用,這個(gè)集群明顯不能滿足要求。
視頻數(shù)據(jù)一下占幾十 T,其他人沒(méi)法玩了,這是比較頭痛的一個(gè)問(wèn)題。運(yùn)維空間不夠,可以加盤,加了幾次以后就沒(méi)法加了,或者盤位沒(méi)了,然后再加機(jī)器,形成惡性循環(huán)。幾十T的數(shù)據(jù)可能前面半個(gè)月用了一半數(shù)據(jù)就不用了,這個(gè)時(shí)候其實(shí)放在云上對(duì)象存儲(chǔ)里就可以了。但剛開(kāi)始沒(méi)有這個(gè)機(jī)制,大部分的數(shù)據(jù)都躺著“睡覺(jué)”,而其他人又沒(méi)有空間可用
對(duì) GPU 也是類似,如果一個(gè)集群中的 GPU 不能充分利用,到最后會(huì)發(fā)現(xiàn)運(yùn)維就是不停加盤、加機(jī)器,用戶不停倒數(shù)據(jù)。這過(guò)程還會(huì)影響帶寬,陷入惡性循環(huán)。怎么破這個(gè)問(wèn)題?這是七牛云 AVA 要解決的問(wèn)題,AVA 首先要解決痛點(diǎn)問(wèn)題,然后才解決好用的問(wèn)題。
存儲(chǔ)問(wèn)題怎么解決?
七牛云引入了一個(gè) Alluxio 的特性。對(duì)七牛云來(lái)講不只是單純把一個(gè)開(kāi)源系統(tǒng)引進(jìn),七牛云還會(huì)做優(yōu)化、定制化,后期也會(huì)開(kāi)源出去。Alluxio 這個(gè)系統(tǒng)現(xiàn)在相對(duì)比較成熟了,支持的廠家也很多,微軟、百度、京東都用了這個(gè)系統(tǒng),這個(gè)系統(tǒng)還算成熟。將來(lái)大家的數(shù)據(jù)可以直接放到七牛云存儲(chǔ)上,直接利用 AVA 平臺(tái)做訓(xùn)練,當(dāng)然其中也會(huì)有些優(yōu)化、定制。
為什么選 Alluxio?它有以下幾個(gè)特性:
第一,支持多對(duì)象存儲(chǔ),海量空間。對(duì)七牛云來(lái)講,CEPH 按百 T 級(jí)別,運(yùn)維就很難做了。但對(duì)對(duì)象存儲(chǔ)來(lái)講,上 P 都不是問(wèn)題,可能稍微慢一點(diǎn),但數(shù)據(jù)放在這里,總歸可以做訓(xùn)練,雖然有時(shí)候會(huì)慢,但通過(guò)其他的手段解決,至少先把空間問(wèn)題解決了。
第二,統(tǒng)一命名空間。通過(guò) Alluxio 做,就是一個(gè)大系統(tǒng),做訓(xùn)練的時(shí)候,數(shù)據(jù)放到任何地方照樣可以把數(shù)據(jù)拉過(guò)來(lái),導(dǎo)入七牛云的深度訓(xùn)練平臺(tái),訓(xùn)練完以后把結(jié)果再導(dǎo)回原來(lái)的地方。
第三,內(nèi)存分布式文件系統(tǒng)。比如一百臺(tái)機(jī)器,每個(gè)機(jī)器貢獻(xiàn)幾百 G 內(nèi)存形成幾個(gè) T 的內(nèi)存系統(tǒng),可以把數(shù)據(jù)放在里面,后續(xù)所有訓(xùn)練都是從內(nèi)存讀取,不會(huì)從云上讀取,這是非常好的一個(gè)好處。在實(shí)際訓(xùn)練中,七牛云經(jīng)常用到這個(gè)內(nèi)存文件系統(tǒng)的特性。
第四,Multiple tier 緩存系統(tǒng)。內(nèi)存可能是幾個(gè) T 的級(jí)別,現(xiàn)在七牛云本身訓(xùn)練數(shù)據(jù)已經(jīng)到了 P 級(jí)別,加上后續(xù)平臺(tái)開(kāi)放出去,可能要到 E 級(jí)別,T 級(jí)別的內(nèi)存系統(tǒng)對(duì) E 級(jí)別的云上數(shù)據(jù)肯定不可用,這里就可以做一個(gè)多層的緩存系統(tǒng),內(nèi)存放不下了可以放在本地的硬盤。這一塊可以不落 CEPH 空間,因?yàn)?CEPH 空間可能還要再走一次網(wǎng)絡(luò),速度會(huì)受影響,七牛云可以直接落到本地緩存系統(tǒng)。
Alluxio 在七牛的應(yīng)用
首先為了考慮穩(wěn)定性,七牛云會(huì)搭兩套集群。
一個(gè)是只讀 Alluxio 集群,會(huì)分配大量的 RAM,還有基于 SSD 裸盤作二級(jí)緩存,大部分的云上訓(xùn)練數(shù)據(jù),可以落到這里。平時(shí)不繁忙的時(shí)候,數(shù)據(jù)可以完全落在 RAM 空間里。另外一個(gè)是 Alluxio 寫(xiě)集群,可以把訓(xùn)練過(guò)程產(chǎn)生的模型、log、qw、h 新文件等寫(xiě)入它,并通過(guò)同步或異步方式傳回云上。寫(xiě)集群對(duì)接的不是 SSD 裸盤,而是 CEPH 集群。為什么考慮 CEPH?因?yàn)榭梢员WC機(jī)器故障的時(shí)候,數(shù)據(jù)不會(huì)丟。寫(xiě)集群分配的 RAM 容量較少,數(shù)據(jù)寫(xiě)入的時(shí)候直接落入 CEPH,再次訪問(wèn)的時(shí)候才提升到 RAM 中。大部分的加速會(huì)在 Alluxio 讀緩存集群, Alluxio 寫(xiě)集群也有加速功能,但不是主要的。
再上面對(duì)接的是 FUSE Adapter。這是基于 Kubernetes 的 Flex Volume 做的,可以把云上數(shù)據(jù)通過(guò) Alluxio 直接導(dǎo)到訓(xùn)練平臺(tái)。采用 Adapter 是為了安全原因,再通過(guò) FUSE 就可以把數(shù)據(jù)掛進(jìn)來(lái)。比如每個(gè)用戶在七牛云 AVA 平臺(tái)訓(xùn)練的時(shí)候,把 bucket 直接掛進(jìn)來(lái)就行了,之后七牛云會(huì)自動(dòng)把數(shù)據(jù)緩存到本地的系統(tǒng),后續(xù)所有讀寫(xiě)訓(xùn)練都走本地系統(tǒng)。從使用者角度來(lái)看,相當(dāng)于在本地系統(tǒng)里做訓(xùn)練。通過(guò)這種方式,很大程度上簡(jiǎn)化了用戶的使用。 AVA 把外面的這些東西都掩蓋了,用戶做訓(xùn)練的時(shí)候,根本看不到自己的 bucket,只看到自己的目錄,當(dāng)做本地目錄直接讀寫(xiě)就行了。 ??
數(shù)據(jù)讀寫(xiě)流程約為:
訓(xùn)練開(kāi)始的時(shí)候,可以對(duì)數(shù)據(jù)預(yù)熱,讀取到本地 Alluxio 集群緩存起來(lái),大部分框架都有這樣的預(yù)取功能?;蛘卟蛔鲱A(yù)熱,這樣訓(xùn)練速度可能受損,但訓(xùn)練完全沒(méi)有問(wèn)題。RAM 充滿以后,會(huì)把數(shù)據(jù)下沉到下一層的 SSD 盤。通過(guò) FUSE 系統(tǒng),訓(xùn)練所在的 POD 可以直接讀取 Alluxio 的數(shù)據(jù),就像讀取本地文件系統(tǒng)文件一樣。讀取的其實(shí)不是云上的內(nèi)容,內(nèi)容已經(jīng)存在集群內(nèi)部了。這個(gè)集群容量完全可以替代原來(lái)的 CEPH 集群,另外的好處是數(shù)據(jù)不用的時(shí)候可以自動(dòng)剔掉,大部分在使用的數(shù)據(jù),在這個(gè)集群里都可以找得到,相當(dāng)于把加速性能發(fā)揮到了極致。
而對(duì)寫(xiě)也是一樣,但寫(xiě)七牛云有個(gè)不一樣的地方。為了保證數(shù)據(jù)安全,寫(xiě)的話可以直接穿過(guò) RAM 寫(xiě)入 CEPH,最終 RAM 或 CEPH 空間到達(dá)高水位了,可以自動(dòng)把寫(xiě)入數(shù)據(jù)推到云上。訓(xùn)練完以后,異步的把一些干凈數(shù)據(jù)淘汰,臟數(shù)據(jù)送回云上。
七牛云通過(guò)這個(gè)流程,把海量數(shù)據(jù)管理起來(lái)。用了這套系統(tǒng)后,大家就不需要頻繁倒數(shù)據(jù)了,因?yàn)橄到y(tǒng)就可以自動(dòng)把冷數(shù)據(jù)踢掉,也不會(huì)存在空間不夠的問(wèn)題了。以前用 CEPH 的時(shí)候盤很快會(huì)滿,很多工程師不知道哪些數(shù)據(jù)該丟哪些該留,現(xiàn)在不需要考慮這些問(wèn)題了。AVA 會(huì)自動(dòng)把冷數(shù)據(jù)踢掉,自動(dòng)把臟數(shù)據(jù)上傳云。
計(jì)算資源管理
七牛云剛開(kāi)始對(duì) GPU 的使用還是比較原始的。比如通過(guò) Kubernetes 啟動(dòng) Pod 綁定 GPU,綁定以后跑訓(xùn)練,綁定以后,GPU 不能共享,而且 Pod 基本是停留在那,不釋放。正確的使用方式應(yīng)該是做一個(gè) GPU 的池子,訓(xùn)練開(kāi)始的時(shí)候分配、綁定 GPU,結(jié)束后馬上歸還,這是可以做到的?,F(xiàn)在七牛云對(duì)計(jì)算資源的使用,也是遵循這個(gè)模式。七牛云采用了 workspace 和訓(xùn)練兩種方式來(lái)管理使用計(jì)算資源。 Workspace 和訓(xùn)練共享用戶的存儲(chǔ)。用戶通過(guò)workspace來(lái)編輯代碼,準(zhǔn)備數(shù)據(jù)并做簡(jiǎn)單的編譯、調(diào)試。一切準(zhǔn)備就緒后,從 AVA 平臺(tái)啟動(dòng)訓(xùn)練實(shí)例,綁定 GPU,訓(xùn)練結(jié)束后,歸還 GPU 到池子里,后面的訓(xùn)練可循環(huán)使用。
現(xiàn)在所有的新用戶不能直接看到 GPU,具體訓(xùn)練的時(shí)候他不知道用的是哪幾個(gè) GPU,放在哪里。較早的時(shí)候大家占住幾個(gè) GPU 一直使用,不釋放,別人沒(méi)法共享?,F(xiàn)在七牛云把它做成一個(gè)池子, GPU 就完全可以流轉(zhuǎn)起來(lái)。以后的目標(biāo),就是用少數(shù)的 GPU 可以做大量的訓(xùn)練。目前,七牛云正在加一些新的特性,比如加 quota,分組機(jī)制,這樣可以避免少數(shù)人無(wú)限制地霸占 GPU。
如何解決使用 GPU 存在問(wèn)題?
如何解決使用 GPU 存在問(wèn)題,典型的問(wèn)題是:GPU 的調(diào)度問(wèn)題。
Kubernetes 的調(diào)度策略是比較簡(jiǎn)單的,先通過(guò) predicate 檢查,再通過(guò) priority 檢查,然后由 Kubelet 具體分配綁定資源。假如有兩臺(tái) GPU 機(jī)器,每臺(tái) 8 張卡,第一臺(tái)已經(jīng)分配出去 2 張卡了,再次申請(qǐng) 2 張卡的時(shí)候,Kubernetes 很可能會(huì)調(diào)度到第二臺(tái)機(jī)器上,這樣每臺(tái)機(jī)器都使用了 2 張卡。如果這時(shí)有個(gè)訓(xùn)練要求使用同一臺(tái)機(jī)器上的 8 張卡訓(xùn)練,調(diào)度將失敗。這個(gè)時(shí)候需要把調(diào)度改掉,第二次分配在選擇第一臺(tái)機(jī)器的 GPU,第二臺(tái)機(jī)器的 8 張卡可以完整留下來(lái)。通過(guò)不同策略就可以滿足不同的需求。還有,假設(shè)是單臺(tái)機(jī)器上選擇兩張 GPU 訓(xùn)練,如果選 GPU1 和 GPU3,它們屬于不同 CPU,通過(guò) QPI 鏈接,它們之間帶寬可能只有是 3 個(gè) GB 每秒。如果選擇 GPU0 和 GPU1,它們之間屬于同一個(gè) CPU,那么帶寬可能達(dá)到 12G 每秒。調(diào)度的時(shí)候盡量要選擇 GPU0 和 GPU1 在一起。
實(shí)測(cè)中,七牛云也發(fā)現(xiàn),比如內(nèi)存和 CPU 有一定限制的情況下,通過(guò)不同的 GPU 分配方式跑的訓(xùn)練時(shí)間差異非常大,最多性能差距達(dá)到1倍以上。將來(lái)一旦擴(kuò)大到整個(gè)集群,差別會(huì)更大。所以 GPU 的調(diào)度模式對(duì)訓(xùn)練影響會(huì)非常大。
AVA 平臺(tái)的展望
原來(lái)七牛云內(nèi)部從業(yè)務(wù)角度出發(fā),也做了一個(gè)分布式的訓(xùn)練系統(tǒng) ESPP,用于圖像和視頻訓(xùn)練,其中也用到了 Kubernetes 和一些訓(xùn)練框架,但是針對(duì)于特定業(yè)務(wù)系統(tǒng)的?,F(xiàn)在七牛云準(zhǔn)備把原來(lái)的業(yè)務(wù)系統(tǒng)都收編到 AVA 平臺(tái)。 RDMA 這一塊也是要重點(diǎn)考慮的,正在跟廠家做一些溝通交流,馬上就要布上去,加上分布式調(diào)度系統(tǒng),以后訓(xùn)練會(huì)比現(xiàn)在快很多。
雖然說(shuō)現(xiàn)在 AVA 有了分布式的調(diào)度機(jī)制和 RDMA 機(jī)制,但從算法模型的生產(chǎn)角度講,還處在一個(gè)手工階段,大家還是通過(guò)手工方式不停的調(diào)整參數(shù),然后不停的跑訓(xùn)練,以期調(diào)試出一個(gè)滿意的模型。目前 Google 已經(jīng)通過(guò) AutoML 的方式自動(dòng)能產(chǎn)生出很好的模型,七牛云還有很多路要走。七牛云正在和算法團(tuán)隊(duì)一起研究,如果讓模型訓(xùn)練變得更高效,更自動(dòng)化,更智能化。
總結(jié)
這套 AVA 系統(tǒng),不僅七牛云內(nèi)部使用,現(xiàn)在已經(jīng)推廣給高校學(xué)生免費(fèi)使用。第一步已經(jīng)準(zhǔn)備了幾十張 GPU 卡和常用的訓(xùn)練框架,登陸到平臺(tái)后就可直接使用。高校學(xué)生遵循下面幾個(gè)步驟就可以非常方便的使用 AVA 平臺(tái):