杭州2018年7月11日電 /美通社/ -- 5月26 日下午,在第二十八期七牛雲架構師實踐日,李朝光進行了題為《深度學習平臺 AVA 及海量資源管理》的實戰分享。本文是對演講內容的整理。
七牛雲在深度訓練平臺裡如何管理數據以及 GPU ?
深度訓練平臺有兩個核心,一個是數據管理,一個是計算資源管理。首先提數據管理的原因是,從傳統意義上使用數據到深度訓練訪問數據,會發現一個有趣的問題:數據量已經大到沒法管理的地步了。李朝光表示,「比如以往,我們用網盤或搭一個 CEPH,數據一般都是少數幾個 T 的級別,但等到真正運作深度訓練的時候,會發現跑一個訓練,比如圖像分類或視頻檢索訓練,就能消耗幾十個 T 的空間。怎麼有效把這些數據餵到深度訓練裡?七牛雲 AVA 平臺的誕生就是要想辦法解決這個問題。」
第二是計算資源的管理。這裡的計算資源,基本指 GPU,一般來說是 NVIDIA 的 GPU。七牛雲實驗室裡,現在已經有百臺級別的 GPU,裡面有各種型號,比如 M4、K80,到 P100、V100 都有。這些資源怎麼有效地管理、使用,是個難題。七牛雲開始是用非常原始的方式,比如搶佔方式,後來再慢慢把資源管理模塊化、精細化,最後才做到 AVA 這個平臺。
七牛雲目前圍繞的是數據創新服務。但七牛雲是做存儲起步的,開始是集中在海量(對象)存儲,後面進入了機器學習、智能多媒體服務,這些的共用特點是對數據本身的存儲管理,比如對象存儲。怎麼把這麼多數據存儲起來?怎麼高效地把它放在 CDN 裡,快速地進行轉發?目前七牛雲已經基本實現了第一步:把數據有效地管理起來。第二步,怎麼發現數據之間的關係?如何根據數據內容做創新?比如一個視頻有幾千幀,幀和幀之間有什麼關係?一個圖片,是否屬於黃色或暴恐的?七牛雲重點做圖片、視頻的檢索、分類,還有人臉識別等。
一個圖片過來,不能直接餵到七牛雲深度訓練系統裡,第一步就要做數據處理。之前七牛雲有個 DORA 系統,是做圖片視頻處理的,比如裁減翻轉、加水印等。這樣可以把數據轉換成深度訓練需要的格式,然後餵到深度訓練系統裡,這是目前正在做的一塊工作。數據餵進來以後,經過深度訓練、視頻截幀,發現其中的關係,比如判斷圖片是不是暴力的、恐怖的,再重新把數據放在結構化存儲裡。然後反過來做一個迭代。做一個基礎模型,內容分發,重新進入系統做一個循環。在這個循環的不停迭代中,不停改變訓練的精度,輸出一個最終想要的結果。這大體上現在 AVA 平臺想做的事情,它的背景就是從傳統的內容服務,慢慢過渡到數據挖掘,這部分就是通過七牛雲深度訓練平臺來實現的。
七牛雲 AVA 平臺的概貌
上面一層是七牛雲 AI 實驗室主打的方向,是對外部可見的業務層,大部分的業務都是圍繞圖像、視頻定製化,包括鑑黃產品、目標檢測等。因為網絡上充斥的黃色圖片太多,很多客戶每天有幾千萬張甚至上億張圖片存到七牛雲。根據國家的法規,這些圖片可能會有相當一部分是不適宜在網上出現的。但有時候客戶也不知道,不可能靠人把這些圖搜出來,我們怎麼把這樣的圖片拎出來?這就需要做一個自動化處理,把圖片自動識別。在七牛雲這端,把圖片清理掉,網站就不會把黃色圖片或敏感圖片放出去。這是通過深度訓練平臺,利用算法識別出不同的模型,然後在毫秒級別把圖片識別出來。下面一層提供基礎的服務功能,即 AVA 深度訓練平臺。
七牛雲 AVA 平臺能為大家提供一些什麼?
AVA 平臺最初是直接服務於算法工程師的。通過引入 CEPH,屏蔽掉存儲管理細節,引入 Kubernetes 屏蔽容器管理細節,並把不同的深度訓練框架打包到 Docker 鏡像中,方便算法工程師使用。算法工程師可以聚焦於算法本身的設計,不用關心下面資源如何提供的。開始的時候機器比較少,GPU 資源有限,大家使用方式基本是獨佔模式,直接面對存儲和 GPU 資源。後來隨著業務量增大,機器資源增多,平臺的靈活性和擴展性越發顯得重要。AVA 平臺重點從對資源的包裝到對資源的靈活調度轉變。算法人員已經解除對資源的直接依賴,一個簡單的命令或 GUI 操作就能啟動訓練。除了針對算法人員,目前這套系統也開始提供給外部用戶使用,首先會給高校學生提供一個免費嘗試深度訓練的平臺,後面將會具體介紹。
七牛雲 AVA 平臺主要有哪些部分組成?
第一個部分是數據集管理。這裡講的數據集管理包含幾個部分。第一是如何管理 P 級別的雲上雲下數據,並能及時有效地提供給深度訓練。第二是對數據進行加工處理,比如圖片裁剪,把數據打包成不同深度訓練框架所需的格式,自動掛載入深度訓練平臺進行訓練。還有一種是如何把訓練產生的結果自動回傳。
第二就是標註。機器其實並不是一上來就能識別圖片,很多時候需要人工輔助它,即要人先教會它怎麼做。在信息大爆炸的時代,每天進來、出去可能 60% 以上都是圖像、視頻,這不是現有模型倉庫裡能準確識別出來的。AVA 平臺提供一套打標機制(LabelX),讓非專業或專業人士,通過標註手段,告訴平臺這些圖片到底是哪種類型,然後輸入到訓練算法進行模型迭代、更新,最後輸出標準模型。基於產生的模型,我們就可以通過推理來判斷新輸入的圖片是屬於什麼分類了,比如黃色,暴恐的等。目前七牛雲對黃圖識別的準確率已經達到 96% 以上。
同時,深度訓練是平臺比較重頭的一塊,包括對 GPU 資源的管理、存儲資源的管理、訓練管理, Quota 管理、以及跟深度訓練相關的聯合調度。現在七牛雲有比較好的調度系統,比如 Kubernetes,但當真正使用的時候,發現 Kubernetes 能做的非常有限,調度管理粒度比較粗,只能調度到容器的級別。做到容器級別,可部分解決資源共享問題,比如 100 臺 GPU,可以全部用起來。但如果有成千上萬的並發訓練任務,Kubernetes 的管理就有點捉襟見肘了,比如不同機器的 GPU 怎麼聯合調度、通信怎麼管、資源怎麼分配更合理等。七牛雲現在要做的一件事,就是在 Kubernetes 調度之上,細化對 GPU、CPU 的管理,引入 RDMA 的技術,把資源管理、通信和調度做深,做細,達到更好的資源共享和使用。
最後一個部分,是評估推理。前期的訓練做了大量準備工作,準備好了評估模型。推理評估要做的就比較簡單,是把新的少量圖片加上模型再訓練一次,在毫秒級別能夠得出結果。這一部分大都與業務結合比較緊密。
AVA 平臺的技術架構是怎樣的?
下圖顯示的是 AVA 平臺的技術架構,主要分為三層。最下面一層屬於硬體和資源管理層,我們現在基本不會買單臺 GPU 做訓練,一般我們都是做一個集群,這一塊交給 Kubernetes 就可以了。最上面一層是業務系統,包括模型、推理、標註和各個不同的訓練系統,七牛雲 AI 實驗室業務大部分業務都在這層。中間這層是 AVA 平臺重點要發力的地方,也是我們現在重點在做的。
這層有三個部分:
第一部分是存儲系統。這一部分的核心是如何把大量的數據管起來。較早我們的數據是直接搭在 CEPH 上使用,但數據量一旦達到幾十 T 的規模,問題就開始顯現了。舉個例子,一個視頻訓練有幾十 T 容量,包含十多億張文件,存在 CEPH PVC 上,有一天突然發現數據讀不了了,找了半天才發現是文件系統 inode 用完了。另外一個例子是,當 PVC 空間滿了之後,新的數據進不來,老的數據不知道哪些該刪,很被動。七牛雲現在的一個策略,就是不再基於 CEPH 做訓練,而是基於雲做訓練,CEPH 可以做中間緩存。目前中等規模的訓練已經完全跑通,對於 IO 吞吐要求不是特別高的訓練,和在 CEPH 上訓練沒有顯著差別。目前 AVA 是通過 Alluxio 把本地訓練和雲上的數據對接起來。
第二是數據管理。所有數據都來源於網際網路,開始都是存在對象存儲中。AVA 剛做的時候,必須把數據拉到本地來才能訓練。標準用法是,用戶提供一個 json 文件,裡面每行是七牛對象存儲的 URL,AVA 會把 json 中每個文件都下載,放到一個 PVC 中並掛載到 Kubernetes 的 Pod 中進行訓練。在存放到 PVC 之前,還會調用七牛的圖像處理系統 Dora 對數據進行一些必要的操作如旋轉,裁剪等。在現實使用中,大家會不停地調整數據內容並進行迭代訓練,每次調整都重新把數據拉取一遍將是很繁瑣的事情。現在我們的做法,一個是直接在雲上訓練,這樣對數據的改動直接反饋到雲端,另外一個是引入結構化存儲,把數據和元數據信息存放到 Mongo 中,並通過打快照的方式,方便靈活的選擇不同版本數據進行訓練。
第三是調度管理系統。在七牛內部,現有比較成熟的框架比如 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 怎麼共享、使用,依然有很多東西可以優化。後續七牛雲會基於 MXNet 的 PS-LITE 框架,把分布式調度往深裡做,滿足深度訓練的需要。七牛雲也正在引進 RDMA 機制,通過 RDMA 機制把 GPU 跟 GPU 之間聯繫打通,提升運行的性能。
對海量數據,七牛雲怎麼管?
之前數據管理的現狀是:大部分的數據會存放在對象存儲中,做訓練的時候,會把數據拉到本地來。所謂本地,一般指本地的一個集群或本地一臺機器,一般玩法,都是搭一個本地 CEPH 集群,通過 Kubernetes 調度,把 PVC 掛上去,然後訓練數據從對象存儲導到這裡,可以在裡面跑訓練,跑一兩個月或是一兩天都可以。這樣做的問題是用戶數據不能共享,大家如果用過 CEPH 就知道,CEPH RBD 在 Kubernetes 中不能共享讀寫,CEPH FS 可以,但性能有點差距。還有,CEPH 提供的存儲空間對於深度訓練的數據量來說是杯水車薪。
去年七牛雲搭了一個 100T 的集群,在真正用的時候感覺還是比較吃力,會碰到各種問題。一個訓練,就可能有幾十 T,把 CEPH 會一下子撐爆。這只是七牛內部一個正常的訓練,算上對外開放的用戶,還有內部上百號人同時使用,這個集群明顯不能滿足要求。
視頻數據一下佔幾十 T,其他人沒法玩了,這是比較頭痛的一個問題。運維空間不夠,可以加盤,加了幾次以後就沒法加了,或者盤位沒了,然後再加機器,形成惡性循環。幾十T的數據可能前面半個月用了一半數據就不用了,這個時候其實放在雲上對象存儲裡就可以了。但剛開始沒有這個機制,大部分的數據都躺著「睡覺」,而其他人又沒有空間可用
對 GPU 也是類似,如果一個集群中的 GPU 不能充分利用,到最後會發現運維就是不停加盤、加機器,用戶不停倒數據。這過程還會影響帶寬,陷入惡性循環。怎麼破這個問題?這是七牛雲 AVA 要解決的問題,AVA 首先要解決痛點問題,然後才解決好用的問題。
存儲問題怎麼解決?
七牛雲引入了一個 Alluxio 的特性。對七牛雲來講不只是單純把一個開源系統引進,七牛雲還會做優化、定製化,後期也會開源出去。Alluxio 這個系統現在相對比較成熟了,支持的廠家也很多,微軟、百度、京東都用了這個系統,這個系統還算成熟。將來大家的數據可以直接放到七牛雲存儲上,直接利用 AVA 平臺做訓練,當然其中也會有些優化、定製。
為什麼選 Alluxio?它有以下幾個特性:
第一,支持多對象存儲,海量空間。對七牛雲來講,CEPH 按百 T 級別,運維就很難做了。但對對象存儲來講,上 P 都不是問題,可能稍微慢一點,但數據放在這裡,總歸可以做訓練,雖然有時候會慢,但通過其他的手段解決,至少先把空間問題解決了。
第二,統一命名空間。通過 Alluxio 做,就是一個大系統,做訓練的時候,數據放到任何地方照樣可以把數據拉過來,導入七牛雲的深度訓練平臺,訓練完以後把結果再導回原來的地方。
第三,內存分布式文件系統。比如一百臺機器,每個機器貢獻幾百 G 內存形成幾個 T 的內存系統,可以把數據放在裡面,後續所有訓練都是從內存讀取,不會從雲上讀取,這是非常好的一個好處。在實際訓練中,七牛雲經常用到這個內存文件系統的特性。
第四,Multiple tier 緩存系統。內存可能是幾個 T 的級別,現在七牛雲本身訓練數據已經到了 P 級別,加上後續平臺開放出去,可能要到 E 級別,T 級別的內存系統對 E 級別的雲上數據肯定不可用,這裡就可以做一個多層的緩存系統,內存放不下了可以放在本地的硬碟。這一塊可以不落 CEPH 空間,因為 CEPH 空間可能還要再走一次網絡,速度會受影響,七牛雲可以直接落到本地緩存系統。
Alluxio 在七牛的應用
首先為了考慮穩定性,七牛雲會搭兩套集群。
一個是只讀 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 直接掛進來就行了,之後七牛雲會自動把數據緩存到本地的系統,後續所有讀寫訓練都走本地系統。從使用者角度來看,相當於在本地系統裡做訓練。通過這種方式,很大程度上簡化了用戶的使用。 AVA 把外面的這些東西都掩蓋了,用戶做訓練的時候,根本看不到自己的 bucket,只看到自己的目錄,當做本地目錄直接讀寫就行了。
數據讀寫流程約為:
訓練開始的時候,可以對數據預熱,讀取到本地 Alluxio 集群緩存起來,大部分框架都有這樣的預取功能。或者不做預熱,這樣訓練速度可能受損,但訓練完全沒有問題。RAM 充滿以後,會把數據下沉到下一層的 SSD 盤。通過 FUSE 系統,訓練所在的 POD 可以直接讀取 Alluxio 的數據,就像讀取本地文件系統文件一樣。讀取的其實不是雲上的內容,內容已經存在集群內部了。這個集群容量完全可以替代原來的 CEPH 集群,另外的好處是數據不用的時候可以自動剔掉,大部分在使用的數據,在這個集群裡都可以找得到,相當於把加速性能發揮到了極致。
而對寫也是一樣,但寫七牛雲有個不一樣的地方。為了保證數據安全,寫的話可以直接穿過 RAM 寫入 CEPH,最終 RAM 或 CEPH 空間到達高水位了,可以自動把寫入數據推到雲上。訓練完以後,異步的把一些乾淨數據淘汰,髒數據送回雲上。
七牛雲通過這個流程,把海量數據管理起來。用了這套系統後,大家就不需要頻繁倒數據了,因為系統就可以自動把冷數據踢掉,也不會存在空間不夠的問題了。以前用 CEPH 的時候盤很快會滿,很多工程師不知道哪些數據該丟哪些該留,現在不需要考慮這些問題了。AVA 會自動把冷數據踢掉,自動把髒數據上傳雲。
計算資源管理
七牛雲剛開始對 GPU 的使用還是比較原始的。比如通過 Kubernetes 啟動 Pod 綁定 GPU,綁定以後跑訓練,綁定以後,GPU 不能共享,而且 Pod 基本是停留在那,不釋放。正確的使用方式應該是做一個 GPU 的池子,訓練開始的時候分配、綁定 GPU,結束後馬上歸還,這是可以做到的。現在七牛雲對計算資源的使用,也是遵循這個模式。七牛雲採用了 workspace 和訓練兩種方式來管理使用計算資源。 Workspace 和訓練共享用戶的存儲。用戶通過workspace來編輯代碼,準備數據並做簡單的編譯、調試。一切準備就緒後,從 AVA 平臺啟動訓練實例,綁定 GPU,訓練結束後,歸還 GPU 到池子裡,後面的訓練可循環使用。
現在所有的新用戶不能直接看到 GPU,具體訓練的時候他不知道用的是哪幾個 GPU,放在哪裡。較早的時候大家佔住幾個 GPU 一直使用,不釋放,別人沒法共享。現在七牛雲把它做成一個池子, 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 在一起。
實測中,七牛雲也發現,比如內存和 CPU 有一定限制的情況下,通過不同的 GPU 分配方式跑的訓練時間差異非常大,最多性能差距達到1倍以上。將來一旦擴大到整個集群,差別會更大。所以 GPU 的調度模式對訓練影響會非常大。
AVA 平臺的展望
原來七牛雲內部從業務角度出發,也做了一個分布式的訓練系統 ESPP,用於圖像和視頻訓練,其中也用到了 Kubernetes 和一些訓練框架,但是針對於特定業務系統的。現在七牛雲準備把原來的業務系統都收編到 AVA 平臺。 RDMA 這一塊也是要重點考慮的,正在跟廠家做一些溝通交流,馬上就要布上去,加上分布式調度系統,以後訓練會比現在快很多。
雖然說現在 AVA 有了分布式的調度機制和 RDMA 機制,但從算法模型的生產角度講,還處在一個手工階段,大家還是通過手工方式不停的調整參數,然後不停的跑訓練,以期調試出一個滿意的模型。目前 Google 已經通過 AutoML 的方式自動能產生出很好的模型,七牛雲還有很多路要走。七牛雲正在和算法團隊一起研究,如果讓模型訓練變得更高效,更自動化,更智能化。
總結
這套 AVA 系統,不僅七牛雲內部使用,現在已經推廣給高校學生免費使用。第一步已經準備了幾十張 GPU 卡和常用的訓練框架,登陸到平臺後就可直接使用。高校學生遵循下面幾個步驟就可以非常方便的使用 AVA 平臺:
登陸七牛雲 www.qiniu.com,創建一個帳號 創建一個對象存儲 Bucket 把學校名稱/實驗室名稱,帳號, bucket 發送到 atlab-review@qiniu.com 審批通過後,進入 portal.qiniu.com,選擇深度訓練平臺,綁定 bucket 創建 Workspace,編輯訓練代碼和準備數據 創建訓練,從 workspace 查看運行結果 Done