十行代码让你的单机“影分身”,分布式训练速度快到飞起
?
工程師:“在你輝煌的時(shí)刻,讓我為你唱首歌,我的好兄弟,心里有苦你對(duì)我說(shuō)。”
計(jì)算機(jī):“哥啊,那我可就說(shuō)了,我是真的苦啊,現(xiàn)在一個(gè)模型動(dòng)輒好幾億參數(shù),數(shù)據(jù)集也是大的嚇人,兄弟我內(nèi)存都快被掏空了,實(shí)在訓(xùn)練不動(dòng)了呀。”
工程師:“前方大路一起走,哪怕是河也一起過(guò)…”
計(jì)算機(jī):“你怎么還唱啊,兄弟我真的堅(jiān)持不住了。”
工程師:“擔(dān)心啥,哥有的是辦法救你,就這招吧——分布式訓(xùn)練之參數(shù)服務(wù)器!”
計(jì)算機(jī):“分布式訓(xùn)練?參數(shù)服務(wù)器?真的很好用嗎?”
工程師:“好吧,接下來(lái)我們就來(lái)看看什么是分布式訓(xùn)練參數(shù)服務(wù)器功能。”
?
什么是分布式訓(xùn)練
何謂分布式訓(xùn)練呢?大家想想《火影忍者》中鳴人搓螺旋丸的方法,要知道鳴人一個(gè)人可搓不出來(lái),他是怎么做的呢?對(duì)!影分身,再變出兩個(gè)分身來(lái)幫他一起搓丸子,分布式訓(xùn)練其實(shí)用的是相同的原理。通俗的講就是把原先交給一臺(tái)計(jì)算機(jī)上完成的訓(xùn)練任務(wù)改為交由多臺(tái)計(jì)算機(jī)完成。每臺(tái)計(jì)算機(jī)上都會(huì)有一個(gè)或多個(gè)計(jì)算單元,例如CPU、GPU、AI芯片等,合作的計(jì)算機(jī)越多,參與訓(xùn)練的計(jì)算單元也就越多。可想而知那速度肯定是噌噌的!
?
什么是參數(shù)服務(wù)器
?
如圖1所示,參數(shù)服務(wù)器是分布式訓(xùn)練領(lǐng)域普遍采用的編程架構(gòu),主要包含Server和Worker兩個(gè)部分,其中Server負(fù)責(zé)參數(shù)的存儲(chǔ)和更新,而Worker負(fù)責(zé)訓(xùn)練。飛槳的參數(shù)服務(wù)器功能也是基于這種經(jīng)典的架構(gòu)進(jìn)行設(shè)計(jì)和開(kāi)發(fā)的,同時(shí)在這基礎(chǔ)上進(jìn)行了SGD(Stochastic Gradient Descent)算法的創(chuàng)新(Geometric Stochastic Gradient Descent)。當(dāng)前經(jīng)過(guò)大量的實(shí)驗(yàn)驗(yàn)證,最佳的方案是每臺(tái)機(jī)器上啟動(dòng)Server和Worker兩個(gè)進(jìn)程,而一個(gè)Worker進(jìn)程中可以包含多個(gè)用于訓(xùn)練的線程。
圖1 參數(shù)服務(wù)器架構(gòu)示意圖
飛槳參數(shù)服務(wù)器功能支持三種模式,分別是同步訓(xùn)練模式、異步訓(xùn)練模式和GEO異步訓(xùn)練模式:
-
同步訓(xùn)練模式:如圖2所示,Worker在訓(xùn)練一個(gè)batch的數(shù)據(jù)后,會(huì)合并所有線程的梯度發(fā)給Server, Server在收到所有節(jié)點(diǎn)的梯度后,會(huì)統(tǒng)一進(jìn)行梯度合并及參數(shù)更新。同步訓(xùn)練的優(yōu)勢(shì)在于Loss可以比較穩(wěn)定的下降,缺點(diǎn)是整個(gè)訓(xùn)練速度較慢,這是典型的木桶原理,速度的快慢取決于最慢的那個(gè)線程的訓(xùn)練計(jì)算時(shí)間,因此在訓(xùn)練較為復(fù)雜的模型時(shí),即模型訓(xùn)練過(guò)程中神經(jīng)網(wǎng)絡(luò)訓(xùn)練耗時(shí)遠(yuǎn)大于節(jié)點(diǎn)間通信耗時(shí)的場(chǎng)景下,推薦使用同步訓(xùn)練模式。
圖2 同步訓(xùn)練模式示意圖
-
異步訓(xùn)練模式:如圖3所示,在訓(xùn)練一個(gè)batch的數(shù)據(jù)后,Worker的每個(gè)線程會(huì)發(fā)送梯度給Server。而Server不會(huì)等待接收所有節(jié)點(diǎn)的梯度,而是直接基于已收到的梯度進(jìn)行參數(shù)更新。異步訓(xùn)練去除了訓(xùn)練過(guò)程中的等待機(jī)制,訓(xùn)練速度得到了極大的提升,但是缺點(diǎn)也很明顯,那就是Loss下降不穩(wěn)定,容易發(fā)生抖動(dòng)。建議在個(gè)性化推薦(召回、排序)、語(yǔ)義匹配等數(shù)據(jù)量大的場(chǎng)景使用。
尤其是推薦領(lǐng)域的點(diǎn)擊率預(yù)估場(chǎng)景,該場(chǎng)景可能會(huì)出現(xiàn)千億甚至萬(wàn)億規(guī)模的稀疏特征,而稀疏參數(shù)也可以達(dá)到萬(wàn)億數(shù)量級(jí),且需要小時(shí)級(jí)或分鐘級(jí)流式增量訓(xùn)練。如果使用異步訓(xùn)練模式,可以很好的滿足該場(chǎng)景的online-learning需求。
圖3 異步訓(xùn)練模式示意圖
-
GEO異步訓(xùn)練:GEO是飛槳自研的異步訓(xùn)練模式,如圖4所示,其最大的特點(diǎn)是將參數(shù)的更新從Server轉(zhuǎn)移到Worker上。每個(gè)Worker在本地訓(xùn)練過(guò)程中會(huì)使用SGD優(yōu)化算法更新本地模型參數(shù),在訓(xùn)練若干個(gè)batch的數(shù)據(jù)后,Worker將發(fā)送參數(shù)更新信息給Server。Server在接收后會(huì)通過(guò)加和方式更新保存的參數(shù)信息。所以顯而易見(jiàn),在GEO異步訓(xùn)練模式下,Worker不用再等待Server發(fā)來(lái)新的參數(shù)即可執(zhí)行訓(xùn)練,在訓(xùn)練效果和訓(xùn)練速度上有了極大的提升。但是此模式比較適合可以在單機(jī)內(nèi)能完整保存的模型,在搜索、NLP等類型的業(yè)務(wù)上應(yīng)用廣泛,推薦在詞向量、語(yǔ)義匹配等場(chǎng)景中使用。
圖4 異步訓(xùn)練模式示意圖
經(jīng)過(guò)上述介紹,我想小伙伴們應(yīng)該對(duì)飛槳的參數(shù)服務(wù)器功能有了一定了解,可是這個(gè)參數(shù)服務(wù)器不僅包括了三種模式,還一會(huì)兒Worker一會(huì)兒Server的,用起來(lái)應(yīng)該會(huì)很復(fù)雜吧?這個(gè)請(qǐng)放心,這個(gè)用起來(lái)其實(shí)非常簡(jiǎn)單,甚至比鳴人結(jié)手印召喚影分身還要簡(jiǎn)單!
十行代碼單機(jī)轉(zhuǎn)分布式
參數(shù)服務(wù)器模式
?
飛槳的分布式訓(xùn)練功能確實(shí)是比較復(fù)雜,其不僅包含參數(shù)服務(wù)器(同步、異步、GEO)模式,還包含collective、hybrid等其它模式。為了能讓開(kāi)發(fā)者們方便得使用這些功能,飛槳的工程師們非常貼心的專門(mén)為分布式訓(xùn)練設(shè)計(jì)了一套FleetAPI接口。如圖5所示,使用FleetAPI可以輕松的將原先的單機(jī)訓(xùn)練轉(zhuǎn)換為分布式參數(shù)服務(wù)器模式:
使用RoleMaker為參與訓(xùn)練的機(jī)器創(chuàng)建Worker和Server進(jìn)程。RoleMaker有多種實(shí)現(xiàn)可適配用戶的Kubernetes、MPI等環(huán)境。
使用Strategy和distributed_optimizer配置訓(xùn)練模式、優(yōu)化函數(shù)以及計(jì)算圖的拆分方案。在拆分計(jì)算圖的過(guò)程中,Server和Worker中會(huì)被添加用于相互通信的算子。
初始化Worker和Server進(jìn)程。
圖5 FleetAPI功能示意圖
具體操作方法請(qǐng)參見(jiàn)下面的代碼示例。
如下為模型單機(jī)訓(xùn)練的代碼,為了簡(jiǎn)化說(shuō)明,這里省略了模型網(wǎng)絡(luò)定義和數(shù)據(jù)讀取等部分的代碼。
exe = Executor(place)optimizer = optimizer.Adam(learning_rate=0.001) optimizer.minimize(avg_cost) exe.run(default_startup_program())for batch_id, data in enumerate(train_reader()): avg_loss_value, auc_value = exe.run(main_program(), feed=feeder.feed(data))用戶只需要加入十行代碼即可將上面的單機(jī)訓(xùn)練過(guò)程轉(zhuǎn)換為分布式訓(xùn)練:
exe = Executor(place) #設(shè)置節(jié)點(diǎn)角色 role = role_maker.PaddleCloudRoleMaker() fleet.init(role) optimizer = optimizer.Adam(learning_rate=0.001) #配置策略 strategy = StrategyFactory.create_sync_strategy() optimizer = fleet.distributed_optimizer(optimizer, strategy) optimizer.minimize(avg_cost) # 初始化并運(yùn)行Server進(jìn)程 if fleet.is_server():fleet.init_server()fleet.run_server() # 初始化并運(yùn)行Worker進(jìn)程 if fleet.is_worker():fleet.init_worker() exe.run(fleet.startup_program) for batch_id, data in enumerate(train_reader()):avg_loss_value, auc_value = exe.run(fleet.main_program, feed=feeder.feed(data)) # 通知Server停止監(jiān)聽(tīng)Worker請(qǐng)求 fleet.stop_worker()性能遠(yuǎn)超業(yè)界同類最優(yōu)產(chǎn)品!
在訓(xùn)練效果相同的情況下,飛槳的參數(shù)服務(wù)器訓(xùn)練模式在訓(xùn)練速度上有很大優(yōu)勢(shì)。相比于業(yè)界同類最優(yōu)產(chǎn)品,參數(shù)服務(wù)器訓(xùn)練模式在相同機(jī)器數(shù)量和硬件配置條件下能夠大幅提升模型訓(xùn)練速度。
如圖6所示,在詞向量Word2Vector模型上,采用GEO訓(xùn)練模式的飛槳分布式訓(xùn)練的訓(xùn)練速度能夠超越同類最優(yōu)產(chǎn)品 18倍。
圖6 Word2Vector模型性能示意圖
在CTR-DNN模型上,如圖7所示,采用全異步訓(xùn)練的訓(xùn)練模式也能夠有6倍的速度提升。此外飛槳的推薦模型庫(kù)還提供有包括DeepFM、Deep Cross Network、Gru4Rec等一系列經(jīng)典個(gè)性化推薦類模型,方便開(kāi)發(fā)者選擇使用。
圖7 CTR-DNN模型性能示意圖
相關(guān)工具組件簡(jiǎn)介
?
飛槳參數(shù)服務(wù)器功能在提供巨大性能優(yōu)勢(shì)的同時(shí),也進(jìn)一步支持了分布式訓(xùn)練相關(guān)的工具組件給用戶使用。
-
分布式指標(biāo)功能:能夠同步所有訓(xùn)練節(jié)點(diǎn)的AUC、準(zhǔn)確率、正逆序等,統(tǒng)計(jì)出全局指標(biāo)。
-
分布式DEBUG功能:能夠有序的將所有節(jié)點(diǎn)、所有線程、每層網(wǎng)絡(luò)的參數(shù)和梯度打印到文件中,利于模型調(diào)試。
-
流式訓(xùn)練功能:能夠支持小時(shí)級(jí)流式、增量訓(xùn)練。
-
HDFS功能:封裝了Python端的HDFS客戶端,能夠方便的在分布式訓(xùn)練中使用Hadoop存儲(chǔ)功能。
業(yè)務(wù)應(yīng)用示例
飛槳參數(shù)服務(wù)器模式如今已經(jīng)在百度公司內(nèi)外得到了普遍的應(yīng)用,包括信息流、搜索等業(yè)務(wù)。下面以視頻推薦場(chǎng)景為例介紹飛槳參數(shù)服務(wù)器的幾種模式在業(yè)務(wù)中的具體應(yīng)用。
圖8 視頻推薦系統(tǒng)示意圖
如圖8所以,視頻推薦系統(tǒng)采用了漏斗模型,即召回->粗排->精排->融合的架構(gòu):
-
召回:根據(jù)用戶信息從幾百萬(wàn)視頻候選中抽取幾萬(wàn)條結(jié)果;此處模型訓(xùn)練的特點(diǎn)是特征量小、訓(xùn)練數(shù)據(jù)少、模型算法簡(jiǎn)單,因此比較適合GEO模式和同步模式。
-
粗排和精排:該過(guò)程是對(duì)召回的從幾萬(wàn)條候選信息進(jìn)行推理,推理出每條信息被點(diǎn)擊到的概率并按照概率由大到小排序,然后抽取排位最高的幾百條信息;此處模型訓(xùn)練的特點(diǎn)是特征量比較大、訓(xùn)練數(shù)據(jù)多、訓(xùn)練性能要求高,因此比較適合異步模式。
-
融合:該過(guò)程是指從幾百候選信息中抽取幾十條;此處模型訓(xùn)練的特點(diǎn)是特征量小、訓(xùn)練性能要求高,但模型算法復(fù)雜,因此比較適合使用GEO模式。
經(jīng)過(guò)實(shí)際業(yè)務(wù)驗(yàn)證,飛槳參數(shù)服務(wù)器功能可以輕松應(yīng)對(duì)千萬(wàn)級(jí)用戶數(shù)量、百億特征規(guī)模的業(yè)務(wù)場(chǎng)景。
如果您加入官方QQ群,您將遇上大批志同道合的深度學(xué)習(xí)同學(xué)。官方QQ群:703252161。
如果您想詳細(xì)了解更多飛槳的相關(guān)內(nèi)容,請(qǐng)參閱以下文檔。
官網(wǎng)地址:
https://www.paddlepaddle.org.cn
飛槳分布式訓(xùn)練項(xiàng)目地址:
https://github.com/PaddlePaddle/Fleet
飛槳個(gè)性化推薦模型項(xiàng)目地址:
https://github.com/PaddlePaddle/models/tree/develop/PaddleRec
飛槳開(kāi)源框架項(xiàng)目地址:
GitHub:https://github.com/PaddlePaddle/Paddle
Gitee: ?https://gitee.com/paddlepaddle/Paddle
?
END
總結(jié)
以上是生活随笔為你收集整理的十行代码让你的单机“影分身”,分布式训练速度快到飞起的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iOS程序猿的flutter学习之路
- 下一篇: 小米手机定价与《怪诞行为学》