李垠橋,阿敏巴雅爾,肖 桐,薄 樂(lè),朱靖波,張 俐
(東北大學(xué) 自然語(yǔ)言處理實(shí)驗(yàn)室,遼寧 沈陽(yáng) 110819)
使用神經(jīng)網(wǎng)絡(luò)進(jìn)行語(yǔ)言建模依賴于大規(guī)模的語(yǔ)料數(shù)據(jù),同時(shí)更大規(guī)模的參數(shù)設(shè)置一般來(lái)說(shuō)也會(huì)對(duì)神經(jīng)語(yǔ)言模型的訓(xùn)練有著正向的作用[1-3]。但當(dāng)面對(duì)海量的數(shù)據(jù)和大規(guī)模的網(wǎng)絡(luò)參數(shù)時(shí),如何更加快速地進(jìn)行模型訓(xùn)練便成了一個(gè)亟待解決的問(wèn)題。
針對(duì)此問(wèn)題,研究人員引入了GPU加快矩陣運(yùn)算,為了進(jìn)一步獲得速度提升,訓(xùn)練也開始從單一設(shè)備轉(zhuǎn)變到多設(shè)備并行。其主要方法有兩種,數(shù)據(jù)并行和模型并行[4]。本文主要針對(duì)數(shù)據(jù)并行進(jìn)行研究,該方法將數(shù)據(jù)分成若干部分,在多個(gè)設(shè)備上進(jìn)行訓(xùn)練,以達(dá)到加速的效果。但該方法的簡(jiǎn)單實(shí)現(xiàn)并未達(dá)到令人滿意的速度提升[5],問(wèn)題在于訓(xùn)練過(guò)程中,設(shè)備間的數(shù)據(jù)傳輸占用大量時(shí)間。實(shí)驗(yàn)中,我們使用四張NVIDIA TITAN X (Pascal)GPU卡對(duì)循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,數(shù)據(jù)傳輸?shù)臅r(shí)間占比高達(dá)70%??梢钥闯鰷p小這部分耗時(shí)成為解決多設(shè)備訓(xùn)練中的重要問(wèn)題。
科研人員針對(duì)如何在單位時(shí)間內(nèi)傳輸大量的數(shù)據(jù)進(jìn)行了研究,提出了許多可行的方法,如異步參數(shù)更新[6]、基于采樣的更新[7]等。本文主要針對(duì)使用All-Reduce算法以及采樣策略的神經(jīng)網(wǎng)絡(luò)梯度更新進(jìn)行實(shí)驗(yàn),在不同設(shè)備數(shù)量下訓(xùn)練前饋神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)語(yǔ)言模型[8],對(duì)比分析時(shí)間消耗隨設(shè)備數(shù)量的變化趨勢(shì)。實(shí)驗(yàn)中,使用上述兩種方法訓(xùn)練的循環(huán)神經(jīng)語(yǔ)言模型相對(duì)點(diǎn)對(duì)點(diǎn)結(jié)構(gòu)在四張NVIDIA TITAN X (Pascal)GPU設(shè)備環(huán)境下分別可節(jié)約25%和41%左右的時(shí)間。
數(shù)據(jù)并行的方法最早由Jeffrey Dean等人提出[4],將數(shù)據(jù)分散到不同的設(shè)備中訓(xùn)練,過(guò)程如圖1所示,參數(shù)按照式(1)進(jìn)行更新。
(1)
圖1 數(shù)據(jù)并行訓(xùn)練與單設(shè)備訓(xùn)練過(guò)程對(duì)比
1.2.1 點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳輸
點(diǎn)對(duì)點(diǎn)數(shù)據(jù)傳輸是一種常見的參數(shù)同步策略,采用中心化結(jié)構(gòu),如圖2(a)所示。網(wǎng)絡(luò)中設(shè)置一個(gè)參數(shù)服務(wù)器,保存全局的網(wǎng)絡(luò)參數(shù),其余每臺(tái)設(shè)備在計(jì)算好自己的權(quán)重梯度后將其發(fā)送給參數(shù)服務(wù)器,然后進(jìn)入等待狀態(tài)。參數(shù)服務(wù)器端收集到全部設(shè)備的梯度后,將它們累加到自身的網(wǎng)絡(luò)參數(shù)上,之后再將這個(gè)更新后的參數(shù)值返回給每個(gè)計(jì)算設(shè)備,完成一個(gè)minibatch的更新。整個(gè)過(guò)程如圖3所示,主要分為梯度計(jì)算、梯度收集、更新模型和回傳參數(shù)四個(gè)部分。
圖2 基于點(diǎn)對(duì)點(diǎn)、All-Reduce的梯度更新結(jié)構(gòu)
圖3 基于點(diǎn)對(duì)點(diǎn)的梯度更新計(jì)算時(shí)序
由于計(jì)算機(jī)總線帶寬有限,因此和數(shù)據(jù)傳輸相關(guān)的操作會(huì)花費(fèi)較多時(shí)間。假設(shè)網(wǎng)絡(luò)中計(jì)算梯度的設(shè)備數(shù)量為n,每個(gè)設(shè)備上所需傳輸?shù)臄?shù)據(jù)量大小是K,網(wǎng)絡(luò)中數(shù)據(jù)傳輸?shù)目偩€帶寬是B,那么在梯度收集和回傳參數(shù)過(guò)程中產(chǎn)生的時(shí)間消耗如式(2)所示。
(2)
我們可以看出,隨著設(shè)備數(shù)量n的增加,傳輸?shù)臅r(shí)間消耗也隨之線性增長(zhǎng),這導(dǎo)致很難通過(guò)簡(jiǎn)單地增加設(shè)備數(shù)量獲得線性增長(zhǎng)的運(yùn)算速度,難以在更多設(shè)備上對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。
1.2.2 基于All-Reduce的數(shù)據(jù)傳輸
為減輕參數(shù)服務(wù)器在數(shù)據(jù)傳輸過(guò)程中的壓力,Linnan Wang等人提出使用All-Reduce算法進(jìn)行梯度的傳遞[9],結(jié)構(gòu)如圖2(b)所示。
整個(gè)網(wǎng)絡(luò)以環(huán)狀結(jié)構(gòu)進(jìn)行傳輸,起初每個(gè)設(shè)備節(jié)點(diǎn)將自身的梯度數(shù)組分成n份,n為環(huán)形結(jié)構(gòu)中設(shè)備節(jié)點(diǎn)的數(shù)量。在第一階段,設(shè)備節(jié)點(diǎn)將依次發(fā)送每一塊數(shù)據(jù)到其下一順位的設(shè)備,并從上一個(gè)節(jié)點(diǎn)接收一個(gè)塊,累積進(jìn)本設(shè)備的對(duì)應(yīng)位置。執(zhí)行n-1次后,每個(gè)設(shè)備中將擁有一個(gè)累加了全部設(shè)備上對(duì)應(yīng)位次數(shù)據(jù)的塊,之后進(jìn)入第二階段。每個(gè)設(shè)備依次發(fā)送自身?yè)碛凶罱K結(jié)果的數(shù)據(jù)塊到下一位序的設(shè)備,同時(shí)根據(jù)接收到的數(shù)據(jù)塊進(jìn)行覆蓋更新,同樣該步驟按序執(zhí)行n-1次后,網(wǎng)絡(luò)中每個(gè)設(shè)備均將獲得最終的累加結(jié)果。算法流程如算法1所示。
算法1: 使用All-Reduce進(jìn)行梯度累加輸入: 設(shè)備數(shù)量n(>1),梯度向量grad1blocks = split(grad, n)2for i = n → 2 do3 send(next, block[(i+devID]%n])4 recv_block = recv()5 block[(i+devID-1)%n]+=recv_block6end for7for i = n → 2 do8 send(next, block[(i+devID+1)%n])9 recv_block = recv()10 block[(i+devID)%n]=recv_block11end for
使用All-Reduce算法進(jìn)行梯度累加,取代了原有方法中梯度收集和回傳參數(shù)的過(guò)程,其梯度更新計(jì)算時(shí)序如圖4所示。最終完成整個(gè)過(guò)程的時(shí)間如式(3)所示。
(3)
圖4 基于All-Reduce的梯度更新計(jì)算時(shí)序
從式(3)中我們可以看出,雖然傳輸時(shí)間仍隨設(shè)備數(shù)量n的增大而增大,但不同于點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳遞,傳輸時(shí)間和設(shè)備數(shù)量之間不存在線性相關(guān)的問(wèn)題,這一點(diǎn)為引入更多設(shè)備參與訓(xùn)練提供了良好的基礎(chǔ)。此外,由于該方法并未對(duì)模型訓(xùn)練方式及內(nèi)容進(jìn)行修改,因此不會(huì)對(duì)模型本身的性能產(chǎn)生影響。
1.2.3 基于采樣的數(shù)據(jù)傳輸
不同于All-Reduce算法從增大傳輸速度的角度減小訓(xùn)練耗時(shí),采樣的方法希望通過(guò)減小數(shù)據(jù)傳輸量達(dá)到加速的目的[7]。該方法在收集梯度的過(guò)程中,從完整的梯度矩陣中抽取出對(duì)提高神經(jīng)語(yǔ)言模型性能更有幫助的部分進(jìn)行傳輸,減少了傳輸?shù)臄?shù)據(jù)量,從而節(jié)約了在該過(guò)程中的時(shí)間消耗。
該方法針對(duì)不同層提出了不同的采樣方法。如對(duì)于輸出層權(quán)重(大小為v×h,v為詞表大小,h為隱藏層節(jié)點(diǎn)數(shù)目),其中每一行對(duì)應(yīng)著詞表中的一個(gè)詞。為使網(wǎng)絡(luò)能夠更快收斂,在采樣過(guò)程中希望能夠盡可能頻繁地更新那些經(jīng)常出現(xiàn)的詞,具體的選取策略如式(4)所示。
Vall=Vbase∪Vα∪Vβ
(4)
其中,Vbase為在當(dāng)前minibatch中出現(xiàn)的詞,Vα為從詞匯表中選擇頻繁出現(xiàn)的若干詞,Vβ為從詞匯表中隨機(jī)抽取的詞以保證系統(tǒng)具有良好的魯棒性,在測(cè)試集上更穩(wěn)定。同樣,在輸入層和隱藏層也有不同的采樣策略。另外,由于本方法更加頻繁地對(duì)能夠加快收斂的梯度部分進(jìn)行更新,使得模型收斂速度加快,與此同時(shí)模型本身性能變化不大。
本文相關(guān)實(shí)驗(yàn)使用東北大學(xué)自然語(yǔ)言處理實(shí)驗(yàn)室NiuLearning深度學(xué)習(xí)平臺(tái),結(jié)合NCCL開源框架,在四張NVIDIA TITAN X (Pascal)GPU設(shè)備上進(jìn)行。主要對(duì)比不同設(shè)備數(shù)量下,基于All-Reduce算法和采樣的更新策略對(duì)循環(huán)神經(jīng)語(yǔ)言模型訓(xùn)練速度的影響。此外本文也在前饋神經(jīng)語(yǔ)言模型[16]中使用All-Reduce算法進(jìn)行實(shí)驗(yàn),分析數(shù)據(jù)并行在不同網(wǎng)絡(luò)結(jié)構(gòu)下的適用性問(wèn)題。
本文實(shí)驗(yàn)數(shù)據(jù)使用Brown英文語(yǔ)料庫(kù)(1 161 169詞,57 341句),從中抽取40 000句子作為訓(xùn)練集,統(tǒng)計(jì)49 036詞作為語(yǔ)言模型詞匯表。在模型參數(shù)方面,循環(huán)神經(jīng)網(wǎng)絡(luò)和前饋神經(jīng)語(yǔ)言模型輸入層和隱藏層節(jié)點(diǎn)個(gè)數(shù)均為1 024,minibatch為64。前饋神經(jīng)網(wǎng)絡(luò)訓(xùn)練5-gram語(yǔ)言模型。
2.2.1 加速效果及變化趨勢(shì)
實(shí)驗(yàn)中將基于點(diǎn)對(duì)點(diǎn)進(jìn)行數(shù)據(jù)傳輸?shù)南到y(tǒng)作為基線,在四張GPU設(shè)備上獲得約25%的加速效果,具體實(shí)驗(yàn)結(jié)果見表1。使用基于采樣的梯度更新策略,在同樣參數(shù)設(shè)置下,四張GPU設(shè)備加速比達(dá)41%左右,具體實(shí)驗(yàn)結(jié)果如表2所示,整體趨勢(shì)如圖5所示。
表1 基于All-Reduce梯度更新策略在循環(huán)神經(jīng)語(yǔ)言模型中每個(gè)Epoch的時(shí)間消耗情況
表2 基于采樣的梯度更新策略在循環(huán)神經(jīng)語(yǔ)言模型中每個(gè)Epoch的時(shí)間消耗情況
圖5 基于All-Reduce和采樣策略的時(shí)間消耗對(duì)比
在基線系統(tǒng)的時(shí)間消耗中,由于梯度的計(jì)算和更新模型不存在內(nèi)存和顯存的交互,因此速度較快。而對(duì)于梯度的收集和參數(shù)回傳,其占用的時(shí)間隨設(shè)備數(shù)量的增多而線性變大,因此每個(gè)minibatch所消耗的時(shí)間如式(5)所示。
(5)
其中tcal&update為梯度計(jì)算和模型更新所消耗的總時(shí)間。同理,根據(jù)圖4我們可以看出,使用了All-Reduce算法的梯度累加替代了原本方案中的梯度收集和參數(shù)回傳的過(guò)程,同時(shí)這部分的時(shí)間消耗并不隨設(shè)備數(shù)量線性增長(zhǎng)。在使用了該算法進(jìn)行梯度更新的情況下,每個(gè)minibatch所花費(fèi)的時(shí)間如式(6)所示。
(6)
在整個(gè)訓(xùn)練過(guò)程中,由于樣本數(shù)量是固定的,因此minibatch數(shù)量也是不變的。而多設(shè)備訓(xùn)練將樣本分散到不同設(shè)備上并行計(jì)算,使得在同一時(shí)刻整個(gè)系統(tǒng)見到的minibatch個(gè)數(shù)隨設(shè)備數(shù)量線性增加,換句話說(shuō)總時(shí)間消耗將降為原本的1/n,因此在每一輪訓(xùn)練過(guò)程中,基線和基于All-Reduce的方法在時(shí)間消耗上分別如式(7)、式(8)所示。
(7)
(8)
其中bn為整個(gè)訓(xùn)練集中minibatch的數(shù)量。根據(jù)上述公式,我們可以得到理論上在1~4塊設(shè)備的狀態(tài)下每輪執(zhí)行所需要的時(shí)間,如表3所示。其中當(dāng)設(shè)備數(shù)量是1,不使用All-Reduce的情況下,由于無(wú)需通過(guò)總線進(jìn)行數(shù)據(jù)傳遞,將這部分耗時(shí)用tgather&back表示。從表3中我們可以看出,隨著設(shè)備數(shù)量的增長(zhǎng),節(jié)約的時(shí)間越來(lái)越多,這一點(diǎn)從圖5的實(shí)驗(yàn)結(jié)果中也能觀察到。
表3 在1~4塊設(shè)備上執(zhí)行一輪訓(xùn)練所需理論時(shí)間
從表2的實(shí)驗(yàn)結(jié)果我們可以看出,使用采樣的梯度更新策略可以獲得更高的加速比。不同于All-Reduce試圖找到一種更快速的傳輸策略,該方法通過(guò)減少數(shù)據(jù)傳輸量來(lái)降低多設(shè)備訓(xùn)練中大量的時(shí)間消耗。由于二者出發(fā)點(diǎn)不同,因此理論上可以同時(shí)使用兩種方法對(duì)訓(xùn)練過(guò)程進(jìn)行加速。
2.2.2 數(shù)據(jù)并行算法適用性
我們使用不同大小的詞匯表,通過(guò)All-Reduce算法訓(xùn)練循環(huán)神經(jīng)語(yǔ)言模型,時(shí)間消耗如圖6所示。可以看到,隨著詞表的減小,多設(shè)備訓(xùn)練的時(shí)間優(yōu)勢(shì)逐漸降低。
此外我們?cè)谇梆伾窠?jīng)語(yǔ)言模型上進(jìn)行實(shí)驗(yàn),參數(shù)相關(guān)設(shè)置與循環(huán)神經(jīng)網(wǎng)絡(luò)相同,具體實(shí)驗(yàn)結(jié)果見表4。在多設(shè)備情況下,隨著設(shè)備數(shù)量的增多,前饋神經(jīng)網(wǎng)絡(luò)在使用All-Reduce算法前后變化趨勢(shì)如圖7左側(cè)部分所示,類似于循環(huán)神經(jīng)網(wǎng)絡(luò)。但從表4中我們可以看出,當(dāng)設(shè)備數(shù)為1時(shí),訓(xùn)練1輪所需時(shí)間遠(yuǎn)小于多設(shè)備訓(xùn)練的方法。以上兩組實(shí)驗(yàn)均出現(xiàn)了單設(shè)備訓(xùn)練優(yōu)于多設(shè)備并行的現(xiàn)象。循環(huán)神經(jīng)語(yǔ)言模型實(shí)驗(yàn)中,由于詞表的減小,梯度計(jì)算耗時(shí)變低,導(dǎo)致并行優(yōu)勢(shì)被數(shù)據(jù)傳輸所掩蓋。同理,前饋神經(jīng)網(wǎng)絡(luò)相較循環(huán)神經(jīng)網(wǎng)絡(luò)在結(jié)構(gòu)上更加簡(jiǎn)單,數(shù)據(jù)傳輸占據(jù)了耗時(shí)的主要部分,即使使用All-Reduce算法對(duì)傳輸時(shí)間進(jìn)行稀釋,也無(wú)法抵消其所帶來(lái)的耗時(shí)問(wèn)題。從表3的理論推導(dǎo)中我們也可以看出,當(dāng)使用多設(shè)備(n>1)訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)候,時(shí)間消耗均與K有著很強(qiáng)的線性關(guān)聯(lián),當(dāng)所需傳輸?shù)臄?shù)據(jù)量較大時(shí),多設(shè)備訓(xùn)練的實(shí)際效果并不會(huì)很好。
圖6 不同詞表大小下基于All-Reduce的時(shí)間消耗
GPU數(shù)量1234時(shí)間消耗/sBaselineBaseline+AllReduce節(jié)約時(shí)間/s加速占比/%317.221 280.41 242.61 228.8216.071 245.41 095.4903.58101.1535.003147.18325.2331.8862.733711.84526.467
圖7 不同設(shè)備配置下基于All-Reduce的時(shí)間消耗
2.2.3 硬件連接方式對(duì)速度的影響
在實(shí)驗(yàn)過(guò)程中發(fā)現(xiàn),設(shè)備之間硬件的連接方式也會(huì)對(duì)傳輸速度產(chǎn)生影響。在前饋神經(jīng)網(wǎng)絡(luò)語(yǔ)言模型的實(shí)驗(yàn)中,當(dāng)設(shè)備數(shù)量為2且工作節(jié)點(diǎn)使用0號(hào)和1號(hào)GPU進(jìn)行訓(xùn)練時(shí),時(shí)間消耗曲線如圖7中右側(cè)部分所示,左側(cè)部分為使用0號(hào)和2號(hào)設(shè)備所得,我們可以看出,當(dāng)選擇不同設(shè)備進(jìn)行數(shù)據(jù)傳輸時(shí),其所消耗的時(shí)間也有可能不同。我們實(shí)驗(yàn)平臺(tái)上的硬件拓?fù)浣Y(jié)構(gòu)如圖8所示,0號(hào)和1號(hào)卡為一組,2號(hào)和3號(hào)為一組,均使用PCIe Switch進(jìn)行連接。
圖8 實(shí)驗(yàn)平臺(tái)的硬件拓?fù)浣Y(jié)構(gòu)
由于組內(nèi)進(jìn)行數(shù)據(jù)傳輸無(wú)需通過(guò)CPU,占用總線帶寬,因此傳輸速率較快,組間由于需要經(jīng)過(guò)多個(gè)設(shè)備對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā),因此速度相對(duì)慢一些。1~3卡之間互相傳輸數(shù)據(jù)帶寬如圖9左側(cè)部分所示,其中顏色越淺帶寬越高,傳輸速率越快,圖9右側(cè)給出組內(nèi)平均帶寬為5.96 GB/s,組間4.46 GB/s。
圖9 不同設(shè)備之間數(shù)據(jù)傳輸帶寬
由于All-Reduce算法采用環(huán)形結(jié)構(gòu)讓設(shè)備之間進(jìn)行數(shù)據(jù)傳輸,因此只要系統(tǒng)中存在任意兩臺(tái)設(shè)備間傳輸速度慢,那么就會(huì)拖慢整體系統(tǒng)的傳輸速率。因此在前述兩張卡的實(shí)驗(yàn)中,為保證實(shí)驗(yàn)公平性,我們使用0號(hào)和2號(hào)進(jìn)行實(shí)驗(yàn),保證多設(shè)備的每組實(shí)驗(yàn)中均存在組間的數(shù)據(jù)傳遞。同理,在基于采樣的數(shù)據(jù)傳輸過(guò)程中,其數(shù)據(jù)傳輸方式仍為點(diǎn)到點(diǎn)的傳輸,慢速的連接只會(huì)影響節(jié)點(diǎn)本身與參數(shù)服務(wù)器之間的傳輸過(guò)程,對(duì)整體的時(shí)間消耗影響有限。
本文主要針對(duì)如何降低多設(shè)備訓(xùn)練神經(jīng)語(yǔ)言模型中的時(shí)間消耗進(jìn)行實(shí)驗(yàn),對(duì)比不同梯度更新策略的加速效果。
?加速效果: 使用All-Reduce的梯度收集策略在循環(huán)神經(jīng)語(yǔ)言模型上可獲得25%左右的加速效果,同時(shí)隨著設(shè)備數(shù)量的增加,加速效果更加顯著;使用基于采樣的梯度更新方法可達(dá)到約41%的加速。
?數(shù)據(jù)并行適用性: 使用多設(shè)備訓(xùn)練神經(jīng)網(wǎng)絡(luò)在不同模型下速度變化趨勢(shì)稍有不同。實(shí)驗(yàn)發(fā)現(xiàn)對(duì)于大量數(shù)據(jù)傳輸占主導(dǎo)的網(wǎng)絡(luò)模型,多設(shè)備訓(xùn)練反而會(huì)降低整體運(yùn)行速度。在這種情況下即使使用了All-Reduce等的加速方法也很難獲得與單設(shè)備可比的運(yùn)行速度。而對(duì)于數(shù)據(jù)傳輸量偏小的模型,在實(shí)際使用中比較適合在多設(shè)備上并行訓(xùn)練。
?硬件連接方式對(duì)速度的影響: 實(shí)驗(yàn)中發(fā)現(xiàn),設(shè)備之間不同的硬件連接方式會(huì)對(duì)傳輸速度產(chǎn)生影響。針對(duì)該特性,我們?cè)谖磥?lái)工作中考慮將采樣算法與All-Reduce進(jìn)行結(jié)合,對(duì)于傳輸較慢的設(shè)備在采樣中給予相對(duì)較低的采樣率,實(shí)現(xiàn)能者多勞,不讓某些設(shè)備的傳輸速度拖慢整體。