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