帶你認識大模型訓練關鍵算法:分佈式訓練Allreduce算法

摘要:如今的模型以及其參數越發複雜,僅僅一兩張的卡已經沒法知足現現在訓練規模的要求,分佈式訓練應運而生。html

本文分享自華爲雲社區《分佈式訓練Allreduce算法》,原文做者:我抽籤必中。算法

如今的模型以及其參數越發複雜,僅僅一兩張的卡已經沒法知足現現在訓練規模的要求,分佈式訓練應運而生。服務器

分佈式訓練是怎樣的?爲何要使用Allreduce算法分佈式訓練又是如何進行通訊的?本文就帶你瞭解大模型訓練所必須的分佈式訓練Allreduce算法框架

通訊概念

咱們理解計算機的算法都是基於一個一個函數操做組合在一塊兒獲得的,那麼咱們在講解分佈式算法以前,咱們必須先了解一下組成這種算法所應用於硬件的函數操做——集合通訊的基本概念,分佈式

Broadcast(廣播):將根服務器(Root Rank)上的數據分發廣播給全部其餘服務器(Rank)ide

Drawing Drawing

如圖所示,當一臺服務器計算完成了本身部分的參數數據,在分佈式訓練中想要把本身這部分數據同時發送給其餘全部服務器,那麼這種操做方式就叫作廣播(broadcast)。函數

Scatter(散射):將根服務器上的數據散射爲同等大小的數據塊,每個其餘服務器獲得一個數據塊ui

Drawing Drawing

如圖所示,當一臺服務器計算完成本身部分的參數數據,可是由於有時候服務器上所有的參數數據過大,因而咱們想要把這臺服務器上的數據切分紅幾個同等大小的數據塊(buffer),再按照序列(rank index)向其餘服務器發送其中的一個數據塊,這就叫作散射(Scatter)。url

Gather(彙集):將其餘服務器上的數據塊直接拼接到一塊兒,根服務器(Root Rank)獲取這些數據spa

Drawing Drawing

如圖所示,當服務器都作了散射以後,每一個服務器得到了其餘服務器的一個數據塊,咱們將一臺服務器得到的數據塊拼接在一塊兒的操做就叫作彙集(Gather)。

AllGather(全彙集):全部的服務器都作上述Gather的操做,因而全部服務器都得到了所有服務器上的數據

Drawing Drawing

如圖所示,全部的服務器都將本身收到的數據塊拼接在一塊兒(都作彙集的操做),那麼就是全彙集(AllGather)。

Reduce(規約):對全部服務器上的數據作一個規約操做(如最大值、求和),再將數據寫入根服務器

Drawing

Drawing

如圖所示,當全部服務器都作廣播或散射的時候,咱們做爲接收方的服務器收到各服務器發來的數據,咱們將這些收到的數據進行某種規約的操做(常見如求和,求最大值)後再存入本身服務器內存中,那麼這就叫規約(Reduce)

AllReduce(全規約):對全部服務器上的數據作一個規約操做(如最大值、求和),再將數據寫入根服務器

Drawing Drawing

如圖所示,一樣每個服務器都完成上述的規約操做,那麼就是全規約(Allreduce)。這也就是分佈式訓練最基礎的框架,將全部的數據經過規約操做集成到各個服務器中,各個服務器也就得到了徹底一致的、包含本來全部服務器上計算參數的規約數據。

ReduceScatter(散射規約):服務器將本身的數據分爲同等大小的數據塊,每一個服務器將根據index獲得的數據作一個規約操做即,即先作Scatter再作Reduce。

image.png

概念中,咱們也經常遇到散射規約(ReduceScatter)這樣的名詞,簡單來說,就是先作散射(Scatter),將服務器中數據切分紅同等大小的數據塊,再按照序列(Rank Index),每個服務器所得到的參數數據作規約(Reduce)。這就相似於全彙集,只不過咱們將數據不是簡單拼接到一塊兒而是作了規約操做(求和或最大值等操做)。

理解各類硬件測的基本概念之後,咱們對於分佈式訓練也應該有有一些理解了,便是分佈式經過切分訓練數據,讓每一臺服務器計算他所屬的min-batch數據,再經過上述的reduce等操做進行同步,從而使得每一個服務器上的參數數據都是相同的。

分佈式通訊算法

Parameter Server(PS)算法:根服務器將數據分紅N份分到各個服務器上(Scatter),每一個服務器負責本身的那一份mini-batch的訓練,獲得梯度參數grad後,返回給根服務器上作累積(Reduce),獲得更新的權重參數後,再廣播給各個卡(broadcast)。

image.png
這是最初的分佈式通訊框架,也是在幾卡的較小規模的訓練時,一種經常使用的方法,可是顯而易見的當規模變大模型上則會出現嚴重問題:

  1. 每一輪的訓練迭代都須要全部卡都將數據同步完作一次Reduce纔算結束,並行的卡不少的時候,木桶效應就會很嚴重,一旦有一張卡速度較慢會拖慢整個集羣的速度,計算效率低。
  2. Reducer服務器任務太重,成爲瓶頸,全部的節點須要和Reducer進行數據、梯度和參數的通訊,當模型較大或者數據較大的時候,通訊開銷很大,根節點收到巨量的數據,從而造成瓶頸。

Halving and doubling(HD)算法:服務器間兩兩通訊,每步服務器均可以得到對方全部的數據,從而不斷進行,使得全部服務器所有數據。

image.png
這種算法規避了單節點瓶頸的問題,同時每一個節點都將它的發送、接受帶寬都運用起來,是目前極大大規模通訊經常使用的方式,可是它也有着它的問題,便是在最後步數中會有大量數據傳遞,使得速度變慢。

若是服務器數爲非二次冪的狀況下,以下圖13臺服務器,多出的5臺會在以前與以後作單向所有數據的通訊,其他服務器按照二次冪HD的方式進行通訊,詳情請參考Rabenseifner R.的Optimization of Collective Reduction Operations論文。可是在實用場景下,最後是將HD計算後含有全部參數數據的最大塊的數據直接粗暴地向多出來的那幾臺服務器發送,致使這步的通訊時間佔比極大。

image.png
Ring算法:以環形相連,每張卡都有左手卡和右手卡,一個負責接收,一個負責發送,循環完成梯度累積,再循環作參數同步。分爲Scatter Reduce和All Gather兩個環節。

image.png

更爲詳細的圖解
image.png

Ring算法在中等規模的運算中很是有優點,較小的傳輸數據量,無瓶頸,帶寬徹底利用起來。
缺點則是在大型規模集羣運算中,巨大的服務器內數據,極長的Ring環,Ring的這種切分數據塊的方式就再也不佔優點。

參考:

  1. http://research.baidu.com/bringing-hpc-techniques-deep-learning/
  2. https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/usage/collectives.html
  3. https://zhuanlan.zhihu.com/p/79030485
  4. Rabenseifner R. (2004) Optimization of Collective Reduction Operations. In: Bubak M., van Albada G.D., Sloot P.M.A., Dongarra J. (eds) Computational Science - ICCS 2004. ICCS 2004. Lecture Notes in Computer Science, vol 3036. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-540-24685-5_1

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索