深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

jopen 9年前發布 | 50K 次閱讀 深度學習 機器學習

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

本文是騰訊深度學習系列文章的第二篇,聚焦于騰訊深度學習平臺Mariana中深度神經網絡DNN的多GPU數據并行框架。

 

深度神經網絡(Deep Neural Networks, 簡稱DNN)是近年來機器學習領域中的研究熱點[1][2],產生了廣泛的應用。DNN具有深層結構、數千萬參數需要學習,導致訓練非常耗時。GPU有強 大的計算能力,適合于加速深度神經網絡訓練。DNN的單機多GPU數據并行框架是Mariana的一部分,Mariana技術團隊實現了數據并行技術加速 DNN訓練,提供公用算法簡化實驗過程。對微信語音識別應用,在模型收斂速度和模型性能上都取得了有效提升——相比單GPU 4.6倍加速比,數十億樣本的訓練數天收斂,測試集字錯率降低約10%。目前基于此框架訓練的模型成功上線到微信語音輸入法、微信語音開放平臺和微信語音 消息轉文字。

DNN數據并行導論

典型應用分析:語音識別

語音識別是深度神經網絡獲得成功的一個應用范例。

語音識別應用,簡單來說由聲學模型建模,語言模型建模以及解碼三部分構成。其中聲學模型用來模擬發音的概率分布,語言模型用來模擬詞語之間的關聯關 系,而解碼階段就是利用上述兩個模型,將聲音轉化為文本。神經網絡具有模擬任何分布的能力,深度神經網絡比淺層神經網絡表達能力更強,它模擬了人腦的深層 結構,能夠更準確地“理解”事物的特征。因此相較于其他方法,深度神經網絡可以更為準確地模擬聲學模型和語言模型。這里將深度神經網絡應用于語音識別中的 聲學模型建模。

圖 1揭示了一個深度神經網絡表達的具有4個隱藏層的聲學模型結構,訓練這樣的具有深層結構的模型,其優勢在于逐層的特征學習過程是由初級到高級的過程:第一 層學習初始特征(例如最基本的發聲),在后面的層次逐漸學習到越來越高級的特征(例如聲音的組合),直到通過模型的輸出層來有效地識別聲音。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)
圖1深層、稠密、包含4隱藏層的聲學模型

現有的加速方法

Mariana技術團隊在語音識別研究中率先引入了GPU技術用于DNN訓練,獲得了良好的成果,相比單臺CPU服務器達到千倍加速比。隨著訓練數 據集擴充、模型復雜度增加,即使采用GPU加速,在實驗過程中也存在著嚴重的性能不足,往往需要數周時間才能達到模型的收斂,不能滿足對于訓練大規模網 絡、開展更多試驗的需求。目前服務器上安裝多個GPU卡已經非常普遍,在通用計算領域使用多GPU并行加速技術[3]擴展計算密集型應用程序的并行性、提 高程序性能也是越來越熱門的發展方向。

由于語音業務中DNN模型采用多層全連接的網絡結構,Mariana技術團隊在單機多GPU模型并行的實踐中發現拆分其模型存在較大的額外開銷,無 論采用普通模型拆分還是流式控制,擴展性有限:相比GPU的計算能力,如果模型參數量不能匹配,模型并行不能有效地利用多個高計算能力的GPU卡,表現為 使用2GPU時已有較好的性能提升,但使用更多GPU卻無法取得更好效果。

Mariana技術團隊考慮到上述問題,在Mariana的DNN多GPU并行訓練框架中,選擇了數據并行的技術路線,完成了升級版的單機多GPU數據并行版本。

本文描述了多GPU加速深度神經網絡訓練系統的數據并行實現方法及其性能優化,依托多GPU的強大協同并行計算能力,結合數據并行特點,實現快速高效的深度神經網絡訓練。

框架設計目標

由于訓練深層網絡使用的訓練數據規模龐大、計算開銷大,從而訓練過程收斂難,訓練用時久,通過開發多GPU數據并行版本期望達到下述目標:充分利用 單機多GPU計算資源和DNN的數據并行特性,加速模型訓練過程;提供默認的深度學習算法實現,以幫助提升語音識別準確率;提供更好的易用性支持,方便進 行模型訓練。

上述目標完成后,系統可以支持目標模型的快速訓練,達到更好的收斂效果。另外,作為Mariana中的DNN數據并行框架,其訓練算法具有一定的通用性,可通過簡單配置快速適用于其他DNN應用場景中。

挑戰

在語音識別應用中,深度模型包含數萬神經元,采用全連接結構,具有數千萬參數需要訓練,計算量大;需要海量語音數據進行訓練,在避免過擬合的前提下提高模型準確率、提高模型泛化能力。因此,如何充分利用計算資源實施數據并行以加速訓練是框架設計首要解決的問題。

數據并行中參數交換容易成為整體性能瓶頸,因為在參數交換時需要將各個Model Replica在本次mini-batch訓練中得到的梯度合并后用于更新參數服務器上的模型,之后再將最新模型推送到各個數據并行單元上用于下一輪計 算。如何解決參數交換瓶頸以提高性能,成為并行方法設計的重中之重。

自適應學習率算法[4]對于隨機梯度下降(Stochastic Gradient Descent, 簡稱SGD)過程有利于加速收斂并獲得更好的結果。但是它需要對模型中每個參數存儲helper_sum并頻繁更新對應的學習率,影響性能。因此,如何將 其有效地應用到數據并行框架中,是我們所需要解決的另一個重點問題。

系統概述

如何數據并行?

數據并行:指對源數據集合中的元素同時(即并行)執行相同操作的情況。在數據并行操作中,將對源數據集合進行分區,以便多個并行處理單元能夠同時對不同的子數據集合進行操作。

圖2揭示了從單GPU訓練到多GPU數據并行訓練的變化,主要在于:單GPU每個周期訓練1個mini-batch,mini-batch訓練結束 后即順帶在GPU顯存中完成了更新模型參數的操作;在多個GPU同時訓練多組mini-batch數據,每個數據并行組(Worker Group)充分利用本組上獨占的GPU資源,在mini-batch訓練結束時還需要一個將參數從各個GPU上交換并更新的過程,最終使得每個GPU上 都持有最新模型副本,繼續進行下一個周期訓練過程。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)
圖2從單GPU訓練到多GPU數據并行訓練的概要視圖

多GPU并行系統從功能上劃分為用于讀取和分發數據的Training Data Dispatcher和用于做數據并行訓練的GPU Worker Group,如圖3所示。訓練數據從磁盤文件讀取到CPU主存再拷貝到GPU顯存,故此設計在各Worker Group計算每batch數據時,由Training Data Dispatcher從文件中讀取并分發下一batch數據,以達到用計算時間掩蓋I/O時間的設計目標。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)
圖3 2 GPU數據并行系統框架示意

GPU Worker Group: 數據并行的承載體

數據并行以Worker Group為基本組織形式,調度來源于CPU,計算資源來源于GPU卡。GPU卡通常被看成是加速卡或協處理器卡,必須在基于CPU的主機上下文中被調用 來做計算,因此1個CPU線程綁定1個Worker Group中的1張GPU卡能夠發揮多GPU的并行效能。

在實際生產環境中,安裝多GPU服務器的硬件體系結構如圖4所示,示例中揭示了一個8 GPU節點服務器的硬件配置,每兩個GPU Slot安裝在一個GPU專用PCI槽位上再通過PCIe Switch將GPU Slot 0,1,2,3安裝在一顆CPU上,GPU Slot 4,5,6,7安裝在另一顆CPU上,兩顆CPU通過IOH(Input Output Hub)連接。

在數據并行的場景下,將每顆GPU綁定一個Worker Group,即形成8路數據并行的并行化訓練配置。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

數據并行中參數交換的線形拓撲

數據并行的關鍵問題:參數交換是瓶頸

使用基于mini-batch的隨機梯度下降算法時,每計算完成1個mini-batch后需要將本次計算得到梯度(圖中記為Δw)應用到相應參數(圖中記為w)上,樸素的參數更新公式為:

公式中,i是參數更新的次數,weight指代某個參數,ε是學習速率,Δw是本次BP計算出的梯度。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

圖5 Model Replicas參數交換過程示意

在數據并行的實現中,影響性能的瓶頸在于多GPU間的參數交換。這是因為按照參數更新公式來看,需要將所有模型replica的梯度交換到參數服務器并更新到相應參數上,而參數服務器的帶寬成為瓶頸。

最優化的參數交換解決方案應具有的特征:盡量減少總的通信量;盡量減少所用交換周期數;每個周期用滿PCIe總線通信帶寬;GPU間數據傳輸沒有等待;可擴展性強,適用于不同GPU數目的場景。

常見的解法

解決這一問題,直觀的想法是依靠多GPU之間點到點的數據傳輸,即在每兩個GPU之間建立數據傳輸連接,交換各自的ΔW。但是這樣的解決方案提升的 性能有限,主要在于任一GPU上計算出的ΔW在PCIe總線上需要多次傳輸才能更新到所有GPU的參數模型上,過多占用和消耗PCIe總線帶寬。而隨著 GPU數增多,交換時間隨之呈平方量級增加,這無疑是不適合的。

另一種常見思路是采用分治法+樹形結構,為此可設計樹形拓撲:模型2分片,奇/偶Worker Group負責歸并模型不同分片,Worker Group間總是兩兩歸并;當最終將2個分片歸并結束后,開始反向的分發過程。但在多GPU場景下這種也存在著局限,主要在于每個歸并周期后,總有一半 GPU不再參與之后的歸并過程,閑置了其計算能力和所在節點上的通信帶寬。

當前最優解:線形拓撲

我們針對多GPU場景設計了參數交換的線形拓撲:

線形拓撲從空間上來看,如圖6所示,將存儲參數的矩陣、存儲梯度的矩陣等量劃分了Partition,Partition數量是Worker Group數的一半。令持有某一Partition最終累加結果的Worker Group(一般為Group ID為奇數的GPU),稱之為該Partition的Partition Owner。對該Partition的更新參數操作會在該Partition Owner上執行,同時該Partition最新參數的分發過程也由該Partition Owner發起。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

圖6 Partition拆分及Partition Owner分布示意

線形拓撲從時間上來看,如圖7所示,將參數交換過程劃分了周期,每個周期內將所有Partition從上游Worker Group向下游Worker Group推送一次,推送過程包括從上游Worker Group拷貝Partition數據和本地Merge兩步操作,推送階段的最后1個周期推送該Partition到Partition Owner上以使其持有參數的最新副本。推送所用周期數為數據并行組數-1。

之后參數分發過程,亦占用與推送相同的周期數分發Partition Owner上的最新副本給所有Worker Group。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

圖7線形拓撲參數交換全部過程

我們比較容易給出線形拓撲的性能模型。PCIe總線帶寬一定(設為W),取數據并行的Worker Group數目為2N,模型大小為M。在采用點到點全量參數交換的情景下,每兩個Worker Group均需要進行對等的數據交換,因此數據傳輸的最短周期為2(2N-1)次,每次在總線上傳輸數據量為M,故推導出參數交換用時2(2N-1) (M/W)。在采用線形拓撲的情景下,在每個組號為單數(1,3,5,…)的組上維護著整個模型參數相應的1/N,按照線形拓撲,單次數據交換中只傳輸了 (1/N) M的數據量,參數歸并周期為2N-1,參數分發周期也為2N-1,因此推導出參數交換用時為2(2N-1)(M/(N*W)),僅是點到點用時的1 /N(N=1,2,3,…)。可見,數據并行的并發量越大,線形拓撲的性能收益效果越顯著。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

表1線形拓撲的性能分析

線形拓撲可以很容易地擴展到偶數個數據并行組的參數交換,其收集(推送)用時隨數據并行組數增長而緩慢增長,且具有上界——2T0,這說明線形拓撲非常適用于更多GPU做數據并行。

多GPU數據并行的自適應學習率(AdaGrad)算法

應用自適應學習率算法,對第i個位置上參數的學習率更新,需要借助helper_sum,其定義如下:

在數據并行情景下,helper_sum的跨組更新規則與的數據并行參數交換過程中的推送階段完全相同,由于梯度是在Partition Owner上最先持有的完全累積結果,可以根據Adagrad參數更新公式Apply到參數上,而這時只用到了Partition Owner上的helper_sum,因此只需要在Partition Owner上持有其“Own”的Partition的最新helper_sum即可,其它非Partition Owner在推送之后即需要將helper_sum清零,以便為下一次計算重新累積所用。由于helper_sum不需要分發,則交換 helper_sum的過程只需要一次推送階段即可完成。

結合Adagrad算法實際應用場景:即helper_sum的累積其實是對每個學習率調整的量化過程,其本身具有一定的近似性。基于性能考量,實 際項目中使用一種近似的helper_sum收集:在每個mini-batch結束后所有partition上做本地累積helper_sum計算,而在 M個mini-batch結束后才將其推送到所屬的Partition Owner完成最終累積。這樣兼顧了算法效果和訓練性能。

在語音識別上的應用

微信語音識別產品

微信中主要有三款語音識別產品:微信語音輸入法、語音開放平臺和語音消息轉文字。多GPU數據并行框架訓練的模型正在由這些產品使用。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)
微信語音輸入法

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

語音消息轉文字

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)

圖8微信語音識別產品

模型訓練實驗性能

實驗環境為一臺搭載8核心Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz的服務器,內存為48GB,服務器安裝了6塊NVIDIA Tesla K20c GPU,單GPU顯存大小為4.8GB。

訓練同樣的語音目標模型,相比于單GPU,使用6 GPU數據并行獲得了4.6倍加速比。

模型準確率

采用6 GPU數據并行,使用數十億語音訓練樣本,在訓練目標模型的實驗中,數個迭代時取得了在測試集上的最佳模型,取得了10%的字錯率降低。同時相比模型并行訓練,基于數據并行的Mariana可在數天內完成DNN模型訓練。

易用性

框架提供良好的易用性支持,主要在于實驗者不需要過多干預訓練過程即可完成訓練,實時獲知訓練進度和模型準確率等信息。框架主要的易用性支持包括: 重要配置參數在運行時可手工改變,可自動衰減;按指定頻率輸出模型snapshot并進行自動化測試;訓練中斷點恢復,可從任意模型snapshot繼續 訓練;微信監控帳號自動向實驗者推送測試結果。

深度學習系列:Mariana DNN多GPU數據并行框架 微信語音是怎么來的?(二)
圖9微信監控帳號自動推送測試結果

結論

本文描述了騰訊深度學習平臺Mariana中深度神經網絡DNN的多GPU數據并行框架,通過多個Worker Group實現了數據并行,設計線形拓撲解決了參數交換性能瓶頸,實現了數據并行場景下的近似自適應學習率算法。此框架有效支持了微信語音識別,成功提升 了微信語音識別的模型訓練速度,并且模型字錯率降低10%,模型全量上線到微信語音輸入法、微信語音開放平臺和微信語音消息轉文字。

參考文獻

[1] Hinton G.E., Osindero S. and Teh Y. (2006) A Fast Learning Algorithm for Deep Belief Nets. Neural Computation, 2006.

[2] Hinton, G. E. and Salakhutdinov, R. R. (2006) Reducing the Dimensionality of Data with Neural Networks. Science, Vol. 313, No. 5786, pp. 504-507, 28 July 2006.

[3] David B. Kirk, Wen-mei Hwu. 大規模處理器編程實戰(第2版). 清華大學出版社, 2013.

[4] J. Duchi, E. Hazan and Y. Singer. (2011) Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine learning Research, 12(2011): 2121-2159, 2011.

[5] Jeffrey Dean, Greg S. Corrado, Rajat Monga, et al, and Andrew Y. Ng. (2012) Large Scale Distributed Deep Networks. In Advances in Neural Information Processing 25 (NIPS 2012), MIT Press, Cambridge, MA.

via:騰訊大講堂

End.

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!