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

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

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

現在的模型以及其參數愈加複雜,僅僅一兩張的卡已經無法滿足現如今訓練規模的要求,分佈式訓練應運而生。

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

通信概念

我們理解計算機的算法都是基於一個一個函數操作組合在一起得到的,那麼我們在講解分佈式算法之前,我們必須先了解一下組成這種算法所應用於硬件的函數操作——集合通信的基本概念,

Broadcast(廣播):將根服務器(Root Rank)上的數據分發廣播給所有其他服務器(Rank)

Drawing Drawing

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

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

Drawing Drawing

如圖所示,當一臺服務器計算完成自己部分的參數數據,但是因爲有時候服務器上全部的參數數據過大,於是我們想要把這臺服務器上的數據切分成幾個同等大小的數據塊(buffer),再按照序列(rank index)向其他服務器發送其中的一個數據塊,這就叫做散射(Scatter)。

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

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

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章