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