omniture

七牛云李朝光:深度學習平臺AVA及海量資源管理

2018-07-11 15:13 17152
5月26日下午,在第二十八期七牛云架構師實踐日,李朝光進行了題為《深度學習平臺 AVA 及海量資源管理》的實戰(zhàn)分享。本文是對演講內容的整理。

杭州2018年7月11日電 /美通社/ -- 5月26 日下午,在第二十八期七牛云架構師實踐日,李朝光進行了題為《深度學習平臺 AVA 及海量資源管理》的實戰(zhàn)分享。本文是對演講內容的整理。

七牛云在深度訓練平臺里如何管理數據以及 GPU ?

深度訓練平臺有兩個核心,一個是數據管理,一個是計算資源管理。首先提數據管理的原因是,從傳統(tǒng)意義上使用數據到深度訓練訪問數據,會發(fā)現一個有趣的問題:數據量已經大到沒法管理的地步了。李朝光表示,“比如以往,我們用網盤或搭一個 CEPH,數據一般都是少數幾個 T 的級別,但等到真正運作深度訓練的時候,會發(fā)現跑一個訓練,比如圖像分類或視頻檢索訓練,就能消耗幾十個 T 的空間。怎么有效把這些數據喂到深度訓練里?七牛云 AVA 平臺的誕生就是要想辦法解決這個問題。

第二是計算資源的管理。這里的計算資源,基本指 GPU,一般來說是 NVIDIA 的 GPU。七牛云實驗室里,現在已經有百臺級別的 GPU,里面有各種型號,比如 M4、K80,到 P100、V100 都有。這些資源怎么有效地管理、使用,是個難題。七牛云開始是用非常原始的方式,比如搶占方式,后來再慢慢把資源管理模塊化、精細化,最后才做到 AVA 這個平臺。

七牛云目前圍繞的是數據創(chuàng)新服務。但七牛云是做存儲起步的,開始是集中在海量(對象)存儲,后面進入了機器學習、智能多媒體服務,這些的共用特點是對數據本身的存儲管理,比如對象存儲。怎么把這么多數據存儲起來?怎么高效地把它放在 CDN 里,快速地進行轉發(fā)?目前七牛云已經基本實現了第一步:把數據有效地管理起來。第二步,怎么發(fā)現數據之間的關系?如何根據數據內容做創(chuàng)新?比如一個視頻有幾千幀,幀和幀之間有什么關系?一個圖片,是否屬于黃色或暴恐的?七牛云重點做圖片、視頻檢索、分類,還有人臉識別等。

一個圖片過來,不能直接喂到七牛云深度訓練系統(tǒng)里,第一步就要做數據處理。之前七牛云有個 DORA 系統(tǒng),是做圖片視頻處理的,比如裁減翻轉、加水印等。這樣可以把數據轉換成深度訓練需要的格式,然后喂到深度訓練系統(tǒng)里,這是目前正在做的一塊工作。數據喂進來以后,經過深度訓練、視頻截幀,發(fā)現其中的關系,比如判斷圖片是不是暴力的、恐怖的,再重新把數據放在結構化存儲里。然后反過來做一個迭代。做一個基礎模型,內容分發(fā),重新進入系統(tǒng)做一個循環(huán)。在這個循環(huán)的不停迭代中,不停改變訓練的精度,輸出一個最終想要的結果。這大體上現在 AVA 平臺想做的事情,它的背景就是從傳統(tǒng)的內容服務,慢慢過渡到數據挖掘,這部分就是通過七牛云深度訓練平臺來實現的。

七牛云 AVA 平臺的概貌

七牛云 AVA 平臺
七牛云 AVA 平臺

上面一層是七牛云 AI 實驗室主打的方向,是對外部可見的業(yè)務層,大部分的業(yè)務都是圍繞圖像、視頻定制化,包括鑒黃產品目標檢測等。因為網絡上充斥的黃色圖片太多,很多客戶每天有幾千萬張甚至上億張圖片存到七牛云。根據國家的法規(guī),這些圖片可能會有相當一部分是不適宜在網上出現的。但有時候客戶也不知道,不可能靠人把這些圖搜出來,我們怎么把這樣的圖片拎出來?這就需要做一個自動化處理,把圖片自動識別。在七牛云這端,把圖片清理掉,網站就不會把黃色圖片或敏感圖片放出去。這是通過深度訓練平臺,利用算法識別出不同的模型,然后在毫秒級別把圖片識別出來。下面一層提供基礎的服務功能,即 AVA 深度訓練平臺。

七牛云 AVA 平臺能為大家提供一些什么?

AVA 平臺最初是直接服務于算法工程師的。通過引入 CEPH,屏蔽掉存儲管理細節(jié),引入  Kubernetes 屏蔽容器管理細節(jié),并把不同的深度訓練框架打包到 Docker 鏡像中,方便算法工程師使用。算法工程師可以聚焦于算法本身的設計,不用關心下面資源如何提供的。開始的時候機器比較少,GPU 資源有限,大家使用方式基本是獨占模式,直接面對存儲和 GPU 資源。后來隨著業(yè)務量增大,機器資源增多,平臺的靈活性和擴展性越發(fā)顯得重要。AVA 平臺重點從對資源的包裝到對資源的靈活調度轉變。算法人員已經解除對資源的直接依賴,一個簡單的命令或 GUI 操作就能啟動訓練。除了針對算法人員,目前這套系統(tǒng)也開始提供給外部用戶使用,首先會給高校學生提供一個免費嘗試深度訓練的平臺,后面將會具體介紹。

七牛云 AVA 平臺主要有哪些部分組成?

第一個部分是數據集管理。這里講的數據集管理包含幾個部分。第一是如何管理 P 級別的云上云下數據,并能及時有效地提供給深度訓練。第二是對數據進行加工處理,比如圖片裁剪,把數據打包成不同深度訓練框架所需的格式,自動掛載入深度訓練平臺進行訓練。還有一種是如何把訓練產生的結果自動回傳。

第二就是標注。機器其實并不是一上來就能識別圖片,很多時候需要人工輔助它,即要人先教會它怎么做。在信息大爆炸的時代,每天進來、出去可能 60% 以上都是圖像、視頻,這不是現有模型倉庫里能準確識別出來的。AVA 平臺提供一套打標機制(LabelX),讓非專業(yè)或專業(yè)人士,通過標注手段,告訴平臺這些圖片到底是哪種類型,然后輸入到訓練算法進行模型迭代、更新,最后輸出標準模型。基于產生的模型,我們就可以通過推理來判斷新輸入的圖片是屬于什么分類了,比如黃色,暴恐的等。目前七牛云對黃圖識別的準確率已經達到 96% 以上。

同時,深度訓練是平臺比較重頭的一塊,包括對 GPU 資源的管理、存儲資源的管理、訓練管理, Quota 管理、以及跟深度訓練相關的聯合調度。現在七牛云有比較好的調度系統(tǒng),比如 Kubernetes,但當真正使用的時候,發(fā)現 Kubernetes 能做的非常有限,調度管理粒度比較粗,只能調度到容器的級別。做到容器級別,可部分解決資源共享問題,比如 100 臺 GPU,可以全部用起來。但如果有成千上萬的并發(fā)訓練任務,Kubernetes 的管理就有點捉襟見肘了,比如不同機器的 GPU 怎么聯合調度、通信怎么管、資源怎么分配更合理等。七牛云現在要做的一件事,就是在 Kubernetes 調度之上,細化對 GPU、CPU 的管理,引入 RDMA 的技術,把資源管理、通信和調度做深,做細,達到更好的資源共享和使用。

最后一個部分,是評估推理。前期的訓練做了大量準備工作,準備好了評估模型。推理評估要做的就比較簡單,是把新的少量圖片加上模型再訓練一次,在毫秒級別能夠得出結果。這一部分大都與業(yè)務結合比較緊密。

 AVA 平臺的技術架構是怎樣的?

下圖顯示的是 AVA 平臺的技術架構,主要分為三層。最下面一層屬于硬件和資源管理層,我們現在基本不會買單臺 GPU 做訓練,一般我們都是做一個集群,這一塊交給 Kubernetes 就可以了。最上面一層是業(yè)務系統(tǒng),包括模型、推理、標注和各個不同的訓練系統(tǒng),七牛云 AI 實驗室業(yè)務大部分業(yè)務都在這層。中間這層是 AVA 平臺重點要發(fā)力的地方,也是我們現在重點在做的。

AVA 平臺的技術架構
AVA 平臺的技術架構

這層有三個部分:

第一部分是存儲系統(tǒng)。這一部分的核心是如何把大量的數據管起來。較早我們的數據是直接搭在 CEPH 上使用,但數據量一旦達到幾十 T 的規(guī)模,問題就開始顯現了。舉個例子,一個視頻訓練有幾十 T 容量,包含十多億張文件,存在 CEPH PVC 上,有一天突然發(fā)現數據讀不了了,找了半天才發(fā)現是文件系統(tǒng) inode 用完了。另外一個例子是,當 PVC 空間滿了之后,新的數據進不來,老的數據不知道哪些該刪,很被動。七牛云現在的一個策略,就是不再基于 CEPH 做訓練,而是基于云做訓練,CEPH 可以做中間緩存。目前中等規(guī)模的訓練已經完全跑通,對于 IO 吞吐要求不是特別高的訓練,和在 CEPH 上訓練沒有顯著差別。目前 AVA 是通過 Alluxio 把本地訓練和云上的數據對接起來。

第二是數據管理。所有數據都來源于互聯網,開始都是存在對象存儲中。AVA 剛做的時候,必須把數據拉到本地來才能訓練。標準用法是,用戶提供一個 json 文件,里面每行是七牛對象存儲的 URL,AVA 會把 json 中每個文件都下載,放到一個 PVC 中并掛載到 Kubernetes 的 Pod 中進行訓練。在存放到 PVC 之前,還會調用七牛的圖像處理系統(tǒng) Dora 對數據進行一些必要的操作如旋轉,裁剪等。在現實使用中,大家會不停地調整數據內容并進行迭代訓練,每次調整都重新把數據拉取一遍將是很繁瑣的事情?,F在我們的做法,一個是直接在云上訓練,這樣對數據的改動直接反饋到云端,另外一個是引入結構化存儲,把數據和元數據信息存放到 Mongo 中,并通過打快照的方式,方便靈活的選擇不同版本數據進行訓練。

第三是調度管理系統(tǒng)。在七牛內部,現有比較成熟的框架比如 Caffe、MXNet、Pytorch、TensorFlow 等都在使用。最初是直接使用,后來遷移到七牛容器云,由 Kubernetes 提供調度,這樣的調度還是比較簡單的。比如, Kubernetes 現在的調度策略是,選中了 GPU 機器后,對 GPU 卡是隨機選擇。但是,一臺機器上的兩張 GPU 卡,處于不同拓撲連接方式,性能相差非常大。比如 QPI 連接帶寬可能是 3GB,而 P2P 模式可能達到 12GB。AVA 通過檢查 GPU 的 Affinity 模式,改寫 Kubernetes 的 scheduler,避免選擇處于不同 CPU 通道上的 GPU 卡。還有,現有的調度策略是讓所有 GPU 機器卡使用比較均衡,但如果一個訓練需要使用 8 張卡,系統(tǒng)中卡總數滿足,可能沒有一臺機器可以提供完整的 8 張卡,AVA 通過定制策略,提供特殊的 scheduler,可以選擇優(yōu)先把 Pod 調度到部分分配的 GPU 機器上。對于分布式訓練,七牛云調研過 Tensorflow、MXNet 等,最終選擇 MXNet ps-lite 作為基礎。MXNet 可以做分布式訓練,但只能把任務調到機器里,調過去 GPU 怎么共享、使用,依然有很多東西可以優(yōu)化。后續(xù)七牛云會基于 MXNet 的 PS-LITE 框架,把分布式調度往深里做,滿足深度訓練的需要。七牛云也正在引進 RDMA 機制,通過 RDMA 機制把 GPU 跟 GPU 之間聯系打通,提升運行的性能。

對海量數據,七牛云怎么管?

之前數據管理的現狀是:大部分的數據會存放在對象存儲中,做訓練的時候,會把數據拉到本地來。所謂本地,一般指本地的一個集群或本地一臺機器,一般玩法,都是搭一個本地 CEPH 集群,通過 Kubernetes 調度,把 PVC 掛上去,然后訓練數據從對象存儲導到這里,可以在里面跑訓練,跑一兩個月或是一兩天都可以。這樣做的問題是用戶數據不能共享,大家如果用過 CEPH 就知道,CEPH RBD 在 Kubernetes 中不能共享讀寫,CEPH FS 可以,但性能有點差距。還有,CEPH 提供的存儲空間對于深度訓練的數據量來說是杯水車薪。

去年七牛云搭了一個 100T 的集群,在真正用的時候感覺還是比較吃力,會碰到各種問題。一個訓練,就可能有幾十 T,把 CEPH 會一下子撐爆。這只是七牛內部一個正常的訓練,算上對外開放的用戶,還有內部上百號人同時使用,這個集群明顯不能滿足要求。

視頻數據一下占幾十 T,其他人沒法玩了,這是比較頭痛的一個問題。運維空間不夠,可以加盤,加了幾次以后就沒法加了,或者盤位沒了,然后再加機器,形成惡性循環(huán)。幾十T的數據可能前面半個月用了一半數據就不用了,這個時候其實放在云上對象存儲里就可以了。但剛開始沒有這個機制,大部分的數據都躺著“睡覺”,而其他人又沒有空間可用

對 GPU 也是類似,如果一個集群中的 GPU 不能充分利用,到最后會發(fā)現運維就是不停加盤、加機器,用戶不停倒數據。這過程還會影響帶寬,陷入惡性循環(huán)。怎么破這個問題?這是七牛云 AVA 要解決的問題,AVA 首先要解決痛點問題,然后才解決好用的問題。

存儲問題怎么解決?

七牛云引入了一個 Alluxio 的特性。對七牛云來講不只是單純把一個開源系統(tǒng)引進,七牛云還會做優(yōu)化、定制化,后期也會開源出去。Alluxio 這個系統(tǒng)現在相對比較成熟了,支持的廠家也很多,微軟、百度、京東都用了這個系統(tǒng),這個系統(tǒng)還算成熟。將來大家的數據可以直接放到七牛云存儲上,直接利用 AVA 平臺做訓練,當然其中也會有些優(yōu)化、定制。

為什么選 Alluxio?它有以下幾個特性:

第一,支持多對象存儲,海量空間。七牛云來講,CEPH 按百 T 級別,運維就很難做了。但對對象存儲來講,上 P 都不是問題,可能稍微慢一點,但數據放在這里,總歸可以做訓練,雖然有時候會慢,但通過其他的手段解決,至少先把空間問題解決了。

第二,統(tǒng)一命名空間。通過 Alluxio 做,就是一個大系統(tǒng),做訓練的時候,數據放到任何地方照樣可以把數據拉過來,導入七牛云的深度訓練平臺,訓練完以后把結果再導回原來的地方。

第三,內存分布式文件系統(tǒng)。比如一百臺機器,每個機器貢獻幾百 G 內存形成幾個 T 的內存系統(tǒng),可以把數據放在里面,后續(xù)所有訓練都是從內存讀取,不會從云上讀取,這是非常好的一個好處。在實際訓練中,七牛云經常用到這個內存文件系統(tǒng)的特性。

第四,Multiple  tier 緩存系統(tǒng)。內存可能是幾個 T 的級別,現在七牛云本身訓練數據已經到了 P 級別,加上后續(xù)平臺開放出去,可能要到 E 級別,T 級別的內存系統(tǒng)對 E 級別的云上數據肯定不可用,這里就可以做一個多層的緩存系統(tǒng),內存放不下了可以放在本地的硬盤。這一塊可以不落 CEPH 空間,因為 CEPH 空間可能還要再走一次網絡,速度會受影響,七牛云可以直接落到本地緩存系統(tǒng)。

Alluxio 在七牛的應用

首先為了考慮穩(wěn)定性,七牛云會搭兩套集群。

一個是只讀 Alluxio 集群,會分配大量的 RAM,還有基于 SSD 裸盤作二級緩存,大部分的云上訓練數據,可以落到這里。平時不繁忙的時候,數據可以完全落在 RAM 空間里。另外一個是 Alluxio 寫集群,可以把訓練過程產生的模型、log、qw、h 新文件等寫入它,并通過同步或異步方式傳回云上。寫集群對接的不是 SSD 裸盤,而是 CEPH 集群。為什么考慮 CEPH?因為可以保證機器故障的時候,數據不會丟。寫集群分配的 RAM 容量較少,數據寫入的時候直接落入 CEPH,再次訪問的時候才提升到 RAM 中。大部分的加速會在 Alluxio 讀緩存集群, Alluxio 寫集群也有加速功能,但不是主要的。

再上面對接的是 FUSE  Adapter。這是基于 Kubernetes 的 Flex Volume 做的,可以把云上數據通過 Alluxio 直接導到訓練平臺。采用 Adapter 是為了安全原因,再通過 FUSE 就可以把數據掛進來。比如每個用戶在七牛云 AVA 平臺訓練的時候,把 bucket 直接掛進來就行了,之后七牛云會自動把數據緩存到本地的系統(tǒng),后續(xù)所有讀寫訓練都走本地系統(tǒng)。從使用者角度來看,相當于在本地系統(tǒng)里做訓練。通過這種方式,很大程度上簡化了用戶的使用。 AVA 把外面的這些東西都掩蓋了,用戶做訓練的時候,根本看不到自己的 bucket,只看到自己的目錄,當做本地目錄直接讀寫就行了。       ??

數據讀寫流程約為

訓練開始的時候,可以對數據預熱,讀取到本地 Alluxio 集群緩存起來,大部分框架都有這樣的預取功能?;蛘卟蛔鲱A熱,這樣訓練速度可能受損,但訓練完全沒有問題。RAM 充滿以后,會把數據下沉到下一層的 SSD 盤。通過 FUSE 系統(tǒng),訓練所在的 POD 可以直接讀取 Alluxio 的數據,就像讀取本地文件系統(tǒng)文件一樣。讀取的其實不是云上的內容,內容已經存在集群內部了。這個集群容量完全可以替代原來的 CEPH 集群,另外的好處是數據不用的時候可以自動剔掉,大部分在使用的數據,在這個集群里都可以找得到,相當于把加速性能發(fā)揮到了極致。

而對寫也是一樣,但寫七牛云有個不一樣的地方。為了保證數據安全,寫的話可以直接穿過 RAM 寫入 CEPH,最終 RAM 或 CEPH 空間到達高水位了,可以自動把寫入數據推到云上。訓練完以后,異步的把一些干凈數據淘汰,臟數據送回云上。

七牛云通過這個流程,把海量數據管理起來。用了這套系統(tǒng)后,大家就不需要頻繁倒數據了,因為系統(tǒng)就可以自動把冷數據踢掉,也不會存在空間不夠的問題了。以前用 CEPH 的時候盤很快會滿,很多工程師不知道哪些數據該丟哪些該留,現在不需要考慮這些問題了。AVA 會自動把冷數據踢掉,自動把臟數據上傳云。

計算資源管理

七牛云剛開始對 GPU 的使用還是比較原始的。比如通過 Kubernetes 啟動 Pod 綁定 GPU,綁定以后跑訓練,綁定以后,GPU 不能共享,而且 Pod 基本是停留在那,不釋放。正確的使用方式應該是做一個 GPU 的池子,訓練開始的時候分配、綁定 GPU,結束后馬上歸還,這是可以做到的?,F在七牛云對計算資源的使用,也是遵循這個模式。七牛云采用了 workspace 和訓練兩種方式來管理使用計算資源。 Workspace 和訓練共享用戶的存儲。用戶通過workspace來編輯代碼,準備數據并做簡單的編譯、調試。一切準備就緒后,從 AVA 平臺啟動訓練實例,綁定 GPU,訓練結束后,歸還 GPU 到池子里,后面的訓練可循環(huán)使用。       

計算資源管理
計算資源管理

現在所有的新用戶不能直接看到 GPU,具體訓練的時候他不知道用的是哪幾個 GPU,放在哪里。較早的時候大家占住幾個 GPU 一直使用,不釋放,別人沒法共享?,F在七牛云把它做成一個池子, GPU 就完全可以流轉起來。以后的目標,就是用少數的 GPU 可以做大量的訓練。目前,七牛云正在加一些新的特性,比如加 quota,分組機制,這樣可以避免少數人無限制地霸占 GPU。

如何解決使用 GPU 存在問題?

如何解決使用 GPU 存在問題,典型的問題是:GPU 的調度問題。

Kubernetes 的調度策略是比較簡單的,先通過 predicate 檢查,再通過 priority 檢查,然后由 Kubelet 具體分配綁定資源。假如有兩臺 GPU 機器,每臺 8 張卡,第一臺已經分配出去 2 張卡了,再次申請 2 張卡的時候,Kubernetes 很可能會調度到第二臺機器上,這樣每臺機器都使用了 2 張卡。如果這時有個訓練要求使用同一臺機器上的 8 張卡訓練,調度將失敗。這個時候需要把調度改掉,第二次分配在選擇第一臺機器的 GPU,第二臺機器的 8 張卡可以完整留下來。通過不同策略就可以滿足不同的需求。還有,假設是單臺機器上選擇兩張 GPU 訓練,如果選 GPU1 和 GPU3,它們屬于不同 CPU,通過 QPI 鏈接,它們之間帶寬可能只有是 3 個 GB 每秒。如果選擇 GPU0 和 GPU1,它們之間屬于同一個 CPU,那么帶寬可能達到 12G 每秒。調度的時候盡量要選擇 GPU0 和 GPU1 在一起。

實測中,七牛云也發(fā)現,比如內存和 CPU 有一定限制的情況下,通過不同的 GPU 分配方式跑的訓練時間差異非常大,最多性能差距達到1倍以上。將來一旦擴大到整個集群,差別會更大。所以 GPU 的調度模式對訓練影響會非常大。

AVA 平臺的展望

原來七牛云內部從業(yè)務角度出發(fā),也做了一個分布式的訓練系統(tǒng) ESPP,用于圖像和視頻訓練,其中也用到了 Kubernetes 和一些訓練框架,但是針對于特定業(yè)務系統(tǒng)的?,F在七牛云準備把原來的業(yè)務系統(tǒng)都收編到 AVA 平臺。 RDMA 這一塊也是要重點考慮的,正在跟廠家做一些溝通交流,馬上就要布上去,加上分布式調度系統(tǒng),以后訓練會比現在快很多。

雖然說現在 AVA 有了分布式的調度機制和 RDMA 機制,但從算法模型的生產角度講,還處在一個手工階段,大家還是通過手工方式不停的調整參數,然后不停的跑訓練,以期調試出一個滿意的模型。目前 Google 已經通過 AutoML 的方式自動能產生出很好的模型,七牛云還有很多路要走。七牛云正在和算法團隊一起研究,如果讓模型訓練變得更高效,更自動化,更智能化。

總結

這套 AVA 系統(tǒng),不僅七牛云內部使用,現在已經推廣給高校學生免費使用。第一步已經準備了幾十張 GPU 卡和常用的訓練框架,登陸到平臺后就可直接使用。高校學生遵循下面幾個步驟就可以非常方便的使用 AVA 平臺:

  1. 登陸七牛云  www.qiniu.com,創(chuàng)建一個賬號
  2. 創(chuàng)建一個對象存儲 Bucket
  3. 把學校名稱/實驗室名稱,賬號, bucket 發(fā)送到 atlab-review@qiniu.com  
  4. 審批通過后,進入 portal.qiniu.com,選擇深度訓練平臺,綁定 bucket
  5. 創(chuàng)建 Workspace,編輯訓練代碼和準備數據
  6. 創(chuàng)建訓練,從 workspace 查看運行結果
  7. Done
消息來源:七牛云
China-PRNewsire-300-300.png
相關鏈接:
全球TMT
微信公眾號“全球TMT”發(fā)布全球互聯網、科技、媒體、通訊企業(yè)的經營動態(tài)、財報信息、企業(yè)并購消息。掃描二維碼,立即訂閱!
collection