天天看點

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

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

本文分享自華為雲社群《分布式訓練Allreduce算法》,原文作者:我抽簽必中。

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

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

通信概念

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

Broadcast(廣播):将根伺服器(Root Rank)上的資料分發廣播給所有其他伺服器(Rank)

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

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

Scatter(散射):将根伺服器上的資料散射為同等大小的資料塊,每一個其他伺服器得到一個資料塊

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

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

Gather(聚集):将其他伺服器上的資料塊直接拼接到一起,根伺服器(Root Rank)擷取這些資料

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

如圖所示,當伺服器都做了散射之後,每個伺服器獲得了其他伺服器的一個資料塊,我們将一台伺服器獲得的資料塊拼接在一起的操作就叫做聚集(Gather)。

AllGather(全聚集):所有的伺服器都做上述Gather的操作,于是所有伺服器都獲得了全部伺服器上的資料

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

如圖所示,所有的伺服器都将自己收到的資料塊拼接在一起(都做聚集的操作),那麼就是全聚集(AllGather)。

Reduce(規約):對所有伺服器上的資料做一個規約操作(如最大值、求和),再将資料寫入根伺服器

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

如圖所示,當所有伺服器都做廣播或散射的時候,我們作為接收方的伺服器收到各伺服器發來的資料,我們将這些收到的資料進行某種規約的操作(常見如求和,求最大值)後再存入自己伺服器記憶體中,那麼這就叫規約(Reduce)

AllReduce(全規約):對所有伺服器上的資料做一個規約操作(如最大值、求和),再将資料寫入根伺服器

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

如圖所示,同樣每一個伺服器都完成上述的規約操作,那麼就是全規約(Allreduce)。這也就是分布式訓練最基礎的架構,将所有的資料通過規約操作內建到各個伺服器中,各個伺服器也就獲得了完全一緻的、包含原本所有伺服器上計算參數的規約資料。

ReduceScatter(散射規約):伺服器将自己的資料分為同等大小的資料塊,每個伺服器将根據index得到的資料做一個規約操作即,即先做Scatter再做Reduce。

概念中,我們也常常遇到散射規約(ReduceScatter)這樣的名詞,簡單來講,就是先做散射(Scatter),将伺服器中資料切分成同等大小的資料塊,再按照序列(Rank Index),每一個伺服器所獲得的參數資料做規約(Reduce)。這就類似于全聚集,隻不過我們将資料不是簡單拼接到一起而是做了規約操作(求和或最大值等操作)。

了解各種硬體測的基本概念以後,我們對于分布式訓練也應該有有一些了解了,即是分布式通過切分訓練資料,讓每一台伺服器計算他所屬的min-batch資料,再通過上述的reduce等操作進行同步,進而使得每個伺服器上的參數資料都是相同的。

分布式通信算法

Parameter Server(PS)算法:根伺服器将資料分成N份分到各個伺服器上(Scatter),每個伺服器負責自己的那一份mini-batch的訓練,得到梯度參數grad後,傳回給根伺服器上做累積(Reduce),得到更新的權重參數後,再廣播給各個卡(broadcast)。

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

這是最初的分布式通信架構,也是在幾卡的較小規模的訓練時,一種常用的方法,但是顯而易見的當規模變大模型上則會出現嚴重問題:

  1. 每一輪的訓練疊代都需要所有卡都将資料同步完做一次Reduce才算結束,并行的卡很多的時候,木桶效應就會很嚴重,一旦有一張卡速度較慢會拖慢整個叢集的速度,計算效率低。
  2. Reducer伺服器任務過重,成為瓶頸,所有的節點需要和Reducer進行資料、梯度和參數的通信,當模型較大或者資料較大的時候,通信開銷很大,根節點收到巨量的資料,進而形成瓶頸。

Halving and doubling(HD)算法:伺服器間兩兩通信,每步伺服器都可以獲得對方所有的資料,進而不斷進行,使得所有伺服器全部資料。

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

這種算法規避了單節點瓶頸的問題,同時每個節點都将它的發送、接受帶寬都運用起來,是目前極大大規模通信常用的方式,但是它也有着它的問題,即是在最後步數中會有大量資料傳遞,使得速度變慢。

如果伺服器數為非二次幂的情況下,如下圖13台伺服器,多出的5台會在之前與之後做單向全部資料的通信,其餘伺服器按照二次幂HD的方式進行通信,詳情請參考Rabenseifner R.的Optimization of Collective Reduction Operations論文。但是在實用場景下,最後是将HD計算後含有所有參數資料的最大塊的資料直接粗暴地向多出來的那幾台伺服器發送,導緻這步的通信時間占比極大。

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

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

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

更為詳細的圖解

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

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

點選關注,第一時間了解華為雲新鮮技術~

繼續閱讀