隨著“大數(shù)據(jù)”概念而興起的分布式機器學(xué)習(xí),在人工智能的新時代里解決了大量最具挑戰(zhàn)性的問題。
近幾年,機器學(xué)習(xí)在很多領(lǐng)域取得了空前的成功,也因此徹底改變了人工智能的發(fā)展方向。大數(shù)據(jù)時代的到來一方面促進了機器學(xué)習(xí)的長足發(fā)展,另一方面也給機器學(xué)習(xí)帶來了前所未有的新挑戰(zhàn)。
在這些發(fā)展與挑戰(zhàn)中,分布式機器學(xué)習(xí)應(yīng)運而生并成功解決了大量具有挑戰(zhàn)性的關(guān)鍵問題,今天晚上班主任就來和同學(xué)們聊一聊分布式機器學(xué)習(xí)起源、流程、算法以及目前流行的分布式機器學(xué)習(xí)平臺。
01
起源:大數(shù)據(jù)和大模型帶來的挑戰(zhàn)
在開始聊起源之前,我們先來看張圖:
這張圖是展示了ImageNet近幾年的錯誤率,2011年的時候錯誤率還將近有25%,這樣的錯誤率很難運用到實際應(yīng)用中。到2015年,ImageNet錯誤率已經(jīng)降低到3%左右,比人類的錯誤率(5%)還要低, 短短的4-5年時間,機器在ImageNet上的識別率便超過了人類。
導(dǎo)致這一結(jié)果的原因有2個:一是數(shù)據(jù),另一個是模型。
大規(guī)模訓(xùn)練數(shù)據(jù)的出現(xiàn)為訓(xùn)練大模型提供了物質(zhì)基礎(chǔ),大規(guī)模機器學(xué)習(xí)模型具有超強的表達能力,可以解決很多復(fù)雜和高難度的問題。
在解決這些問題的同時,大規(guī)模機器學(xué)習(xí)模型也有著非常明顯的弊端:包含參數(shù)眾多,訓(xùn)練耗時;模型巨大,傳統(tǒng)的計算機和工作站難以處理;容易過擬合,在訓(xùn)練數(shù)據(jù)集上表現(xiàn)良好,在未知測試數(shù)據(jù)上表現(xiàn)不盡人意。
比較典型的例子是電商網(wǎng)站上的用戶行為數(shù)據(jù),比如在淘寶上很多用戶每天都能看到系統(tǒng)推薦的產(chǎn)品,這些產(chǎn)品是根據(jù)用戶日常瀏覽和點擊習(xí)慣進行推薦的,淘寶的服務(wù)器將用戶點擊的產(chǎn)品行為記錄下來,作為分布式機器學(xué)習(xí)系統(tǒng)的輸入。輸出是一個數(shù)學(xué)模型,可以預(yù)測一個用戶喜歡看到哪些商品,從而在下一次展示推薦商品的時候,多展示那些用戶喜歡的商品。
類似的,還有互聯(lián)網(wǎng)廣告系統(tǒng),根據(jù)幾億用戶的廣告點擊行為,為其推薦更容易被點擊的廣告。
淘寶推薦系統(tǒng)大致如圖所示
由上述案例可以知,現(xiàn)在我們很難用一臺計算機去處理工業(yè)規(guī)模的機器學(xué)習(xí)模型了,所以說分布式訓(xùn)練已經(jīng)成為了一個先決條件。
流程:了解-探索-設(shè)計
分布式機器學(xué)習(xí)說白了,其實就是把任務(wù)發(fā)放給許多機器,然后讓它們協(xié)同去幫忙訓(xùn)練數(shù)據(jù)和模型。

如圖所示,我們會把任務(wù)下發(fā)給許多的worker,然后這些worker協(xié)同的去訓(xùn)練模型。
通過對分布式機器學(xué)習(xí)起源的講解,我們可以將分布式機器學(xué)習(xí)的使用場景粗分為三類:計算量太大、訓(xùn)練數(shù)據(jù)太多、訓(xùn)練模型太大太過復(fù)雜。
這三種場景都有相對應(yīng)的解決辦法,對于計算量太大可采用共享內(nèi)存的多機并行運算;對于訓(xùn)練數(shù)據(jù)太多,可以將數(shù)據(jù)進行劃分,分配到多個工作節(jié)點上進行訓(xùn)練;而對于訓(xùn)練模型太大,也可以將模型進行劃分,分配到不同的工作節(jié)點上進行訓(xùn)練。

不管是以上場景中的哪一種,還是幾種場景混合在一起的情況,分布式機器學(xué)習(xí)都可以分為三步流程:
第一步是了解機器學(xué)習(xí)的模型以及優(yōu)化方法;第二步是要去探索分布式機器學(xué)習(xí)的范式;第三步是設(shè)計系統(tǒng),無論系統(tǒng)的設(shè)計者還是系統(tǒng)的使用者,都要知道系統(tǒng)為什么要這樣設(shè)計,這樣設(shè)計對我們選擇什么樣的機器學(xué)習(xí)有怎樣的幫助。
算法:數(shù)據(jù)并行、模型并行、梯度下降
數(shù)據(jù)并行
數(shù)據(jù)并行是指由于訓(xùn)練樣本非常多模型非常大,我們需要把訓(xùn)練數(shù)據(jù)劃分到不同的機器上,比如說我們用100臺機器同時存儲這些數(shù)據(jù),如果這些模型有10萬個數(shù)據(jù)樣,用100臺機器來存儲,每臺機器存儲1000條數(shù)據(jù)即可。
對于每一臺worker來說,訓(xùn)練算法、分布式和在單機上沒有什么區(qū)別,只是需要在節(jié)點之間同步模型參數(shù)。
其中參數(shù)平均是最簡單的一種數(shù)據(jù)并行化。若采用參數(shù)平均法,訓(xùn)練的過程如下所示:
1、基于模型的配置隨機初始化網(wǎng)絡(luò)模型參數(shù)
2、將當(dāng)前這組參數(shù)分發(fā)到各個工作節(jié)點
3、在每個工作節(jié)點,用數(shù)據(jù)集的一部分數(shù)據(jù)進行訓(xùn)練
4、將各個工作節(jié)點的參數(shù)的均值作為全局參數(shù)值
5、若還有訓(xùn)練數(shù)據(jù)沒有參與訓(xùn)練,則繼續(xù)從第二步開始

模型并行
模型并行將模型拆分成幾個分片,由幾個訓(xùn)練單元分別持有,共同協(xié)作完成訓(xùn)練。
深度學(xué)習(xí)的計算其實主要是矩陣運算,而在計算時這些矩陣都是保存在內(nèi)存里的,如果是用GPU卡計算的話就是放在顯存里,可是有的時候矩陣會非常大。面對這種超大矩陣便需要將其拆分,分到不同處理器上去計算。

梯度下降
1847年梯度下降被提出來之后,這些年業(yè)內(nèi)提出了各種各樣的優(yōu)化算法,優(yōu)化算法是一個非常漫長的演變過程。

大家可以看到圖中有一條分界線, 在2010之前的算法主要是Deterministic algorithms,這種算法具有很強確定性。換句話說,就是可以在數(shù)學(xué)上保證此算法進行的每一步都是精確的,能夠指導(dǎo)我們的優(yōu)化目標(biāo)。
2010年之后的這些模型被稱做stochastic algorithms,不再要求每一步都是精確的梯度下降,或者每一步要做最精確的優(yōu)化。stochastic algorithms讓每一步只進行隨機的優(yōu)化,最終把所有數(shù)據(jù)優(yōu)化完以后,還是能夠優(yōu)化到最低點。
隨著數(shù)據(jù)越來越大,Deterministic algorithms規(guī)則已經(jīng)越來變得越來越不適用了。對于大量的計算數(shù)據(jù),我們不可能每一次都做梯度下降,隨機梯度下降變得越來越有優(yōu)勢,資源利用率也會更高。
04
分布式機器學(xué)習(xí)三大平臺:Spark、PMLS、TensorFlow
在紐約州立大學(xué)布法羅分校計算機科學(xué)與工程教授、Petuum Inc. 顧問 Murat Demirbas 和他的兩位學(xué)生一起發(fā)表的那篇對比現(xiàn)有分布式機器學(xué)習(xí)平臺的論文中,將分布式機器學(xué)習(xí)平臺歸類為了三大基本設(shè)計方法:
1.基本數(shù)據(jù)流(basic dataflow)
2.參數(shù)服務(wù)器模型(parameter-server model)
3.先進數(shù)據(jù)流(advanced dataflow)
并根據(jù)這三大基本設(shè)計方法,使用了業(yè)內(nèi)著名的三大分布式機器學(xué)習(xí)平臺,其中基本數(shù)據(jù)流方法使用了 Apache Spark、參數(shù)服務(wù)器模型使用了 PMLS(Petuum)、先進數(shù)據(jù)流模型使用了 TensorFlow 和 MXNet。
并在測試中得出相應(yīng)的結(jié)論,班主任摘取關(guān)鍵部分出來,供大家參考(論文原文可訪問:https://www.cse.buffalo.edu/~demirbas/publications/DistMLplat.pdf,譯文參考網(wǎng)絡(luò)翻譯)
Spark
在基本的設(shè)置中,Spark 將模型參數(shù)存儲在驅(qū)動器節(jié)點,工作器與驅(qū)動器通信從而在每次迭代后更新這些參數(shù)。對于大規(guī)模部署而言,這些模型參數(shù)可能并不適合驅(qū)動器,并且會作為一個 RDD 而進行維護更新。
這會帶來大量額外開銷,因為每次迭代都需要創(chuàng)造一個新的 RDD 來保存更新后的模型參數(shù)。更新模型涉及到在整個機器/磁盤上重排數(shù)據(jù),這就限制了 Spark 的擴展性。
PMLS
PMLS節(jié)點會存儲和更新模型參數(shù)以及響應(yīng)來自工作器的請求。工作器會請求來自它們的局部 PS 副本的最新模型參數(shù),并在分配給它們的數(shù)據(jù)集部分上執(zhí)行計算。
?
PMLS還采用了 SSP(Stale Synchronous Parallelism)模型,這比 BSP(Bulk Synchronous Parellelism)模型更寬松——其中工作器在每次迭代結(jié)束時同步。SSP 為工作器的同步減少了麻煩,確保最快的工作器不能超過最慢的工作器 s 次迭代。
?TensorFlow
?TensorFlow使用節(jié)點和邊的有向圖來表示計算。節(jié)點表示計算,狀態(tài)可變。而邊則表示多維數(shù)據(jù)數(shù)組(張量),在節(jié)點之間傳輸。
TensorFlow 需要用戶靜態(tài)聲明這種符號計算圖,并對該圖使用復(fù)寫和分區(qū)(rewrite& partitioning)將其分配到機器上進行分布式執(zhí)行。(MXNet,尤其是 DyNet 使用了圖的動態(tài)聲明,這改善了編程的難度和靈活性。)
?

電子發(fā)燒友App














































評論