深度神經網路DNN的多GPU數據並行框架 及其在語音識別的應用

  • 深度神經網路DNN的多GPU數據並行框架 及其在語音識別的應用
  • 發表於2014-07-11 16:53| 4165次閱讀| 來源CSDN| 2 條評論| 作者騰訊大數據

    大數據神經網路語音識別DNN機器學習摘要:深度神經網路(Deep Neural Networks, 簡稱DNN)是近年來機器學習領域中的研究熱點,產生了廣泛的應用。DNN具有深層結構、數千萬參數需要學習,導致訓練非常耗時。GPU有強大的計算能力,適合加速深度神經網路訓練。

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

    1.DNN數據並行導論

    1.1.典型應用分析:語音識別

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

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

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

    1.2.現有的加速方法

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

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

    騰訊深度學習平台技術團隊考慮到上述問題,在騰訊深度學習平台的DNN多GPU並行訓練框架中,選擇了數據並行的技術路線,完成了升級版的單機多GPU數據並行版本。

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

    1.3.框架設計目標

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

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

    1.4.挑戰

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

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

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

    2.系統概述

    如何數據並行?

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

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

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

    3.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路數據並行的並行化訓練配置。

    4.數據並行中參數交換的線形拓撲

    4.1.數據並行的關鍵問題:參數交換是瓶頸

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

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

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

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

    4.2.常見的解法

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

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

    4.3.當前最優解:線形拓撲

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

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

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

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

    我們比較容易給出線形拓撲的性能模型。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,…)。可見,數據並行的並發量越大,線形拓撲的性能收益效果越顯著。

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

    5.多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完成最終累積。這樣兼顧了演算法效果和訓練性能。

    6.在語音識別上的應用

    6.1.微信語音識別產品

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

    6.2.模型訓練實驗性能

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

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

    6.3.模型準確率

    採用6 GPU數據並行,使用數十億語音訓練樣本,在訓練目標模型的實驗中,數個迭代時取得了在測試集上的最佳模型,取得了10%的字錯率降低。同時相比模型並行訓練,基於數據並行的騰訊深度學習平台可在數天內完成DNN模型訓練。

    6.4.易用性

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

    7.結論

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


    推薦閱讀:

    綠卡審理時間數據被批不實 美移民局更新查詢系統
    「數據摺疊」:人工智慧背後的人工
    部分名人名墓,理氣數據,供研習
    互聯網數據工作流
    團支書@數據團 經典作品結集出書啦~

    TAG:神經網路 | 數據 | 語音識別 | 神經 | 語音 | 框架 | 深度 | 網路 |