數據並行、模型並行、流水線並行


一、數據並行(DP )

1、概念:相同的模型分布在不同的GPU上,在不同的GPU上使用不同的數據。每一張GPU上有相同的參數,在訓練的時候每一個GPU訓練不同的數據,相當於增大了訓練時候的batch_size。

  數據並行基於一個假設:所有節點都可以放下整個模型。這個假設在某些模型上(如GPT3)是不合理的,因此我們還需要模型並行。

2、並行方式:

同步訓練:每個前向、反向結束后顯示同步(把每一個GPU上的梯度進行匯總,再在GPU上進行相同的參數更新。)。

  • 實現簡單,適合同構場景;
  • 一個節點出現故障會影響整體計算性能;
  • 傳統中心化PS(Parameter Server):存在性能瓶頸(PS需要和很多的不同的節點進行通信,當集群的節點數增加的時候,會存在性能瓶頸);
  • All-Reduce:目前最廣泛采用,幾乎所有框架都支持(各個GPU反向傳播計算完梯度之后,通過一種像round all reduce環形結構,直接將參數更新);
  • 顯示訓練,在All-Reduce時時沒法進行下一步訓練的。

異步訓練:只進行部分同步或不顯示同步。

  • 適合異步訓練,可能導致潛在的收斂性問題;
  • 節點和PS通信,將梯度傳給Sever的時候,Sever直接用參數進行更新,從Sever拿到更新后的參數進行下一步訓練。當有的節點訓練快,而有的節點訓練慢,訓練快的節點訓練好后等一會就不等了,快的節點之間做一次通信后接着下一輪計算,慢的節點什么時候算好了再和其他節點一起all reduce梯度。這樣可能將梯度發送給PS的時候,從PS拿到的參數是更新了好幾個版本之后的,每個節點梯度不一樣,根據不同的參數算得的梯度再去做all reduce就有一些不合理,就會導致神經網絡精度受損。
  • 傳統異步方法:ASGD等;
  • 其他:把其中部分的計算節點組成一個組,每次在這個組之內進行梯度的匯總和更新。

3、實例:

3.1、谷歌提出的Zero Redundancy Optimizer(Zero)

問題:

  • 存儲構成:參數、梯度、優化器狀態(巨大);
  • 每個worker都進行了相同的optimizer運算,進行相同的參數更新,存在冗余。

方法:

  • 將optimizer state 進行切分,分不到不同的worker上;
  • 在每個worker分別運行不同的optimizer計算,並all-gather參數更新。

 3.2、Zero offload

  • 將部分數據和計算資源轉移到CPU上;
  • 將優化器參數同樣分散到多個CPU上;
  • 將CPU上狀態更行與Step N+ 1 的GPU上的計算重疊起來;
  • 40TFOPs/GPU on V100 for 10B model (在CPU上計算優化器狀態比較耗時,所以將通信時間進行重疊。)

 

二、模型並行(MP )

1、概念:將模型切分到不同的GPU上,將模型的參數分到不同的GPU上,每一個GPU上的參數量大大減小,這樣可以容納更大的模型進行訓練。

2、Megatron-LM:提出Transformer模型並行原語。

  • 兩種切分方式:行切分、列切分。目標:找到最優的切分方式,減少訓練過程中的通信次數。

3、分類:

  • 粗粒度並行:每個節點算不同的layer(layer之間是存在數據依賴的,這就導致在之前的節點算的時候,后面的節點干等着)。
  • 細粒度並行:將layer也做拆分。

 

三、流水線並行(PP)

1、概念:基於模型並行,一個batch結束前開始下一個batch,以充分利用計算資源。將模型按層進行切分,將不同的層放入不同的GPU,訓練的時候數據像流水一樣在GPU上進行流動。

2、切分方式:按層切分(流水線並行)、層內切分(模型並行)。

 

四、混合並行(HP)

  混合使用上述的兩種或三種方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM