AI多種並行算法
並行模型
- 模型並行( model parallelism ):分布式系統中的不同機器(GPU/CPU等)負責網絡模型的不同部分 —— 例如,神經網絡模型的不同網絡層被分配到不同的機器,或者同一層內部的不同參數被分配到不同機器;[14]
- 數據並行( data parallelism ):不同的機器有同一個模型的多個副本,每個機器分配到不同的數據,然后將所有機器的計算結果按照某種方式合並。
- 當然,還有一類是混合並行(Hybrid parallelism),在一個集群中,既有模型並行,又有數據並行,例如,可以在同一台機器上采用模型並行化(在GPU之間切分模型),在機器之間采用數據並行化。
數據並行
數據並行化式的分布式訓練,在每個工作節點上,存儲一個模型的備份,在各台機器上處理數據集的不同部分。數據並行化式訓練方法,需要組合各個工作節點的結果,在節點之間同步模型參數。各種方法之間的主要區別在於:
- 參數平均法 vs. 更新式方法
- 同步方法 vs. 異步方法
- 中心化同步 vs. 分布式同步
參數平均 model averaging
參數平均是最簡單的一種數據並行化。若采用參數平均法,訓練的過程如下所示:
- 基於模型的配置隨機初始化網絡模型參數
- 將當前這組參數分發到各個工作節點
- 在每個工作節點,用數據集的一部分數據進行訓練
- 將各個工作節點的參數的均值作為全局參數值
- 若還有訓練數據沒有參與訓練,則繼續從第二步開始
上述第二步到第四步的過程如下圖所示。在圖中,W表示神經網絡模型的參數(權重值和偏置值)。下標表示參數的更新版本,需要在各個工作節點加以區分。
參數平均法在數學意義上,等同於用單個機器進行訓練;每個工作節點處理的數據量是相等的。(實際上如果采用momentum等技術,不是嚴格相等的)
假設該集群有n個工作節點,每個節點處理m個樣本,總共是對nxm個樣本求均值。如果在單台機器上處理所有nxm個樣本,學習率設置為α,權重更新的方程為:
假設把樣本分配到n個工作節點,每個節點在m個樣本上進行學習(節點1處理樣本1,……,m,節點2處理樣本m+1,……,2m,以此類推),得到:
參數平均法聽上去非常簡單,但事實上並沒有看上去這么容易。
首先,應該如何求平均值?簡單將每輪迭代之后的參數進行平均。一旦這樣實現了,會發現此方法在計算之外的額外開銷非常巨大;網絡通信和同步的開銷許就能抵消額外機器帶來的效率收益。因此,參數平均法通常有一個大於1的平均周期averaging period(就每個節點的minibatch而言)。如果求均值周期太長,每個節點得到的局部參數更多樣化,求均值之后的模型效果非常差。想法是N個局部最小值的均值並不保證就是局部最小:
什么樣的平均的周期算是過高呢?這個問題還沒有結論性的回答,和其它超參數攪和在一起之后變得更為復雜,比如學習率、minibatch的大小,和工作節點的數量。有些初步的研究結論,建議平均的周期為每10~20個minibatch計算一次(每個工作節點),能夠取得比較好的效果。隨着平均的周期延長,模型的准確率則隨之下降。
另一類額外的復雜度則是與優化算法相關,比如adagrad,momentum和RMSProp。這些優化方法,在神經網絡的訓練過程中,能夠顯著提升收斂的特性。這些updater都有中間狀態(通常每個模型參數有1或2個狀態值)—— 需要對這些狀態值求均值嗎?對每個節點的中間狀態求均值可以加快收斂的速度,犧牲的代價則是兩倍(或者多倍)增加網絡的傳輸數據量。有些研究在參數服務器的層面應用類似的“updater”機制,而不僅僅在每個工作節點。
參考鏈接:
https://blog.csdn.net/xbinworld/article/details/74781605