3.2同步協(xié)議
本節(jié)假設(shè)讀者已經(jīng)對隨機(jī)梯度優(yōu)化算法比較熟悉,如果不熟悉的同學(xué)請參考吳恩達(dá)經(jīng)典課程機(jī)器學(xué)習(xí)中對SGD的介紹,或者我之前多次推薦過的書籍《最優(yōu)化導(dǎo)論》。
我們先看一個單機(jī)算法的運行過程,假設(shè)一個模型的參數(shù)切分成三個分片k1,k2,k3;比如你可以假設(shè)是一個邏輯回歸算法的權(quán)重向量被分成三段。我們將訓(xùn)練樣本集合也切分成三個分片s1,s2,s3;在單機(jī)運行的情況下,我們假設(shè)運行的序列是(k1,s1)、(k2,s1)、(k3、s1)、(k1、s2)、(k2、s2)、(k3、s2)。。??疵靼琢藛??就是假設(shè)先用s1中的樣本一次對參數(shù)分片k1、k2、k3進(jìn)行訓(xùn)練,然后換s2;這就是典型的單機(jī)運行的情況,而我們知道這樣的運行序列最后算法會收斂。
現(xiàn)在我們開始并行化,假設(shè)k1、k2、k3分布在三個server node上,s1、s2、s3分布在三個worker上,這時候如果我們還要保持之前的計算順序,則會變成怎樣?work1計算的時候,work2和worker3只能等待,同樣worker2計算的時候,worker1和work3都得等待,以此類推;可以看出這樣的并行化并沒有提升性能;但是也算簡單解決了超大規(guī)模模型的存儲問題。
為了解決性能的問題,業(yè)界開始探索這里的一致性模型,最先出來的版本是前面提到的[11]中的ASP模式,就是完全不顧worker之間的順序,每個worker按照自己的節(jié)奏走,跑完一個迭代就update,然后繼續(xù),這應(yīng)該是大規(guī)模機(jī)器學(xué)習(xí)中的freestyle了,如圖所示
?
ASP的優(yōu)勢是最大限度利用了集群的計算能力,所有的worker所在的機(jī)器都不用等待,但缺點也顯而易見,除了少數(shù)幾個模型,比如LDA,ASP協(xié)議可能導(dǎo)致模型無法收斂。也就是SGD徹底跑飛了,梯度不知道飛到哪里去了。
在ASP之后提出了另一種相對極端的同步協(xié)議BSP,spark用的就是這種方式,如圖所示
?
每個worker都必須在同一個迭代運行,只有一個迭代任務(wù)所有的worker都完成了,才會進(jìn)行一次worker和server之間的同步和分片更新。這個算法和嚴(yán)格一直的算法非常類似,區(qū)別僅僅在于單機(jī)版本的batch size在BSP的時候變成了有所有worker的單個batch size求和得到的總的butch size替換。毫無疑問,BSP的模式和單機(jī)串行因為僅僅是batch size的區(qū)別,所以在模型收斂性上是完全一樣的。同時,因為每個worker在一個周期內(nèi)是可以并行計算的,所以有了一定的并行能力。
以此協(xié)議為基礎(chǔ)的spark在很長時間內(nèi)成為機(jī)器學(xué)習(xí)領(lǐng)域?qū)嶋H的霸主,不是沒有理由的。此種協(xié)議的缺陷之處在于,整個worker group的性能由其中最慢的worker決定;這個worker一般稱為straggler。讀過GFS文章的同學(xué)應(yīng)該都知道straggler的存在是非常普遍的現(xiàn)象。
能否將ASP和BSP做一下折中呢?答案當(dāng)然是可以的,這就是目前我認(rèn)為最好的同步協(xié)議SSP;SSP的思路其實很簡單,既然ASP是允許不同worker之間的迭代次數(shù)間隔任意大,而BSP則只允許為0,那我是否可以取一個常數(shù)s?如圖所示
?
不同的worker之間允許有迭代的間隔,但這個間隔數(shù)不允許超出一個指定的數(shù)值s,圖中s=3.
SSP協(xié)議的詳細(xì)介紹參見[14],CMU的大拿Eric Xing在其中詳細(xì)介紹了SSP的定義,以及其收斂性的保證。理論推導(dǎo)證明常數(shù)s不等于無窮大的情況下,算法一定可以在若干次迭代以后進(jìn)入收斂狀態(tài)。其實在Eric提出理論證明之前,工業(yè)界已經(jīng)這么嘗試過了:)
順便提一句,考察分布式算法的性能,一般會分為statistical performance和hard performance來看。前者指不同的同步協(xié)議導(dǎo)致算法收斂需要的迭代次數(shù)的多少,后者是單次迭代所對應(yīng)的耗時。兩者的關(guān)系和precision\recall關(guān)系類似,就不贅述了。有了SSP,BSP就可以通過指定s=0而得到。而ASP同樣可以通過制定s=∞來達(dá)到。
3.3核心技術(shù)
除了參數(shù)服務(wù)器的架構(gòu)、同步協(xié)議之外,本節(jié)再對其他技術(shù)做一個簡要的介紹,詳細(xì)的了解請直接閱讀沐帥的博士論文和相關(guān)發(fā)表的論文。
熱備、冷備技術(shù):為了防止server node掛掉,導(dǎo)致任務(wù)中斷,可以采用兩個技術(shù),一個是對參數(shù)分片進(jìn)行熱備,每個分片存儲在三個不同的server node中,以master-slave的形式存活。如果master掛掉,可以快速從slave獲取并重啟相關(guān)task。
除了熱備,還可以定時寫入checkpoint文件到分布式文件系統(tǒng)來對參數(shù)分片及其狀態(tài)進(jìn)行備份。進(jìn)一步保證其安全性。
Server node管理:可以使用一致性哈希技術(shù)來解決server node的加入和退出問題,如圖所示
?
當(dāng)有server node加入或退出的時候,server manager負(fù)責(zé)對參數(shù)進(jìn)行重新分片或者合并。注意在對參數(shù)進(jìn)行分片管理的情況下,一個分片只需要一把鎖,這大大提升了系統(tǒng)的性能,也是參數(shù)服務(wù)器可以實用的一個關(guān)鍵點。
4. 大規(guī)模機(jī)器學(xué)習(xí)的四重境界
到這里可以回到我們的標(biāo)題了,大規(guī)模機(jī)器學(xué)習(xí)的四重境界到底是什么呢?
這四重境界的劃分是作者個人閱讀總結(jié)的一種想法,并不是業(yè)界標(biāo)準(zhǔn),僅供大家參考。
境界1:參數(shù)可單機(jī)存儲和更新
此種境界較為簡單,但仍可以使用參數(shù)服務(wù)器,通過數(shù)據(jù)并行來加速模型的訓(xùn)練。
境界2:參數(shù)不可單機(jī)存儲,可以單機(jī)更新
此種情況對應(yīng)的是一些簡單模型,比如sparse logistic regression;當(dāng)feature的數(shù)量突破百億的時候,LR的權(quán)重參數(shù)不太可能在一臺機(jī)器上完全存下,此時必須使用參數(shù)服務(wù)器架構(gòu)對模型參數(shù)進(jìn)行分片。但是注意一點,SGD的更新公式
w’=w-α,其中可以分開到單個維度進(jìn)行計算,但是單個維度的wi=f(w)xi
這里的f(w)表示是全部參數(shù)w的一個函數(shù),具體推倒比較簡單,這里篇幅所限就不贅述了。只是想說明worker在計算梯度的時候可能需要使用到上一輪迭代的所有參數(shù)。而我們之所以對參數(shù)進(jìn)行分片就是因為我們無法將所有參數(shù)存放到一臺機(jī)器,現(xiàn)在單個worker有需要使用所有的參數(shù)才能計算某個參數(shù)分片的梯度,這不是矛盾嗎?可能嗎?
答案是可能的,因為單個樣本的feature具有很高的稀疏性(sparseness)。例如一個百億feature的模型,單個訓(xùn)練樣本往往只在其中很小一部分feature上有取值,其他都為0(假設(shè)feature取值都已經(jīng)離散化了)。因此計算f(w)的時候可以只拉取不為0的feature對應(yīng)的那部分w即可。有文章統(tǒng)計一般這個級別的系統(tǒng),稀疏性往往在0.1%(or 0.01%,記得不是很準(zhǔn),大致這樣)以下。這樣的稀疏性,可以讓單機(jī)沒有任何阻礙的計算f(w)。
目前公司開源的angel和AILab正在做的系統(tǒng)都處于這個境界。而原生spark還沒有達(dá)到這個境界,只能在中小規(guī)模的圈子里廝混。Angel改造的基于Angel的Spark則達(dá)到了這個境界。
境界3:參數(shù)不可單機(jī)存儲,不可單機(jī)更新,但無需模型并行
境界3順延境界2二來,當(dāng)百億級feature且feature比較稠密的時候,就需要計算框架進(jìn)入到這層境界了,此時單個worker的能力有限,無法完整加載一個樣本,也無法完整計算f(w)。怎么辦呢?其實很簡單,學(xué)過線性代數(shù)的都知道,矩陣可以分塊。向量是最簡單的矩陣,自然可以切成一段一段的來計算。只是調(diào)度器需要支持算符分段而已了。
境界4:參數(shù)不可單機(jī)存儲,不可單機(jī)更新,需要模型并行
進(jìn)入到這個層次的計算框架,可以算是世界一流了??梢蕴幚沓笠?guī)模的神經(jīng)網(wǎng)絡(luò)。這也是最典型的應(yīng)用場景。此時不僅模型的參數(shù)不能單機(jī)存儲,而且同一個迭代內(nèi),模型參數(shù)之間還有強(qiáng)的依賴關(guān)系,可以參見姐夫?qū)istbelief的介紹里的模型切分。
此時首先需要增加一個coordinator組件來進(jìn)行模型并行的concurrent控制。同時參數(shù)服務(wù)器框架需要支持namespace切分,coordinator將依賴關(guān)系通過namespace來進(jìn)行表示。
一般參數(shù)間的依賴關(guān)系因模型而已,所以較難抽象出通用的coordinator來,而必須以某種形式通過腳本parser來生產(chǎn)整個計算任務(wù)的DAG圖,然后通過DAG調(diào)度器來完成。對這個問題的介紹可以參考Erix Xing的分享[5]。
Tensorflow
目前業(yè)界比較知名的深度學(xué)習(xí)框架有Caffee、MXNet、Torch、Keras、Theano等,但目前最炙手可熱的應(yīng)該是google發(fā)布的Tensorflow。這里單獨拿出來稍微分解下。
前面不少圖片引自此文,從TF的論文來看,TF框架本身是支持模型并行和數(shù)據(jù)并行的,內(nèi)置了一個參數(shù)服務(wù)器模塊,但從開源版本所曝光的API來看,TF無法用來10B級別feature的稀疏LR模型。原因是已經(jīng)曝光的API只支持在神經(jīng)網(wǎng)絡(luò)的不同層和層間進(jìn)行參數(shù)切分,而超大規(guī)模LR可以看做一個神經(jīng)單元,TF不支持單個神經(jīng)單元參數(shù)切分到多個參數(shù)服務(wù)器node上。
當(dāng)然,以google的實力,絕對是可以做到第四重境界的,之所以沒有曝光,可能是基于其他商業(yè)目的的考量,比如使用他們的云計算服務(wù)。
綜上,個人認(rèn)為如果能做到第四重境界,目前可以說的上是世界一流的大規(guī)模機(jī)器學(xué)習(xí)框架。僅從沐帥的ppt里看他曾經(jīng)達(dá)到過,google內(nèi)部應(yīng)該也是沒有問題的。第三重境界應(yīng)該是國內(nèi)一流,第二充應(yīng)該是國內(nèi)前列吧。
5. 其他
5.1 資源管理
本文沒有涉及到的部分是資源管理,大規(guī)模機(jī)器學(xué)習(xí)框架部署的集群往往資源消耗也比較大,需要專門的資源管理工具來維護(hù)。這方面yarn和mesos都是佼佼者,細(xì)節(jié)這里也就不介紹了。
5.2 設(shè)備
除了資源管理工具,本身部署大規(guī)模機(jī)器學(xué)習(xí)集群本身對硬件也還是有些要求的,雖然理論上來說,所有commodity機(jī)器都可以用來搭建這類集群,但是考慮到性能,我們建議盡量用高內(nèi)存的機(jī)器+萬兆及以上的網(wǎng)卡。沒有超快速的網(wǎng)卡,玩參數(shù)傳遞和樣本加載估計會比較苦逼。
6. 結(jié)語
從后臺轉(zhuǎn)算法以來,長期沉浸于算法推理的論文無法自拔,對自己之前的后臺工程能力漸漸輕視起來,覺得工程對算法的幫助不大。直到最近一個契機(jī),需要做一個這方面的調(diào)研,才豁然發(fā)現(xiàn),之前的工程經(jīng)驗對我理解大規(guī)模機(jī)器學(xué)習(xí)框架非常有用,果然如李宗盛所說,人生每一步路,都不是白走的。
在一個月左右的調(diào)研中,腦子每天都充斥這各種疑問和困惑,曾經(jīng)半夜4點醒來,思考同步機(jī)制而再也睡不著,干脆起來躲衛(wèi)生間看書,而那天我一點多才睡。當(dāng)腦子里有放不下的問題的時候,整個人會處于一種非??簥^的狀態(tài),除非徹底想清楚這個問題,否則失眠是必然的,上一次這種狀態(tài)已經(jīng)是很多年前了。好在最后我總算理清了這方面的所有關(guān)鍵細(xì)節(jié)。以此,記之。Carbon zhang于2017年8月26日凌晨!
致謝
感謝wills、janwang、joey、roberty、suzi等同學(xué)一起討論,特別感謝burness在TF方面的深厚造詣和調(diào)研。因為本人水平所限,錯漏難免,另外還有相當(dāng)多的細(xì)節(jié)因為篇幅限制并未一一展開,僅僅是從較高抽象層面上簡述了下大規(guī)模機(jī)器學(xué)習(xí)框架的關(guān)鍵思路,其他如分片向量鎖、通信協(xié)議、時鐘邏輯、DAG調(diào)度器、資源調(diào)度模塊等均為展開來講,希望以后有機(jī)會能補(bǔ)上。
引用
1. Wide& Deep Learning for Recommender Systems
2. Deep Neural Networks for YouTube Recommendations
3. https://www.zhihu.com/question/53851014
4. TensorFlow:Large-Scale Machine Learning on Heterogeneous Distributed Systems
5.
6. Large Scale Distributed Deep Networks
7. MapReduce: Simplified Data Processing on Large
Clusters
8. Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
9. https://www.zhihu.com/question/55119470
10. KunPeng:Parameter Server based Distributed Learning Systems and Its Applications in
Alibaba and Ant Financial
11. An Architecture for Parallel Topic Models
12. Scaling Distributed Machine Learning with the Parameter Server
13. Piccolo:Building fast, distributed pro- grams with partitioned tables
14. More Effective Distributed ML via a Stale Synchronous Parallel Parameter Server
15. Angel-A Flexible and Powerful Parameter Server;黃明ppt
原文鏈接: https://zhuanlan.zhihu.com/p/29968773
評論