深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, 簡(jiǎn)稱(chēng)DNN)是近年來(lái)機(jī)器學(xué)習(xí)領(lǐng)域中的研究熱點(diǎn),產(chǎn)生了廣泛的應(yīng)用。DNN具有深層結(jié)構(gòu)、數(shù)千萬(wàn)參數(shù)需要學(xué)習(xí),導(dǎo)致訓(xùn)練非常耗時(shí)。GPU有強(qiáng)大的計(jì)算能力,適合于加速深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練。DNN的單機(jī)多GPU數(shù)據(jù)并行框架是騰訊深度學(xué)習(xí)平臺(tái)的一部分,騰訊深度學(xué)習(xí)平臺(tái)技術(shù)團(tuán)隊(duì)實(shí)現(xiàn)了數(shù)據(jù)并行技術(shù)加速DNN訓(xùn)練,提供公用算法簡(jiǎn)化實(shí)驗(yàn)過(guò)程。對(duì)微信語(yǔ)音識(shí)別應(yīng)用,在模型收斂速度和模型性能上都取得了有效提升——相比單GPU 4.6倍加速比,數(shù)十億樣本的訓(xùn)練數(shù)天收斂,測(cè)試集字錯(cuò)率降低約10%。目前基于此框架訓(xùn)練的模型成功上線(xiàn)到微信語(yǔ)音輸入法、微信語(yǔ)音開(kāi)放平臺(tái)和微信語(yǔ)音消息轉(zhuǎn)文字。
1.DNN數(shù)據(jù)并行導(dǎo)論
1.1.典型應(yīng)用分析:語(yǔ)音識(shí)別
語(yǔ)音識(shí)別是深度神經(jīng)網(wǎng)絡(luò)獲得成功的一個(gè)應(yīng)用范例。
語(yǔ)音識(shí)別應(yīng)用,簡(jiǎn)單來(lái)說(shuō)由聲學(xué)模型建模,語(yǔ)言模型建模以及解碼三部分構(gòu)成。其中聲學(xué)模型用來(lái)模擬發(fā)音的概率分布,語(yǔ)言模型用來(lái)模擬詞語(yǔ)之間的關(guān)聯(lián)關(guān)系,而解碼階段就是利用上述兩個(gè)模型,將聲音轉(zhuǎn)化為文本。神經(jīng)網(wǎng)絡(luò)具有模擬任何分布的能力,深度神經(jīng)網(wǎng)絡(luò)比淺層神經(jīng)網(wǎng)絡(luò)表達(dá)能力更強(qiáng),它模擬了人腦的深層結(jié)構(gòu),能夠更準(zhǔn)確地“理解”事物的特征。因此相較于其他方法,深度神經(jīng)網(wǎng)絡(luò)可以更為準(zhǔn)確地模擬聲學(xué)模型和語(yǔ)言模型。這里將深度神經(jīng)網(wǎng)絡(luò)應(yīng)用于語(yǔ)音識(shí)別中的聲學(xué)模型建模。
圖 1揭示了一個(gè)深度神經(jīng)網(wǎng)絡(luò)表達(dá)的具有4個(gè)隱藏層的聲學(xué)模型結(jié)構(gòu),訓(xùn)練這樣的具有深層結(jié)構(gòu)的模型,其優(yōu)勢(shì)在于逐層的特征學(xué)習(xí)過(guò)程是由初級(jí)到高級(jí)的過(guò)程:第一層學(xué)習(xí)初始特征(例如最基本的發(fā)聲),在后面的層次逐漸學(xué)習(xí)到越來(lái)越高級(jí)的特征(例如聲音的組合),直到通過(guò)模型的輸出層來(lái)有效地識(shí)別聲音。
1.2.現(xiàn)有的加速方法
騰訊深度學(xué)習(xí)平臺(tái)技術(shù)團(tuán)隊(duì)在語(yǔ)音識(shí)別研究中率先引入了GPU技術(shù)用于DNN訓(xùn)練,獲得了良好的成果,相比單臺(tái)CPU服務(wù)器達(dá)到千倍加速比。隨著訓(xùn)練數(shù)據(jù)集擴(kuò)充、模型復(fù)雜度增加,即使采用GPU加速,在實(shí)驗(yàn)過(guò)程中也存在著嚴(yán)重的性能不足,往往需要數(shù)周時(shí)間才能達(dá)到模型的收斂,不能滿(mǎn)足對(duì)于訓(xùn)練大規(guī)模網(wǎng)絡(luò)、開(kāi)展更多試驗(yàn)的需求。目前服務(wù)器上安裝多個(gè)GPU卡已經(jīng)非常普遍,在通用計(jì)算領(lǐng)域使用多GPU并行加速技術(shù)擴(kuò)展計(jì)算密集型應(yīng)用程序的并行性、提高程序性能也是越來(lái)越熱門(mén)的發(fā)展方向。
由于語(yǔ)音業(yè)務(wù)中DNN模型采用多層全連接的網(wǎng)絡(luò)結(jié)構(gòu),騰訊深度學(xué)習(xí)平臺(tái)技術(shù)團(tuán)隊(duì)在單機(jī)多GPU模型并行的實(shí)踐中發(fā)現(xiàn)拆分其模型存在較大的額外開(kāi)銷(xiāo),無(wú)論采用普通模型拆分還是流式控制,擴(kuò)展性有限:相比GPU的計(jì)算能力,如果模型參數(shù)量不能匹配,模型并行不能有效地利用多個(gè)高計(jì)算能力的GPU卡,表現(xiàn)為使用2GPU時(shí)已有較好的性能提升,但使用更多GPU卻無(wú)法取得更好效果。
騰訊深度學(xué)習(xí)平臺(tái)技術(shù)團(tuán)隊(duì)考慮到上述問(wèn)題,在騰訊深度學(xué)習(xí)平臺(tái)的DNN多GPU并行訓(xùn)練框架中,選擇了數(shù)據(jù)并行的技術(shù)路線(xiàn),完成了升級(jí)版的單機(jī)多GPU數(shù)據(jù)并行版本。
本文描述了多GPU加速深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練系統(tǒng)的數(shù)據(jù)并行實(shí)現(xiàn)方法及其性能優(yōu)化,依托多GPU的強(qiáng)大協(xié)同并行計(jì)算能力,結(jié)合數(shù)據(jù)并行特點(diǎn),實(shí)現(xiàn)快速高效的深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練。
1.3.框架設(shè)計(jì)目標(biāo)
由于訓(xùn)練深層網(wǎng)絡(luò)使用的訓(xùn)練數(shù)據(jù)規(guī)模龐大、計(jì)算開(kāi)銷(xiāo)大,從而訓(xùn)練過(guò)程收斂難,訓(xùn)練用時(shí)久,通過(guò)開(kāi)發(fā)多GPU數(shù)據(jù)并行版本期望達(dá)到下述目標(biāo):充分利用單機(jī)多GPU計(jì)算資源和DNN的數(shù)據(jù)并行特性,加速模型訓(xùn)練過(guò)程;提供默認(rèn)的深度學(xué)習(xí)算法實(shí)現(xiàn),以幫助提升語(yǔ)音識(shí)別準(zhǔn)確率;提供更好的易用性支持,方便進(jìn)行模型訓(xùn)練。
上述目標(biāo)完成后,系統(tǒng)可以支持目標(biāo)模型的快速訓(xùn)練,達(dá)到更好的收斂效果。另外,作為深度學(xué)習(xí)平臺(tái)中的DNN數(shù)據(jù)并行框架,其訓(xùn)練算法具有一定的通用性,可通過(guò)簡(jiǎn)單配置快速適用于其他DNN應(yīng)用場(chǎng)景中。
1.4.挑戰(zhàn)
在語(yǔ)音識(shí)別應(yīng)用中,深度模型包含數(shù)萬(wàn)神經(jīng)元,采用全連接結(jié)構(gòu),具有數(shù)千萬(wàn)參數(shù)需要訓(xùn)練,計(jì)算量大;需要海量語(yǔ)音數(shù)據(jù)進(jìn)行訓(xùn)練,在避免過(guò)擬合的前提下提高模型準(zhǔn)確率、提高模型泛化能力。因此,如何充分利用計(jì)算資源實(shí)施數(shù)據(jù)并行以加速訓(xùn)練是框架設(shè)計(jì)首要解決的問(wèn)題。
數(shù)據(jù)并行中參數(shù)交換容易成為整體性能瓶頸,因?yàn)樵趨?shù)交換時(shí)需要將各個(gè)Model Replica在本次mini-batch訓(xùn)練中得到的梯度合并后用于更新參數(shù)服務(wù)器上的模型,之后再將最新模型推送到各個(gè)數(shù)據(jù)并行單元上用于下一輪計(jì)算。如何解決參數(shù)交換瓶頸以提高性能,成為并行方法設(shè)計(jì)的重中之重。
自適應(yīng)學(xué)習(xí)率算法對(duì)于隨機(jī)梯度下降(Stochastic Gradient Descent, 簡(jiǎn)稱(chēng)SGD)過(guò)程有利于加速收斂并獲得更好的結(jié)果。但是它需要對(duì)模型中每個(gè)參數(shù)存儲(chǔ)helper_sum并頻繁更新對(duì)應(yīng)的學(xué)習(xí)率,影響性能。因此,如何將其有效地應(yīng)用到數(shù)據(jù)并行框架中,是我們所需要解決的另一個(gè)重點(diǎn)問(wèn)題。
2.系統(tǒng)概述
如何數(shù)據(jù)并行?
數(shù)據(jù)并行:指對(duì)源數(shù)據(jù)集合中的元素同時(shí)(即并行)執(zhí)行相同操作的情況。在數(shù)據(jù)并行操作中,將對(duì)源數(shù)據(jù)集合進(jìn)行分區(qū),以便多個(gè)并行處理單元能夠同時(shí)對(duì)不同的子數(shù)據(jù)集合進(jìn)行操作。
圖2揭示了從單GPU訓(xùn)練到多GPU數(shù)據(jù)并行訓(xùn)練的變化,主要在于:?jiǎn)蜧PU每個(gè)周期訓(xùn)練1個(gè)mini-batch,mini-batch訓(xùn)練結(jié)束后即順帶在GPU顯存中完成了更新模型參數(shù)的操作;在多個(gè)GPU同時(shí)訓(xùn)練多組mini-batch數(shù)據(jù),每個(gè)數(shù)據(jù)并行組(Worker Group)充分利用本組上獨(dú)占的GPU資源,在mini-batch訓(xùn)練結(jié)束時(shí)還需要一個(gè)將參數(shù)從各個(gè)GPU上交換并更新的過(guò)程,最終使得每個(gè)GPU上都持有最新模型副本,繼續(xù)進(jìn)行下一個(gè)周期訓(xùn)練過(guò)程。
多GPU并行系統(tǒng)從功能上劃分為用于讀取和分發(fā)數(shù)據(jù)的Training Data Dispatcher和用于做數(shù)據(jù)并行訓(xùn)練的GPU Worker Group,如圖3所示。訓(xùn)練數(shù)據(jù)從磁盤(pán)文件讀取到CPU主存再拷貝到GPU顯存,故此設(shè)計(jì)在各Worker Group計(jì)算每batch數(shù)據(jù)時(shí),由Training Data Dispatcher從文件中讀取并分發(fā)下一batch數(shù)據(jù),以達(dá)到用計(jì)算時(shí)間掩蓋I/O時(shí)間的設(shè)計(jì)目標(biāo)。
3.GPU Worker Group: 數(shù)據(jù)并行的承載體
數(shù)據(jù)并行以Worker Group為基本組織形式,調(diào)度來(lái)源于CPU,計(jì)算資源來(lái)源于GPU卡。GPU卡通常被看成是加速卡或協(xié)處理器卡,必須在基于CPU的主機(jī)上下文中被調(diào)用來(lái)做計(jì)算,因此1個(gè)CPU線(xiàn)程綁定1個(gè)Worker Group中的1張GPU卡能夠發(fā)揮多GPU的并行效能。
在實(shí)際生產(chǎn)環(huán)境中,安裝多GPU服務(wù)器的硬件體系結(jié)構(gòu)如圖4所示,示例中揭示了一個(gè)8 GPU節(jié)點(diǎn)服務(wù)器的硬件配置,每?jī)蓚€(gè)GPU Slot安裝在一個(gè)GPU專(zhuān)用PCI槽位上再通過(guò)PCIe Switch將GPU Slot 0,1,2,3安裝在一顆CPU上,GPU Slot 4,5,6,7安裝在另一顆CPU上,兩顆CPU通過(guò)IOH(Input Output Hub)連接。
在數(shù)據(jù)并行的場(chǎng)景下,將每顆GPU綁定一個(gè)Worker Group,即形成8路數(shù)據(jù)并行的并行化訓(xùn)練配置。
4.數(shù)據(jù)并行中參數(shù)交換的線(xiàn)形拓?fù)?/strong>
4.1.數(shù)據(jù)并行的關(guān)鍵問(wèn)題:參數(shù)交換是瓶頸
使用基于mini-batch的隨機(jī)梯度下降算法時(shí),每計(jì)算完成1個(gè)mini-batch后需要將本次計(jì)算得到梯度(圖中記為Δw)應(yīng)用到相應(yīng)參數(shù)(圖中記為w)上,樸素的參數(shù)更新公式為:
公式中,i是參數(shù)更新的次數(shù),weight指代某個(gè)參數(shù),ε是學(xué)習(xí)速率,Δw是本次BP計(jì)算出的梯度。
在數(shù)據(jù)并行的實(shí)現(xiàn)中,影響性能的瓶頸在于多GPU間的參數(shù)交換。這是因?yàn)榘凑諈?shù)更新公式來(lái)看,需要將所有模型replica的梯度交換到參數(shù)服務(wù)器并更新到相應(yīng)參數(shù)上,而參數(shù)服務(wù)器的帶寬成為瓶頸。
最優(yōu)化的參數(shù)交換解決方案應(yīng)具有的特征:盡量減少總的通信量;盡量減少所用交換周期數(shù);每個(gè)周期用滿(mǎn)PCIe總線(xiàn)通信帶寬;GPU間數(shù)據(jù)傳輸沒(méi)有等待;可擴(kuò)展性強(qiáng),適用于不同GPU數(shù)目的場(chǎng)景。
4.2.常見(jiàn)的解法
解決這一問(wèn)題,直觀(guān)的想法是依靠多GPU之間點(diǎn)到點(diǎn)的數(shù)據(jù)傳輸,即在每?jī)蓚€(gè)GPU之間建立數(shù)據(jù)傳輸連接,交換各自的ΔW。但是這樣的解決方案提升的性能有限,主要在于任一GPU上計(jì)算出的ΔW在PCIe總線(xiàn)上需要多次傳輸才能更新到所有GPU的參數(shù)模型上,過(guò)多占用和消耗PCIe總線(xiàn)帶寬。而隨著GPU數(shù)增多,交換時(shí)間隨之呈平方量級(jí)增加,這無(wú)疑是不適合的。
另一種常見(jiàn)思路是采用分治法+樹(shù)形結(jié)構(gòu),為此可設(shè)計(jì)樹(shù)形拓?fù)洌耗P?分片,奇/偶Worker Group負(fù)責(zé)歸并模型不同分片,Worker Group間總是兩兩歸并;當(dāng)最終將2個(gè)分片歸并結(jié)束后,開(kāi)始反向的分發(fā)過(guò)程。但在多GPU場(chǎng)景下這種也存在著局限,主要在于每個(gè)歸并周期后,總有一半GPU不再參與之后的歸并過(guò)程,閑置了其計(jì)算能力和所在節(jié)點(diǎn)上的通信帶寬。
4.3.當(dāng)前最優(yōu)解:線(xiàn)形拓?fù)?/strong>
我們針對(duì)多GPU場(chǎng)景設(shè)計(jì)了參數(shù)交換的線(xiàn)形拓?fù)洌?/p>
線(xiàn)形拓?fù)鋸目臻g上來(lái)看,如圖6所示,將存儲(chǔ)參數(shù)的矩陣、存儲(chǔ)梯度的矩陣等量劃分了Partition,Partition數(shù)量是Worker Group數(shù)的一半。令持有某一Partition最終累加結(jié)果的Worker Group(一般為Group ID為奇數(shù)的GPU),稱(chēng)之為該P(yáng)artition的Partition Owner。對(duì)該P(yáng)artition的更新參數(shù)操作會(huì)在該P(yáng)artition Owner上執(zhí)行,同時(shí)該P(yáng)artition最新參數(shù)的分發(fā)過(guò)程也由該P(yáng)artition Owner發(fā)起。
線(xiàn)形拓?fù)鋸臅r(shí)間上來(lái)看,如圖7所示,將參數(shù)交換過(guò)程劃分了周期,每個(gè)周期內(nèi)將所有Partition從上游Worker Group向下游Worker Group推送一次,推送過(guò)程包括從上游Worker Group拷貝Partition數(shù)據(jù)和本地Merge兩步操作,推送階段的最后1個(gè)周期推送該P(yáng)artition到Partition Owner上以使其持有參數(shù)的最新副本。推送所用周期數(shù)為數(shù)據(jù)并行組數(shù)-1。
之后參數(shù)分發(fā)過(guò)程,亦占用與推送相同的周期數(shù)分發(fā)Partition Owner上的最新副本給所有Worker Group。
我們比較容易給出線(xiàn)形拓?fù)涞男阅苣P?。PCIe總線(xiàn)帶寬一定(設(shè)為W),取數(shù)據(jù)并行的Worker Group數(shù)目為2N,模型大小為M。在采用點(diǎn)到點(diǎn)全量參數(shù)交換的情景下,每?jī)蓚€(gè)Worker Group均需要進(jìn)行對(duì)等的數(shù)據(jù)交換,因此數(shù)據(jù)傳輸?shù)淖疃讨芷跒?*(2N-1)次,每次在總線(xiàn)上傳輸數(shù)據(jù)量為M,故推導(dǎo)出參數(shù)交換用時(shí)2*(2N-1)*(M/W)。在采用線(xiàn)形拓?fù)涞那榫跋?,在每個(gè)組號(hào)為單數(shù)(1,3,5,…)的組上維護(hù)著整個(gè)模型參數(shù)相應(yīng)的1/N,按照線(xiàn)形拓?fù)?,單次?shù)據(jù)交換中只傳輸了(1/N)* M的數(shù)據(jù)量,參數(shù)歸并周期為2N-1,參數(shù)分發(fā)周期也為2N-1,因此推導(dǎo)出參數(shù)交換用時(shí)為2*(2N-1)*(M/(N*W)),僅是點(diǎn)到點(diǎn)用時(shí)的1/N(N=1,2,3,…)??梢?jiàn),數(shù)據(jù)并行的并發(fā)量越大,線(xiàn)形拓?fù)涞男阅苁找嫘Ч斤@著。
線(xiàn)形拓?fù)淇梢院苋菀椎財(cái)U(kuò)展到偶數(shù)個(gè)數(shù)據(jù)并行組的參數(shù)交換,其收集(推送)用時(shí)隨數(shù)據(jù)并行組數(shù)增長(zhǎng)而緩慢增長(zhǎng),且具有上界——2T0,這說(shuō)明線(xiàn)形拓?fù)浞浅_m用于更多GPU做數(shù)據(jù)并行。
5.多GPU數(shù)據(jù)并行的自適應(yīng)學(xué)習(xí)率(AdaGrad)算法
應(yīng)用自適應(yīng)學(xué)習(xí)率算法,對(duì)第i個(gè)位置上參數(shù)的學(xué)習(xí)率更新,需要借助helper_sum,其定義如下:
在數(shù)據(jù)并行情景下,helper_sum的跨組更新規(guī)則與的數(shù)據(jù)并行參數(shù)交換過(guò)程中的推送階段完全相同,由于梯度是在Partition Owner上最先持有的完全累積結(jié)果,可以根據(jù)Adagrad參數(shù)更新公式Apply到參數(shù)上,而這時(shí)只用到了Partition Owner上的helper_sum,因此只需要在Partition Owner上持有其“Own”的Partition的最新helper_sum即可,其它非Partition Owner在推送之后即需要將helper_sum清零,以便為下一次計(jì)算重新累積所用。由于helper_sum不需要分發(fā),則交換helper_sum的過(guò)程只需要一次推送階段即可完成。
結(jié)合Adagrad算法實(shí)際應(yīng)用場(chǎng)景:即helper_sum的累積其實(shí)是對(duì)每個(gè)學(xué)習(xí)率調(diào)整的量化過(guò)程,其本身具有一定的近似性?;谛阅芸剂?,實(shí)際項(xiàng)目中使用一種近似的helper_sum收集:在每個(gè)mini-batch結(jié)束后所有partition上做本地累積helper_sum計(jì)算,而在M個(gè)mini-batch結(jié)束后才將其推送到所屬的Partition Owner完成最終累積。這樣兼顧了算法效果和訓(xùn)練性能。
6.在語(yǔ)音識(shí)別上的應(yīng)用
6.1.微信語(yǔ)音識(shí)別產(chǎn)品
微信中主要有三款語(yǔ)音識(shí)別產(chǎn)品:微信語(yǔ)音輸入法、語(yǔ)音開(kāi)放平臺(tái)和語(yǔ)音消息轉(zhuǎn)文字。多GPU數(shù)據(jù)并行框架訓(xùn)練的模型正在由這些產(chǎn)品使用。
6.2.模型訓(xùn)練實(shí)驗(yàn)性能
實(shí)驗(yàn)環(huán)境為一臺(tái)搭載8核心Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz的服務(wù)器,內(nèi)存為48GB,服務(wù)器安裝了6塊NVIDIA Tesla K20c GPU,單GPU顯存大小為4.8GB。
訓(xùn)練同樣的語(yǔ)音目標(biāo)模型,相比于單GPU,使用6GPU數(shù)據(jù)并行獲得了4.6倍加速比。
6.3.模型準(zhǔn)確率
采用6 GPU數(shù)據(jù)并行,使用數(shù)十億語(yǔ)音訓(xùn)練樣本,在訓(xùn)練目標(biāo)模型的實(shí)驗(yàn)中,數(shù)個(gè)迭代時(shí)取得了在測(cè)試集上的最佳模型,取得了10%的字錯(cuò)率降低。同時(shí)相比模型并行訓(xùn)練,基于數(shù)據(jù)并行的騰訊深度學(xué)習(xí)平臺(tái)可在數(shù)天內(nèi)完成DNN模型訓(xùn)練。
6.4.易用性
框架提供良好的易用性支持,主要在于實(shí)驗(yàn)者不需要過(guò)多干預(yù)訓(xùn)練過(guò)程即可完成訓(xùn)練,實(shí)時(shí)獲知訓(xùn)練進(jìn)度和模型準(zhǔn)確率等信息??蚣苤饕囊子眯灾С职ǎ褐匾渲脜?shù)在運(yùn)行時(shí)可手工改變,可自動(dòng)衰減;按指定頻率輸出模型snapshot并進(jìn)行自動(dòng)化測(cè)試;訓(xùn)練中斷點(diǎn)恢復(fù),可從任意模型snapshot繼續(xù)訓(xùn)練;微信監(jiān)控賬號(hào)自動(dòng)向?qū)嶒?yàn)者推送測(cè)試結(jié)果。
7.結(jié)論
本文描述了深度神經(jīng)網(wǎng)絡(luò)DNN的多GPU數(shù)據(jù)并行框架,通過(guò)多個(gè)Worker Group實(shí)現(xiàn)了數(shù)據(jù)并行,設(shè)計(jì)線(xiàn)形拓?fù)浣鉀Q了參數(shù)交換性能瓶頸,實(shí)現(xiàn)了數(shù)據(jù)并行場(chǎng)景下的近似自適應(yīng)學(xué)習(xí)率算法。此框架有效支持了微信語(yǔ)音識(shí)別,成功提升了微信語(yǔ)音識(shí)別的模型訓(xùn)練速度,并且模型字錯(cuò)率降低10%,模型全量上線(xiàn)到微信語(yǔ)音輸入法、微信語(yǔ)音開(kāi)放平臺(tái)和微信語(yǔ)音消息轉(zhuǎn)文字。
聯(lián)系客服