工程師:「在你輝煌的時刻,讓我爲你唱首歌,個人好兄弟,內心有苦你對我說。」git
計算機:「哥啊,那我可就說了,我是真的苦啊,如今一個模型動輒好幾億參數,數據集也是大的嚇人,兄弟我內存都快被掏空了,實在訓練不動了呀。」github
工程師:「前方大路一塊兒走,哪怕是河也一塊兒過…」算法
計算機:「你怎麼還唱啊,兄弟我真的堅持不住了。」編程
工程師:「擔憂啥,哥有的是辦法救你,就這招吧——分佈式訓練之參數服務器!」服務器
計算機:「分佈式訓練?參數服務器?真的很好用嗎?」網絡
工程師:「好吧,接下來咱們就來看看什麼是分佈式訓練參數服務器功能。」架構
何謂分佈式訓練呢?你們想一想《火影忍者》中鳴人搓螺旋丸的方法,要知道鳴人一我的可搓不出來,他是怎麼作的呢?對!影分身,再變出兩個分身來幫他一塊兒搓丸子,分佈式訓練其實用的是相同的原理。通俗的講就是把原先交給一臺計算機上完成的訓練任務改成交由多臺計算機完成。每臺計算機上都會有一個或多個計算單元,例如CPU、GPU、AI芯片等,合做的計算機越多,參與訓練的計算單元也就越多。可想而知那速度確定是噌噌的!框架
什麼是參數服務器異步
如圖1所示,參數服務器是分佈式訓練領域廣泛採用的編程架構,主要包含Server和Worker兩個部分,其中Server負責參數的存儲和更新,而Worker負責訓練。飛槳的參數服務器功能也是基於這種經典的架構進行設計和開發的,同時在這基礎上進行了SGD(Stochastic Gradient Descent)算法的創新(Geometric Stochastic Gradient Descent)。當前通過大量的實驗驗證,最佳的方案是每臺機器上啓動Server和Worker兩個進程,而一個Worker進程中能夠包含多個用於訓練的線程。分佈式
圖1 參數服務器架構示意圖
飛槳參數服務器功能支持三種模式,分別是同步訓練模式、異步訓練模式和GEO異步訓練模式:
圖2 同步訓練模式示意圖
異步訓練模式:如圖3所示,在訓練一個batch的數據後,Worker的每一個線程會發送梯度給Server。而Server不會等待接收全部節點的梯度,而是直接基於已收到的梯度進行參數更新。異步訓練去除了訓練過程當中的等待機制,訓練速度獲得了極大的提高,可是缺點也很明顯,那就是Loss降低不穩定,容易發生抖動。建議在個性化推薦(召回、排序)、語義匹配等數據量大的場景使用。
尤爲是推薦領域的點擊率預估場景,該場景可能會出現千億甚至萬億規模的稀疏特徵,而稀疏參數也能夠達到萬億數量級,且須要小時級或分鐘級流式增量訓練。若是使用異步訓練模式,能夠很好的知足該場景的online-learning需求。
圖3 異步訓練模式示意圖
GEO異步訓練:GEO是飛槳自研的異步訓練模式,如圖4所示,其最大的特色是將參數的更新從Server轉移到Worker上。每一個Worker在本地訓練過程當中會使用SGD優化算法更新本地模型參數,在訓練若干個batch的數據後,Worker將發送參數更新信息給Server。Server在接收後會經過加和方式更新保存的參數信息。因此顯而易見,在GEO異步訓練模式下,Worker不用再等待Server發來新的參數便可執行訓練,在訓練效果和訓練速度上有了極大的提高。可是此模式比較適合能夠在單機內能完整保存的模型,在搜索、NLP等類型的業務上應用普遍,推薦在詞向量、語義匹配等場景中使用。
圖4 異步訓練模式示意圖
通過上述介紹,我想小夥伴們應該對飛槳的參數服務器功能有了必定了解,但是這個參數服務器不只包括了三種模式,還一下子Worker一下子Server的,用起來應該會很複雜吧?這個請放心,這個用起來其實很是簡單,甚至比鳴人結手印召喚影分身還要簡單!
參數服務器模式
飛槳的分佈式訓練功能確實是比較複雜,其不只包含參數服務器(同步、異步、GEO)模式,還包含collective、hybrid等其它模式。爲了能讓開發者們方便得使用這些功能,飛槳的工程師們很是貼心的專門爲分佈式訓練設計了一套FleetAPI接口。如圖5所示,使用FleetAPI能夠輕鬆的將原先的單機訓練轉換爲分佈式參數服務器模式:
圖5 FleetAPI功能示意圖
具體操做方法請參見下面的代碼示例。
以下爲模型單機訓練的代碼,爲了簡化說明,這裏省略了模型網絡定義和數據讀取等部分的代碼。
用戶只須要加入十行代碼便可將上面的單機訓練過程轉換爲分佈式訓練:
性能遠超業界同類最優產品!
在訓練效果相同的狀況下,飛槳的參數服務器訓練模式在訓練速度上有很大優點。相比於業界同類最優產品,參數服務器訓練模式在相同機器數量和硬件配置條件下可以大幅提高模型訓練速度。
如圖6所示,在詞向量Word2Vector模型上,採用GEO訓練模式的飛槳分佈式訓練的訓練速度可以超越同類最優產品 18倍。
圖6 Word2Vector模型性能示意圖
在CTR-DNN模型上,如圖7所示,採用全異步訓練的訓練模式也可以有6倍的速度提高。此外飛槳的推薦模型庫還提供有包括DeepFM、Deep Cross Network、Gru4Rec等一系列經典個性化推薦類模型,方便開發者選擇使用。
圖7 CTR-DNN模型性能示意圖
飛槳參數服務器功能在提供巨大性能優點的同時,也進一步支持了分佈式訓練相關的工具組件給用戶使用。
飛槳參數服務器模式現在已經在百度公司內外獲得了廣泛的應用,包括信息流、搜索等業務。下面以視頻推薦場景爲例介紹飛槳參數服務器的幾種模式在業務中的具體應用。
圖8 視頻推薦系統示意圖
如圖8因此,視頻推薦系統採用了漏斗模型,即召回->粗排->精排->融合的架構:
通過實際業務驗證,飛槳參數服務器功能能夠輕鬆應對千萬級用戶數量、百億特徵規模的業務場景。
若是您加入官方QQ羣,您將趕上大批志同道合的深度學習同窗。官方QQ羣:703252161。
若是您想詳細瞭解更多飛槳的相關內容,請參閱如下文檔。
官網地址:
https://www.paddlepaddle.org.cn
飛槳分佈式訓練項目地址:
https://github.com/PaddlePaddle/Fleet
飛槳個性化推薦模型項目地址:
https://github.com/PaddlePaddle/models/tree/develop/PaddleRec
飛槳開源框架項目地址: