云計算時代,,數(shù)據(jù)量和數(shù)據(jù)維度急劇增加,,對深度學習訓練造成越來越大的壓力,來自七牛云的技術專家林亦寧在 OSC 年終盛典上帶來了關于深度學習訓練的演講,,將就大量分布式集群下,,如何高效、可靠地構建深度學習訓練計算任務進行了干貨分享,。以下是他的演講內(nèi)容,。 林亦寧 七牛云技術專家,浙江大學博士畢業(yè),,在機器視覺和深度學習領域有 10 余年的研究和開發(fā)經(jīng)驗,,有多年創(chuàng)業(yè)經(jīng)驗,,曾任無人機、智能家電領域公司首席技術官,。 云計算和深度學習這兩個東西很火,,它們只有緊密地聯(lián)系在一起才能發(fā)揮出各自最大的優(yōu)勢。 在與客戶或者同行交流的過程中,,我們發(fā)現(xiàn)除了一些很大的公司,,比如 BAT 或鏈家這樣上軌道的公司之外,大部分的公司做算法,、深度學習時用的還是單機版的深度學習平臺,。這樣的平臺,對于滿足目前的數(shù)據(jù)量,、數(shù)據(jù)吞吐量以及對計算的迭代速度要求,,都有很大的局限性,也無法滿足現(xiàn)在的處理要求,。 Why,? 接下來我將會以七牛為例,分享七牛是如何考慮和實現(xiàn)深度學習的,。 主要從三個階段分享,,首先是考慮清楚為什么要做這件事。七牛云是一個以云存儲技術為核心的云服務公司,,平臺上現(xiàn)在有 60 多萬企業(yè)用戶和個人開發(fā)者,, 80% 的手機 App 或多或少都用到了七牛的云存儲,幾乎在場的每個人的手機里,,都有正在用著七牛云存儲服務的 App ,。 簡要介紹一下七牛的歷史,七牛一開始做云存儲,,開發(fā)存儲 API ,。2012、2013 年短視頻有了一個爆發(fā)式的增長,,包括媒體行業(yè)都有爆發(fā)式的增長,,所以七牛隨著這一波互聯(lián)網(wǎng) App 的興起也有了爆發(fā)式的增長。后來七牛給客戶提供了很多基礎服務,,主要是一些富媒體數(shù)據(jù),,例如音視頻。隨后客戶提出更多要求,,例如需要計算,、文件處理、點播以及直播的解決方案等等,。所以現(xiàn)在七牛是一個云平臺公司,,包含以上所有的服務,。 第二個階段是要到哪里去,七牛提出的口號是 「Time to be an AI Company 」,,這個口號不僅是內(nèi)部的,,也是對客戶的引導。 提出這個口號有兩個原因,,第一個是內(nèi)在原因,,可以看到移動終端年增長率在逐年下降;另外,,三五年前,,拿到一個客戶需要一塊錢,新增一塊錢可以多十塊錢的利潤,,這就是很好的生意,。但現(xiàn)在拉一個客戶成本是十塊錢,產(chǎn)生的經(jīng)濟效益也還是十塊錢,。這個時候,賬就算不平了,。所以現(xiàn)在并不是一個做 App 創(chuàng)業(yè)的好時機,。 第二個是外因,現(xiàn)在的應用環(huán)境和技術環(huán)境,,都已經(jīng)到了一個 AI 可以成熟應用的時間點,。應用環(huán)境是有海量的富媒體數(shù)據(jù),可以通過一些手段充分挖掘出大數(shù)據(jù)內(nèi)在的價值,;交互方式開始日益多樣化,,以前是發(fā)短信,,后來流量多了可以發(fā)圖片,,后來網(wǎng)絡好了,又可以發(fā)視頻,,現(xiàn)在可以看直播,,直播以前是用聊天室聊天,現(xiàn)在可以發(fā)彈幕,、送主播「海陸空」,。交互方式越來越多樣化,帶來的好處是能夠更容易讓用戶付費,。 另外一點,,從技術環(huán)境來說,云計算技術和深度學習技術都已經(jīng)到了一個可以轉化為生產(chǎn)力的時間點,。30 年前就有了深度網(wǎng)絡,,那時候還稱為神經(jīng)網(wǎng)絡,;上個世紀八十年代的東西到現(xiàn)在突然火起來的主要原因是,硬件技術可以實時把推理的結果返回來,,而且結果還不錯,。做一個人臉檢測挺準的,這個就是應用環(huán)境和技術環(huán)境可以把 AI 轉化為生產(chǎn)力的時間,,給客戶提出一個口號,,即尋找更多的連接,讓這個連接更加智能,,使得客戶愿意在單位的連接上掏出更多的錢,,這個才是以后生意的方式。 所以要給客戶設計這樣一個機器學習的平臺,,包括三部分:一個數(shù)據(jù),,一個算法,一個模型,。這是對一個機器學習平臺最簡單的抽象,。 How ? 首先思考需要解決哪些問題,,最重要的分為三個方面:效率,、規(guī)模以及機器學習本身的一些內(nèi)在性的需求。 規(guī)模 所謂的規(guī)模問題有三點,。一是數(shù)據(jù)總量增長很快,,每年公有云和視頻數(shù)據(jù)增長比例達 60% 多。第二點是數(shù)據(jù)量非常大,,比如七牛有 2000 億張圖片,,有超過 10 億小時的視頻,如何去挖掘數(shù)據(jù)內(nèi)在的價值,,這本身就是一個非常頭疼的問題,。第三點是吞吐量大,例如 1080P 的攝像頭,,一個攝像頭在一個小時產(chǎn)生的數(shù)據(jù)是 1.8G,,一個城市有幾十萬個攝像頭,像北京這種城市甚至幾百萬,,三個月產(chǎn)生的數(shù)據(jù)是 EB 級別,,數(shù)據(jù)的吞吐量非常大,所以在設計系統(tǒng)的時候必須能跟上新增數(shù)據(jù)的節(jié)奏,。 效率 很多人說現(xiàn)在的互聯(lián)網(wǎng)是云計算,。但是實際上云計算不是一朵云,互聯(lián)網(wǎng)上也不是只有一朵公有云,,而是有很多云,,例如存儲,、日志服務器、計算集群等等,。我們的系統(tǒng)需要在這一朵朵云之間架起橋梁,,連接起來。很多時候它們不在同一個機房,,甚至不在同一個城市,,而系統(tǒng)需要在能保證足夠的速度和帶寬的前提下,讓數(shù)據(jù)可靠地傳到最終學習的集群,。 規(guī)模機器學習的原生需求 圖 1 第三個是機器學習的原生需求,,七牛把機器學習的計算過程抽象為兩種:數(shù)據(jù)和訓練的作業(yè)。原生的需求包括很多方面,,圖 1 列了幾條需求,,例如一個是能讓整個訓練快速迭代;第二個是進程停了可以隨時重啟,,數(shù)據(jù)應該是安全的,;然后是各個訓練任務之間需要與它的資源隔離開;訓練作業(yè)需要分布式,。還有其他的需求,,例如可視化、模型融合,、模型管理,,這些都是機器學習本身訓練的需求。 What ,? 圖 2 圖 2 是深度學習平臺的架構,,底層是前面介紹的各個文件系統(tǒng),在這個上面做了一層 Caching IO ,,即分布式內(nèi)存服務器,,計算時所需要的數(shù)據(jù)都是通過它來做提取,大家可以參考一個開源項目 - AlluxIO ,,七牛的設計跟它有一些近似,。在 IO 之上抽象為 Docker,,來計算任務和資源分配以及調(diào)度,。在這個基礎之上,編排系統(tǒng)也是參考了開源的項目,。七牛做這個項目的時間其實比較早,,大概一年兩年前就做了,主要是擔心開源項目任性說不干就不干了,,所以自己寫了一套東西,。 有這么一套編排系統(tǒng)以后,,可以很方便地構建一個分布式的系統(tǒng),它的核心是一個參數(shù)服務器,,這里推薦一個基于 Caffe 的分布式框架 Poseidon,,它針對深度學習任務優(yōu)化了計算集群內(nèi)部的通信,在降低通信量的同時保證很好的迭代性,。有了分布式的系統(tǒng)和編排系統(tǒng)之后,,把上面的作業(yè)抽象為一個一個的獨立鏡像,比如數(shù)據(jù)清理,,有五種數(shù)據(jù)清理的方法就做五個鏡像,。數(shù)據(jù)放大也類似,包括訓練和推理,,都會做出相應基本的鏡像去調(diào)用,。在這個基礎上會把作業(yè)全都抽象為一個圖的形式表達,以及用數(shù)據(jù)流的方式去表達整個作業(yè)的過程,。 這些抽象完了以后,,就是上面一個一個的應用,可以看到有迭代學習的需求,,有增量學習的一些任務或者半監(jiān)督的任務,,包括模型怎么比較、怎么融合,,都是跑在整個系統(tǒng)的 App,。這個 App 通過底層這一套基于圖和流式的系統(tǒng)來支撐。最后模型訓練完了,,會有一個 API 的管理系統(tǒng),,這個管理系統(tǒng)可以提供自動的 API 生成,提供自動的評估以及恢復的升級這些功能,。例如訓練完一個模型后,,但不知道這個模型實際效果如何,這時可以選擇一個恢復升級的方式,,先升級 10%,,再自動驗證效果,如果好再升級 30%,,可以把這個過程全部編排在 API 里,。所有數(shù)據(jù)到達數(shù)據(jù)庫存里,這就是整個深度學習系統(tǒng),。七牛用電影“機械姬”的女主角之名 Ava 來命名它,,希望它能像 Ava 一樣冰雪聰明。 下面稍微介紹一下上面跑的幾個 App,流式的計算用法,,例如一個鏡像是一個基本的操作單元,,還有一個是 eval 評估服務,只需要把數(shù)據(jù)流畫出一張圖,,把地址指定,,得到結果的集合,這是一個能夠極大降低算法人員的工作成本的服務,,使算法工程師能更專注算法本身,。 圖 3 圖 3 是迭代和增量訓練的系統(tǒng),也是基于剛才那一套訓練平臺開發(fā)的 App,。為了解決不斷有新數(shù)據(jù)的流式訓練的任務,,傳統(tǒng)的方法需要先建立一個數(shù)據(jù)文件,現(xiàn)在把這個過程放到一個獨立的進程來做,。沒有新數(shù)據(jù)來的時候就會把這個數(shù)據(jù)編排到整個數(shù)據(jù)池的底部,,在訓練的時候可能會用一些 Cheet,會用同個模型,,因為不知道是哪個,,甚至訓練到一半發(fā)現(xiàn)不對勁,但是又不想把當前的訓練停下來,,隨時可以開啟一個新的訓練,,用當前這個模型改一個參數(shù)讓它跑,前面的訓練以一個副本的形式在跑,,最后達到做模型融合或者模型比較的方法,。最后在模型融合或者模型比較完成以后,把模型推到一個 API 生成器上自動生成 API ,。整套過程下來,,可以減少總是重復訓練同一批數(shù)據(jù)的環(huán)節(jié)。 圖 4 這個也是七牛做得比較有意思的實驗,,半監(jiān)督的方式打標,,怎么做?來了數(shù)據(jù)先保證數(shù)據(jù)打過標,,不過還是會有沒打過標的,,尤其流式進來的數(shù)據(jù),這個數(shù)據(jù)量很大,,打標也很痛苦,,七牛用一些訓練好的分類器對未打標的數(shù)據(jù)做分類,同時做一個聚類,,未打過標的數(shù)據(jù)中跟打過標的數(shù)據(jù)聚類最接近的一些數(shù)據(jù),,以及標簽是一致的數(shù)據(jù),,用打過標的訓練新的模型,,這個過程需要迭代,,一開始沒有打過標的用了 20%,下次迭代一次以后又會加 10%,,迭代幾輪以后可以很大程度降低一個打標的工作,,最后用這樣的方式訓練新的模型。 圖 5 圖 5 是模型融合的方法,,列舉了三種方法,,七牛都在做一些嘗試。最簡單的是線性的融合方式,,比較復雜的是中間有一個網(wǎng)絡做融合,,第三個比較傳統(tǒng),把融合放在前面一層,。用的最多是線性的融合方法,,節(jié)省資源,也不太傷腦筋,。 總結 AI 需要三方面的結合:平臺,、算法和數(shù)據(jù)。只有這三點能非常好地結合到一起,,才能產(chǎn)生經(jīng)濟效益,。 |
|