李 梁,王 也,朱小飛
(重慶理工大學 計算機科學與工程學院,重慶 400054)
深度學習由于在語音、視覺和自然語言處理等領域的巨大成功而越來越受歡迎。有一種趨勢是使用更深、更復雜的神經網絡模型,訓練的數據集則越來越大。這樣的模型通常需要幾個小時、幾天甚至幾周才能完成訓練,分布式的訓練模型的目的就是提升模型的訓練速度[1-10]。采用遠程通信機制(RDMA)來優化[1],因為在分布式環境下,并行處理可以更快地完成計算部分,而網絡通信造成的延遲在整個過程中可能變得更加明顯,但是優化后的分布式集群則表現出了良好的性能,且隨著計算節點的增加,表現出良好的可擴展性。但是RMDA需要的是InfiniBand,因此也未必是一個直接可用的方法。Ferdinand等[2]提出對集群的性能做出一個評估,然后做出參數的設定以及節點的分配,這樣做的確可以充分利用集群的計算能力,但同時對設備的要求十分苛刻。
在本文中,重點研究隨機梯度下降法(SGD)在異構集群中的優化,其中主要流程是一組計算節點(worker),結果經過計算各自所分配的樣本,然后將計算之后的梯度反饋給參數服務器。在這里有2種方法可以將梯度反饋給參數服務器,一種是異步梯度下降法(ASGD)[3];另一種是同步梯度下降法(SSGD)[4]。SSGD往往未能實現自己的理論計算加速,是由于異構集群中各個節點的計算能力差異導致worker之間返回的梯度時間不同,而同步梯度下降法需要等待所有節點均計算完成之后才進行下一步任務,這大大減緩了模型的更新速度。因此,由于時間浪費在等待計算能力差的worker(散亂者)上,傳統的SSGD常常被認為是不切實際的。Chen等[5]提出的back up的SSGD重新審視了這些傳統觀念,并考察了這2種方法的弱點,證明了第3種方法,即與備份worker同步優化,可以避免異步噪音,同時減輕最壞的散亂者。雖然這種緩解方法利用了大部分工作節點,但其他的工作節點被丟棄,這并不是非常理想的[2]。也有學者提出了一種并行化SSGD的方法,主要想法是確定每個worker的計算時間,然后結合所有worker的不同貢獻,提供了一個收斂分析和優化組合功能,這樣做也能夠提升模型的訓練速度[11-12]。但是這樣做需要對各個節點的計算能力進行一個評估,因此牽扯的因素比較多,較為復雜。
在SSGD具備保證模型訓練準確性的前提下,提出一種參數的分配機制來解決分布式訓練同步梯度的效率問題,這樣不僅能夠提高對worker節點的利用率,而且不需要對設備提出要求即可實現,使得分布式神經網絡的訓練更方便提速。
在同步更新的時候,每次梯度更新,要等所有分發出去的數據計算完成,返回結果,把梯度累加計算均值之后,再更新參數。這樣的好處是loss的下降比較穩定,但是這個的壞處也很明顯,處理的速度取決于最慢的那個分片計算的時間,所以本文采取一個分配機制,來為計算能力差的節點減輕計算量,相反能力強的節點加重計算量。
1)合計的副本數(replicas to aggregate)
在分布式神經網絡中,同步梯度的更新是通過worker計算完成之后,一同傳遞給參數服務器,然后再梯度平均,之后更新參數,如圖1所示。

圖1 同步梯度下降法運行流程框圖
從圖1中可以看出:在梯度平均之前必須要等待GPU0到GPU n所有的計算節點計算完成的梯度。那么合計副本數是指在梯度平均時我們需要平均多少個梯度,以圖1為例,合計副本數就是n,因為我們將要平均n個梯度。
2)計算的副本數(total num replicas)
在單機單GPU的訓練中,數據的輸入是以一個batch為單位訓練的。在多GPU中,數據一次處理n個batch(假設是n個GPU訓練),每個GPU處理一個batch的數據計算。在這里,物理設備數就是n,計算的副本數也是n,因為每次需要計算n個batch,因此計算的副本數是指每次需要計算的batch的數量。
3)傳統的同步梯度下降法
傳統的方法中,合計的副本數等于計算的副本數,這兩者也都等于物理設備數。那么,每個GPU的計算時間Tnum如式(1)所示,最終消耗的時間Tf如式(2)所示。

式中:num代表物理設備數;B代表每個batch的大小;CA代表GPU的計算能力;Tnet代表網絡帶寬的耗時。從式(1)(2)中看出:最終的計算時間取決于耗時最長的GPU的計算時間加上網絡帶寬的耗時。
將基于同步梯度下降法的batch size分配機制在原有的基礎上做出新的設計與修改,具體流程如圖2所示,其中物理設備數為n,計算副本數為m,合計副本數也為m。

圖2 改進的同步梯度下降法流程框圖
1.2.1 樣本的切分
在改進的同步梯度下降法中,首先需要進行樣本的切分,這樣能夠縮小每個GPU之間的計算差異,例如以一個單位為500的batch size,2個GPU(性能差距較大)對batch進行計算,那么它們的時間差肯定是大于單位為50的batch size。但是把batch單純的設置小并不是一個合理的方案,因為這會對準確度有所影響,所以我們才進行樣本的切分,這樣就如同把單位為500的batch size替換成10個單位為50的batch一樣,等這10個batch size的梯度全部計算完成之后才開始進行更新,這樣就不會對準確率有影響。
1.2.2 容器的用途
在樣本的切分之后,把切分后的樣本存放在容器里,然后逐個分配給各個節點。由于樣本是經過切分的,所以物理設備數是不能一次分配完樣本的,因此計算的副本數是大于物理設備數的。
1.2.3 計算節點與梯度存儲器
計算節點在開始計算之后,便從容器中逐個的提取樣本,每個GPU每次輸入一個batch,計算完成之后便將梯度傳遞到梯度存儲器中,如果梯度存儲器中的梯度數量尚未達到合計的副本數,那么容器將繼續把剩余的樣本池中的一個輸入分配給剛剛上傳梯度的GPU(剛剛完成梯度計算)。如果梯度存儲器中的梯度等于合計的副本數,那么容器開始停止分配,計算節點也停止計算,梯度存儲器將梯度上傳給參數服務器。如果我們控制計算副本數與合計副本數相等,那么樣本池里的樣本是在梯度存儲器上傳梯度之前剛好完成計算的。如果我們控制計算副本數大于合計的副本數,如式(3)所示。這樣便可以加入文獻[5]中所提到的backup worker方法。
計算副本數=合計副本數+backup worker(3)
1.2.4 耗時的估算
在改進的同步梯度下降法中,各個工作節點之間不再像傳統的方法那樣,在計算完成梯度之后等待其他未完成計算的節點,而是在計算完成之后上傳梯度到梯度存儲器中,之后馬上去計算下次容器中分配的樣本,這樣做可以實現對GPU的充分利用,使得計算能力強的節點計算多個樣本,能力差的計算相對少量的樣本,從而實現模型更快速地訓練。
操作系統是Ubuntu16.04,編譯環境是python3.6,深度學習框架是TensorFlow,GPU是4塊GTX 1080Ti,相關配置為cuda9.0和cudnn7,分布式梯度更新采用同步梯度下降法。為了更好地反映出異構集群的各個節點的計算能力的差距,實驗中采用1個CPU和3個GPU構成4個計算節點,承擔worker的責任,參數服務器采用CPU作為節點,最后一塊GPU做備份節點。集群結構如圖3所示。

圖3 集群結構框圖
實驗1的實驗數據是一個帶有標注的英文短語正負情緒判斷,分別為0和1。其中每句的長度大約為40個單詞,共7 086個句子,2 324個不重復的單詞。對于這個2組語料,各抽取80%的文本作為訓練集,20%文本為測試集。神經網絡模型是循環神經網絡(RNN),網絡結構如圖4所示,其中輸入的每個張量大小為batch size*1*41,batch size是指一次訓練所需要的樣本數量,為可調控參數。神經網絡結構是2個循環神經網絡(RNN)加上1個全鏈接層和1個SoftMax函數,最終輸出預測結果。

圖4 實驗1網絡結構流程框圖
實驗2的數據則是經典的mnist手寫體數據集,訓練集有60 000個用例,即該文件里包含了60 000個標簽內容,每一個標簽的值為0~9的某個數,每張圖片在處理之后的矩陣維度為28*28的大小。其中把80%的圖片作為訓練集,20%作為測試集。其中輸入的每個張量大小為batch size*28*28*1,之后有2個block,每個block包含1個卷積層(Convolutional layer)、1個ReLu激活函數和1個池化層(Max pooling),最后外接2個全連接層(fully connected layer),最終輸出圖片的預測分類。實驗2詳細的網絡結構流程如圖5所示。

圖5 實驗2網絡結構流程框圖
實驗3的數據集為cifar10,它擁有10 000張24*24大小的彩色圖片,即圖片的通道數為3。數據集的標簽是0~9的某個數,屬于圖像分類預測問題。其中我們把80%的圖片作為訓練集,20%作為測試集。實驗3的神經網絡模型中,輸入大小是batch size*24*24*3,網絡結構包含了卷積層、空洞卷積層(Atrous Convolution)、BN層及池化層等,最終輸入圖片的預測分類,具體網絡結構流程如圖6所示。

圖6 實驗3網絡結構流程框圖
實驗4數據集為衛星圖片數據集,其中每張圖片大小為576*384,通道數為16通道,共約50萬張圖片,每張圖片大小為300萬個像素點,訓練的標簽是一種掩膜的圖片[12],其中有約300個像素點被打上標簽1,其余像素全是0,這些標簽1的位置是熱帶氣旋的坐標點。實驗4的網絡模型采用DeepLabv3+的模型[11-12],屬于圖像的語義分割,張量的輸入大小為batch size*576*384*16,網絡結構包含卷積層、池化層、空洞卷積層以及反卷積層(deconvolution layer),網絡模型引入經典的ASPP思想、殘差網絡以及encode+decoder方法[11],網絡的輸出是同等規模的掩膜圖片,通過計算miou得出熱帶氣旋的坐標覆蓋率,模型如圖7所示。

圖7 實驗4網絡結構流程框圖
針對實驗1~4的數據集以及網絡模型,通過多次實驗分別統計出了單機、多機(4個節點)以及改進之后的多機(4個節點)的耗時(單位:s),實驗結果如表1所示。

表1 實驗耗時統計結果 s
從實驗結果可以看出:多機訓練相對于單機訓練可以提升模型的訓練速度,但是由于在同步梯度下降法中的梯度的更新取決于能力最差的計算節點,所以在異構的集群中的加速效果并不理想,但是在引入所提出的優化算法之后可以大幅度提升訓練速度,在實驗1~4中均可得出相同的結論[13]。
準確率統計結果如表2所示,從圖中可以看出誤差控制在范圍之內。

表2 實驗準確率統計結果
改進的同步梯度下降法中有3個敏感參數,分別是物理設備數(n)、計算副本數(m)以及合計副本數(m)。本次實驗中的物理設備數n為4(3個GPU計算節點+1個CPU計算節點),計算副本數與合計副本數都為m,物理設備數n與m之間的關系如式(4)所示。

式中:α代表m和n之間的系數關系。針對實驗1、2、3、4對參數α進行敏感分析,實驗結果如圖8、9、10、11所示,其中橫坐標代表α參數,縱坐標代表訓練模型的耗時,圖中可以直觀地表示出α參數對訓練模型耗時的影響。

圖8 實驗1中α參數對耗時的影響曲線

圖9 實驗2中參數對耗時的影響曲線

圖10 實驗3中α參數對耗時的影響曲線

圖11 實驗4中α參數對耗時的影響曲線
對比圖8~11的參數α敏感實驗數據與表1中的多機耗時以及優化的多機耗時,發現當參數α等于1時,即物理設備數(n)=計算副本數(m)=合計副本數(m),耗時等同于傳統非優化的方法。隨著α參數的增加,各個實驗集群耗時出現降低狀況,代表優化的同步梯度下降法相比傳統方法已經表現出了更加出色的加速效果,當參數α控制在2~2.25之間,出現了訓練耗時最低的情況,這代表加速狀態到達理想最優值。隨著α參數繼續增大,耗時開始逐步提升,這表明加速效果已經過了峰值。
對實驗1~4參照圖8~11按照平均加速比的方式繪制α對加速比的影響圖,平均加速比如式(5)所示。

式中:Rα(mean)代表實驗1、2、3、4中參數α對應的平均加速比;N代表實驗序號,本次實驗中N=4;Tαi代表在第i次實驗中α參數對應的耗時;Ti(α=1)代表在第i次實驗中α=1的耗時量,即非優化的多機耗時。通過式(5)繪制出圖12,其中橫坐標代表α,縱坐標代表Rα(mean)。

圖12 α參數對應加速比曲線
圖12的實驗結果顯示:當α等于1時,Rα(mean)表示傳統方法與改進方法相同,隨著α的增大,加速比不斷提高,大約在2.25左右到達加速比最大值1.9,即表示相對傳統多機算法,改進后的算法可以提升1.9倍的模型訓練速度。
提出了一種改進的同步梯度下降法,擬在分布式神經網絡訓練中有更快速的訓練。該方法主要通過添加一個容器來實現對樣本的切分,進而使訓練模型中存在一個樣本動態分配機制,最終使各個工作節點能夠被充分利用,避免了同步梯度下降中的等待機制,克服了異構集群中各個計算節點存在差距的缺點,加速模型訓練。對于計算副本數與物理設備數之間的α參數關系,進行實驗分析,得出了能更好地控制加速模型訓練的參數。引入更復雜的備份節點以及α參數對神經網絡其他超參數的影響將是下一步的研究內容。