十行代碼讓你的單機「影分身」,分佈式訓練速度快到飛起

工程師​:「在你輝煌的時刻,讓我爲你唱首歌,個人好兄弟,內心有苦你對我說。」算法

計算機​:「哥啊,那我可就說了,我是真的苦啊,如今一個模型動輒好幾億參數,數據集也是大的嚇人,兄弟我內存都快被掏空了,實在訓練不動了呀。」編程

工程師​:「前方大路一塊兒走,哪怕是河也一塊兒過…」服務器

計算機​:「你怎麼還唱啊,兄弟我真的堅持不住了。」網絡

工程師​:「擔憂啥,哥有的是辦法救你,就這招吧——分佈式訓練之參數服務器!」架構

計算機​:「分佈式訓練?參數服務器?真的很好用嗎?」異步

工程師​:「好吧,接下來咱們就來看看什麼是分佈式訓練參數服務器功能。」分佈式

什麼是分佈式訓練

何謂分佈式訓練呢?你們想一想《火影忍者》中鳴人搓螺旋丸的方法,要知道鳴人一我的可搓不出來,他是怎麼作的呢?對!影分身,再變出兩個分身來幫他一塊兒搓丸子,分佈式訓練其實用的是相同的原理。通俗的講就是把原先交給一臺計算機上完成的訓練任務改成交由多臺計算機完成。每臺計算機上都會有一個或多個計算單元,例如CPU、GPU、AI芯片等,合做的計算機越多,參與訓練的計算單元也就越多。可想而知那速度確定是噌噌的!函數

 

什麼是參數服務器工具

 

如圖1所示,參數服務器是分佈式訓練領域廣泛採用的編程架構,主要包含Server和Worker兩個部分,其中Server負責參數的存儲和更新,而Worker負責訓練。飛槳的參數服務器功能也是基於這種經典的架構進行設計和開發的,同時在這基礎上進行了SGD(Stochastic Gradient Descent)算法的創新(Geometric Stochastic Gradient Descent)。當前通過大量的實驗驗證,最佳的方案是每臺機器上啓動Server和Worker兩個進程,而一個Worker進程中能夠包含多個用於訓練的線程。oop

 

圖1 參數服務器架構示意圖

飛槳參數服務器功能支持三種模式,分別是同步訓練模式、異步訓練模式和GEO異步訓練模式:

  • 同步訓練模式:如圖2所示,Worker在訓練一個batch的數據後,會合並全部線程的梯度發給Server, Server在收到全部節點的梯度後,會統一進行梯度合併及參數更新。同步訓練的優點在於Loss能夠比較穩定的降低,缺點是整個訓練速度較慢,這是典型的木桶原理,速度的快慢取決於最慢的那個線程的訓練計算時間,所以在訓練較爲複雜的模型時,即模型訓練過程當中神經網絡訓練耗時遠大於節點間通訊耗時的場景下,推薦使用同步訓練模式。

 

圖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能夠輕鬆的將原先的單機訓練轉換爲分佈式參數服務器模式:

  1. 使用RoleMaker爲參與訓練的機器建立Worker和Server進程。RoleMaker有多種實現可適配用戶的Kubernetes、MPI等環境。
  2. 使用Strategy和distributed_optimizer配置訓練模式、優化函數以及計算圖的拆分方案。在拆分計算圖的過程當中,Server和Worker中會被添加用於相互通訊的算子。
  3. 初始化Worker和Server進程。

 

圖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

相關文章
相關標籤/搜索