[深度学习] 分布式模式介绍(一)
[深度學習] 分布式模式介紹(一)
[深度學習] 分布式Tensorflow介紹(二)
[深度學習] 分布式Pytorch 1.0介紹(三)
[深度學習] 分布式Horovod介紹(四)
一? 分布式訓練策略
數據較多或者模型較大時,為提高機器學習模型訓練效率,一般采用多GPU的分布式訓練。
按照并行方式,分布式訓練一般分為數據并行和模型并行兩種, 模型并行:分布式系統中的不同GPU負責網絡模型的不同部分。例如,神經網絡模型的不同網絡層被分配到不同的GPU,或者同一層內部的不同參數被分配到不同GPU;
數據并行:不同的GPU有同一個模型的多個副本,每個GPU分配到不同的數據,然后將所有GPU的計算結果按照某種方式合并。
注意,上述中的不用GPU可以是同一臺機上的多個GPU,也可以是不用機上的GPU。
?
當然也有數據并行和模型并行的混合模式
?
因為模型并行各個部分存在一定的依賴,規模伸縮性差(意思是不能隨意增加GPU的數量),在實際訓練中用的不多。而數據并行,則各部分獨立,規模伸縮性好,實際訓練中更為常用,提速效果也更好。
數據并行會涉及到各個GPU之間同步模型參數,一般分為同步更新和異步更新。同步更新要等到所有GPU的梯度計算完成,再統一計算新權值,然后所有GPU同步新值后,才進行下一輪計算。異步更新,每個GPU梯度計算完后,無需等待其他GPU的梯度計算(有時可以設置需要等待的梯度個數),可立即更新整體權值,然后同步此權值,即可進行下一輪計算。同步更新有等待,異步更新基本沒有等待,但異步更新涉及到梯度過時等更復雜問題。
?
1.模型并行
所謂模型并行指的是將模型部署到很多設備上(設備可能分布在不同機器上,下同)運行,比如多個機器的GPUs。當神經網絡模型很大時,由于顯存限制,它是難以在跑在單個GPU上,這個時候就需要模型并行。比如Google的神經機器翻譯系統,其可能采用深度LSTM模型,如下圖所示,此時模型的不同部分需要分散到許多設備上進行并行訓練。深度學習模型一般包含很多層,如果要采用模型并行策略,一般需要將不同的層運行在不同的設備上,但是實際上層與層之間的運行是存在約束的:前向運算時,后面的層需要等待前面層的輸出作為輸入,而在反向傳播時,前面的層又要受限于后面層的計算結果。所以除非模型本身很大,一般不會采用模型并行,因為模型層與層之間存在串行邏輯。但是如果模型本身存在一些可以并行的單元,那么也是可以利用模型并行來提升訓練速度,比如GoogLeNet的Inception模塊。
?
2.數據并行
深度學習模型最常采用的分布式訓練策略是數據并行,因為訓練費時的一個重要原因是訓練數據量很大。數據并行就是在很多設備上放置相同的模型,并且各個設備采用不同的訓練樣本對模型訓練。訓練深度學習模型常采用的是batch SGD方法,采用數據并行,可以每個設備都訓練不同的batch,然后收集這些梯度用于模型參數更新。前面所說的Facebook訓練Resnet50就是采用數據并行策略,使用256個GPUs,每個GPU讀取32個圖片進行訓練,如下圖所示,這樣相當于采用非常大的batch(256 × 32 = 8192)來訓練模型。
數據并行可以是同步的(synchronous),也可以是異步的(asynchronous)。所謂同步指的是所有的設備都是采用相同的模型參數來訓練,等待所有設備的mini-batch訓練完成后,收集它們的梯度然后取均值,然后執行模型的一次參數更新。這相當于通過聚合很多設備上的mini-batch形成一個很大的batch來訓練模型,Facebook就是這樣做的,但是他們發現當batch大小增加時,同時線性增加學習速率會取得不錯的效果。同步訓練看起來很不錯,但是實際上需要各個設備的計算能力要均衡,而且要求集群的通信也要均衡,類似于木桶效應,一個拖油瓶會嚴重拖慢訓練進度,所以同步訓練方式相對來說訓練速度會慢一些。異步訓練中,各個設備完成一個mini-batch訓練之后,不需要等待其它節點,直接去更新模型的參數,這樣總體會訓練速度會快很多。但是異步訓練的一個很嚴重的問題是梯度失效問題(stale gradients),剛開始所有設備采用相同的參數來訓練,但是異步情況下,某個設備完成一步訓練后,可能發現模型參數其實已經被其它設備更新過了,此時這個梯度就過期了,因為現在的模型參數和訓練前采用的參數是不一樣的。由于梯度失效問題,異步訓練雖然速度快,但是可能陷入次優解(sub-optimal training performance)。
異步訓練和同步訓練在TensorFlow中不同點如下圖所示:
?
?
為了解決異步訓練出現的梯度失效問題,微軟提出了一種Asynchronous Stochastic Gradient Descent方法,主要是通過梯度補償來提升訓練效果。應該還有其他類似的研究,感興趣的可以深入了解一下。
?
二 分布式訓練系統架構
系統架構層包括兩種架構:
Parameter Server Architecture(就是常見的PS架構,參數服務器)
Ring-allreduce Architecture
1.Parameter server架構
在Parameter server架構(PS架構)中,集群中的節點被分為兩類:parameter server和worker。其中parameter server存放模型的參數,而worker負責計算參數的梯度。在每個迭代過程,worker從parameter sever中獲得參數,然后將計算的梯度返回給parameter server,parameter server聚合從worker傳回的梯度,然后更新參數,并將新的參數廣播給worker。
?
PS架構是深度學習最常采用的分布式訓練架構。采用同步SGD方式的PS架構如下圖所示:
?
?
2.Ring-allreduce架構
在Ring-allreduce架構中,各個設備都是worker,并且形成一個環,如下圖所示,沒有中心節點來聚合所有worker計算的梯度。在一個迭代過程,每個worker完成自己的mini-batch訓練,計算出梯度,并將梯度傳遞給環中的下一個worker,同時它也接收從上一個worker的梯度。對于一個包含N個worker的環,各個worker需要收到其它N-1個worker的梯度后就可以更新模型參數。其實這個過程需要兩個部分:scatter-reduce和allgather,百度的教程對這個過程給出了詳細的圖文解釋。百度開發了自己的allreduce框架,并將其用在了深度學習的分布式訓練中。
?
相比PS架構,Ring-allreduce架構是帶寬優化的,因為集群中每個節點的帶寬都被充分利用。此外,在深度學習訓練過程中,計算梯度采用BP算法,其特點是后面層的梯度先被計算,而前面層的梯度慢于前面層,Ring-allreduce架構可以充分利用這個特點,在前面層梯度計算的同時進行后面層梯度的傳遞,從而進一步減少訓練時間。在百度的實驗中,他們發現訓練速度基本上線性正比于GPUs數目(worker數)。
一般的多卡gpu訓練有一個很大的缺陷,就是因為每次都需要一個gpu(cpu)從其他gpu上收集訓練的梯度,然后將新的模型分發到其他gpu上。這樣的模型最大的缺陷是gpu 0的通信時間是隨著gpu卡數的增長而線性增長的。
所以就有了ring-allreduce,如下圖:
?
該算法的基本思想是取消Reducer,讓數據在gpu形成的環內流動,整個ring-allreduce的過程分為兩大步,第一步是scatter-reduce,第二步是allgather。
先說第一步:首先我們有n塊gpu,那么我們把每個gpu上的數據(均等的)劃分成n塊,并給每個gpu指定它的左右鄰居(圖中0號gpu的左鄰居是4號,右鄰居是1號,1號gpu的左鄰居是0號,右鄰居是2號……),然后開始執行n-1次操作,在第i次操作時,gpu j會將自己的第(j - i)%n塊數據發送給gpu j+1,并接受gpu j-1的(j - i - 1)%n塊數據。并將接受來的數據進行reduce操作,示意圖如下:
當n-1次操作完成后,ring-allreduce的第一大步scatter-reduce就已經完成了,此時,第i塊gpu的第(i + 1) % n塊數據已經收集到了所有n塊gpu的第(i + 1) % n塊數據,那么,再進行一次allgather就可以完成算法了。
第二步allgather做的事情很簡單,就是通過n-1次傳遞,把第i塊gpu的第(i + 1) % n塊數據傳遞給其他gpu,同樣也是在i次傳遞時,gpu j把自己的第(j - i - 1)%n塊數據發送給右鄰居,接受左鄰居的第(j - i - 2) % n數據,但是接受來的數據不需要像第一步那樣做reduce,而是直接用接受來的數據代替自己的數據就好了。
最后每個gpu的數據就變成了這樣:?
?
首先是第一步,scatter-reduce:
然后是allgather的例子:?
?
?
鏈接
https://www.jianshu.com/p/9c462bbb6628
https://www.jianshu.com/p/bf17ac9e6357
?
總結
以上是生活随笔為你收集整理的[深度学习] 分布式模式介绍(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉吉影音怎么样
- 下一篇: [深度学习] 一篇文章理解 word2v