工程師:「在你輝煌的時刻,讓我為你唱首歌,我的好兄弟,心裡有苦你對我說。」
計算機:「哥啊,那我可就說了,我是真的苦啊,現在一個模型動輒好幾億參數,數據集也是大的嚇人,兄弟我內存都快被掏空了,實在訓練不動了呀。」
工程師:「前方大路一起走,哪怕是河也一起過…」
計算機:「你怎麼還唱啊,兄弟我真的堅持不住了。」
工程師:「擔心啥,哥有的是辦法救你,就這招吧——分布式訓練之參數伺服器!」
計算機:「分布式訓練?參數伺服器?真的很好用嗎?」
工程師:「好吧,接下來我們就來看看什麼是分布式訓練參數伺服器功能。」
什麼是分布式訓練
何謂分布式訓練呢?大家想想《火影忍者》中鳴人搓螺旋丸的方法,要知道鳴人一個人可搓不出來,他是怎麼做的呢?對!影分身,再變出兩個分身來幫他一起搓丸子,分布式訓練其實用的是相同的原理。通俗的講就是把原先交給一臺計算機上完成的訓練任務改為交由多臺計算機完成。每臺計算機上都會有一個或多個計算單元,例如CPU、GPU、AI晶片等,合作的計算機越多,參與訓練的計算單元也就越多。可想而知那速度肯定是噌噌的!
什麼是參數伺服器
如圖1所示,參數伺服器是分布式訓練領域普遍採用的編程架構,主要包含Server和Worker兩個部分,其中Server負責參數的存儲和更新,而Worker負責訓練。飛槳的參數伺服器功能也是基於這種經典的架構進行設計和開發的,同時在這基礎上進行了SGD(Stochastic Gradient Descent)算法的創新(Geometric Stochastic Gradient Descent)。當前經過大量的實驗驗證,最佳的方案是每臺機器上啟動Server和Worker兩個進程,而一個Worker進程中可以包含多個用於訓練的線程。
飛槳參數伺服器功能支持三種模式,分別是同步訓練模式、異步訓練模式和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等類型的業務上應用廣泛,推薦在詞向量、語義匹配等場景中使用。
經過上述介紹,我想小夥伴們應該對飛槳的參數伺服器功能有了一定了解,可是這個參數伺服器不僅包括了三種模式,還一會兒Worker一會兒Server的,用起來應該會很複雜吧?這個請放心,這個用起來其實非常簡單,甚至比鳴人結手印召喚影分身還要簡單!
十行代碼單機轉分布式
參數伺服器模式
飛槳的分布式訓練功能確實是比較複雜,其不僅包含參數伺服器(同步、異步、GEO)模式,還包含collective、hybrid等其它模式。為了能讓開發者們方便得使用這些功能,飛槳的工程師們非常貼心的專門為分布式訓練設計了一套FleetAPI接口。如圖5所示,使用FleetAPI可以輕鬆的將原先的單機訓練轉換為分布式參數伺服器模式:
使用RoleMaker為參與訓練的機器創建Worker和Server進程。RoleMaker有多種實現可適配用戶的Kubernetes、MPI等環境。使用Strategy和distributed_optimizer配置訓練模式、優化函數以及計算圖的拆分方案。在拆分計算圖的過程中,Server和Worker中會被添加用於相互通信的算子。初始化Worker和Server進程。
性能遠超業界同類最優產品!
在訓練效果相同的情況下,飛槳的參數伺服器訓練模式在訓練速度上有很大優勢。相比於業界同類最優產品,參數伺服器訓練模式在相同機器數量和硬體配置條件下能夠大幅提升模型訓練速度。
如圖6所示,在詞向量Word2Vector模型上,採用GEO訓練模式的飛槳分布式訓練的訓練速度能夠超越同類最優產品 18倍。
在CTR-DNN模型上,如圖7所示,採用全異步訓練的訓練模式也能夠有6倍的速度提升。此外飛槳的推薦模型庫還提供有包括DeepFM、Deep Cross Network、Gru4Rec等一系列經典個性化推薦類模型,方便開發者選擇使用。
相關工具組件簡介
飛槳參數伺服器功能在提供巨大性能優勢的同時,也進一步支持了分布式訓練相關的工具組件給用戶使用。
分布式指標功能:能夠同步所有訓練節點的AUC、準確率、正逆序等,統計出全局指標。分布式DEBUG功能:能夠有序的將所有節點、所有線程、每層網絡的參數和梯度列印到文件中,利於模型調試。流式訓練功能:能夠支持小時級流式、增量訓練。HDFS功能:封裝了Python端的HDFS客戶端,能夠方便的在分布式訓練中使用Hadoop存儲功能。業務應用示例
飛槳參數伺服器模式如今已經在百度公司內外得到了普遍的應用,包括信息流、搜索等業務。下面以視頻推薦場景為例介紹飛槳參數伺服器的幾種模式在業務中的具體應用。
如圖8所以,視頻推薦系統採用了漏鬥模型,即召回->粗排->精排->融合的架構:
召回:根據用戶信息從幾百萬視頻候選中抽取幾萬條結果;此處模型訓練的特點是特徵量小、訓練數據少、模型算法簡單,因此比較適合GEO模式和同步模式。粗排和精排:該過程是對召回的從幾萬條候選信息進行推理,推理出每條信息被點擊到的概率並按照概率由大到小排序,然後抽取排位最高的幾百條信息;此處模型訓練的特點是特徵量比較大、訓練數據多、訓練性能要求高,因此比較適合異步模式。融合:該過程是指從幾百候選信息中抽取幾十條;此處模型訓練的特點是特徵量小、訓練性能要求高,但模型算法複雜,因此比較適合使用GEO模式。經過實際業務驗證,飛槳參數伺服器功能可以輕鬆應對千萬級用戶數量、百億特徵規模的業務場景。