高 開,郭振華,陳永芳,王 麗,趙雅倩,趙 坤
(1.浪潮電子信息產(chǎn)業(yè)股份有限公司高效能服務(wù)器與存儲技術(shù)國家重點(diǎn)實(shí)驗(yàn)室,山東 濟(jì)南 250000; 2.廣東浪潮大數(shù)據(jù)研究有限公司,廣東 廣州 510000)
深度神經(jīng)網(wǎng)絡(luò)(DNN)推進(jìn)諸多機(jī)器學(xué)習(xí)任務(wù)的進(jìn)步,其中包括語音識別、視覺識別和語言處理等。BigGan、Bert和GPT2.0 等最新成果表明,DNN 的模型越大,任務(wù)處理的表現(xiàn)就越好,而該結(jié)論也在過去的視覺識別任務(wù)中得到了驗(yàn)證,這表明模型大小與分類準(zhǔn)確性之間存在很強(qiáng)的關(guān)聯(lián)性。與此對應(yīng)的是,各個(gè)公司推出了各種類型的加速器設(shè)備用來加速訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型,Intel和XILINX分別推出了高效能的FPGA設(shè)備,Google推出了一系列的TPU(Tensor Processing Unit)加速板卡。目前最先進(jìn)的圖像模型早已達(dá)到 TPUv2 可用內(nèi)存的極限,單一類型的板卡已經(jīng)無法用來訓(xùn)練很大的模型,因此,迫切需要一種高效、可擴(kuò)展的基礎(chǔ)設(shè)施,以實(shí)現(xiàn)大規(guī)模的深度學(xué)習(xí)訓(xùn)練,并克服當(dāng)前加速器內(nèi)存受限問題,進(jìn)而可以擴(kuò)展到多種類型的加速器設(shè)備上,能夠充分使用混合異構(gòu)集群中存在的多種類型且性能不一的設(shè)備。
為了在多個(gè)計(jì)算設(shè)備之間部署深度學(xué)習(xí)DL(Deep Learning)模型以訓(xùn)練大型且復(fù)雜的模型,數(shù)據(jù)并行DP(Data Parallel)是應(yīng)用最廣泛的并行化策略,但是如果數(shù)據(jù)并行訓(xùn)練中的設(shè)備數(shù)量不斷增加,設(shè)備的性能不一,設(shè)備之間的通信開銷就會成為瓶頸。此外,對于性能分布不均的設(shè)備群,訓(xùn)練時(shí)每個(gè)步驟都需要給性能不同的設(shè)備分配不同的批處理大小,這種不均衡會導(dǎo)致精度損失,即需要更長的訓(xùn)練周期以收斂到期望的精度[1]。這些因素會影響數(shù)據(jù)并行整體訓(xùn)練時(shí)間,并且會影響某些設(shè)備的運(yùn)行效率。
除了DP,還可以利用模型并行性MP(Model Parallel)來加速模型訓(xùn)練。模型并行首先把整個(gè)模型按照一定的策略劃分到各個(gè)設(shè)備上,然后通過設(shè)備間的相互通信來解決特征數(shù)據(jù)傳輸問題。Gpipe[2]是一種典型的模型并行訓(xùn)練框架,它根據(jù)設(shè)備的性能和模型每一層的計(jì)算量大小按照相應(yīng)比例為各個(gè)計(jì)算設(shè)備配置模型,然后依次按照設(shè)備順序并行流水地進(jìn)行訓(xùn)練。這種方法可解決數(shù)據(jù)并行中的精度損失問題,但同樣會因?yàn)樵O(shè)備群中設(shè)備數(shù)量增加帶來流水線過長和通信瓶頸問題。同時(shí),在混合異構(gòu)平臺中,模型并行訓(xùn)練時(shí)需要更加精細(xì)地劃分模型,因此如何在性能分布不均的設(shè)備上劃分模型,以及如何高效地建立設(shè)備間的流水都成為了重要的研究熱點(diǎn)問題[3]。
簡單來說,Gpipe 是一款分布式機(jī)器學(xué)習(xí)庫,基于同步隨機(jī)梯度下降與流水并行技術(shù)進(jìn)行模型并行訓(xùn)練,適用于由多個(gè)連續(xù)層組成的任意 DNN。最重要的是,Gpipe 可以使研究人員在不調(diào)整超參數(shù)的情況下部署更多的加速器,以訓(xùn)練大規(guī)模模型,由此有效擴(kuò)展了性能。
為了實(shí)現(xiàn)跨加速器的高效訓(xùn)練,Gpipe 先按照加速器對模型進(jìn)行按層劃分,然后將每個(gè)批次的訓(xùn)練示例拆分為更小的微批次。通過在微批次中執(zhí)行流水管理,加速器得以并行流水運(yùn)行。此外,梯度將在微批次中持續(xù)累積,以免分區(qū)的數(shù)量影響到模型的質(zhì)量。
Gpipe框架中采用的模型并行策略是按照模型每層的計(jì)算量均等地分到各個(gè)計(jì)算設(shè)備上(如圖1a所示),然后在各個(gè)設(shè)備上依次進(jìn)行模型的前向反向計(jì)算(如圖1b所示)。從圖1b可以看到,每個(gè)時(shí)刻只有一個(gè)設(shè)備在執(zhí)行計(jì)算任務(wù),其他設(shè)備都處在空閑狀態(tài),這樣會造成極大的資源浪費(fèi)。為了解決這個(gè)問題,Gpipe通過把每一個(gè)批次的數(shù)據(jù)劃分成更小批次的方法,使得每個(gè)小批次在設(shè)備間流水執(zhí)行,盡可能地使所有設(shè)備都能夠同時(shí)并行計(jì)算(如圖1c所示)。Gpipe一般是通過總的批處理總量除以設(shè)備數(shù)來得到更小的批次。對于具有單一類型設(shè)備的異構(gòu)平臺,Gpipe的模型并行劃分策略和微批次流水的方法都具有較好的性能。但是,對于混合異構(gòu)平臺,由于一些設(shè)備性能分布差距過大,均等的模型劃分策略和微批次劃分方法都不能充分利用集群中設(shè)備的性能。
Figure 1 An example of Gpipe working principle圖1 Gpipe 工作原理示例
圖1a是模型并行訓(xùn)練中序列模型劃分示例。其中,F(xiàn)k為第k個(gè)部分的前向計(jì)算,Bk為第k個(gè)部分的后向計(jì)算,依賴于Bk+1的輸出和Fk的輸出。圖1b是傳統(tǒng)的模型并行訓(xùn)練的前向反向過程。由于網(wǎng)絡(luò)存在順序性,每次都只有一個(gè)加速器處于活動狀態(tài)。 模型并行策略導(dǎo)致嚴(yán)重的設(shè)備利用不充分問題。
圖1c是Gpipe 將輸入的小批次拆成更小的微批次,使不同的加速器可以同時(shí)在單獨(dú)的微批次上運(yùn)行。
Gpipe所提供的模型并行流水訓(xùn)練一般適用于性能均等的加速設(shè)備,比如Google在一系列TPUv2芯片上實(shí)現(xiàn)了模型的劃分和并行流水訓(xùn)練[4]。Gpipe中使用的模型劃分策略是按照模型中每一層計(jì)算量和設(shè)備的計(jì)算性能進(jìn)行均等劃分。而對于混合異構(gòu)平臺,通常每臺設(shè)備上都部署了多種類型的加速芯片,比如GPU、FPGA和TPU設(shè)備等。當(dāng)設(shè)備群中出現(xiàn)性能不一的多種類型設(shè)備時(shí),每種設(shè)備的計(jì)算能力和通信帶寬的不一致給網(wǎng)絡(luò)模型的劃分帶來很大的問題[5],網(wǎng)絡(luò)模型就不能簡單地按層進(jìn)行劃分。模型并行訓(xùn)練時(shí)需要同時(shí)利用多種類型的加速芯片,如何在多種性能分布不均的設(shè)備上部署模型以及合理地建立設(shè)備間的流水是急需解決的問題。
在混合異構(gòu)架構(gòu)下,設(shè)備的性能通常會有很大的差異性,比如設(shè)備群的FPGA設(shè)備(如圖2a所示),通常情況下FPGA設(shè)備只能承擔(dān)某一層的計(jì)算量,甚至某些性能過低的FPGA設(shè)備無法承擔(dān)一層的計(jì)算量,因此需要更加精細(xì)的模型并行訓(xùn)練時(shí)模型劃分方法。為了解決設(shè)備性能分布不均帶來的模型劃分困難,本文提出了一種層級并行和通道并行混合的模型劃分策略。
Figure 2 Model parallel training method based on Gpipe圖2 基于Gpipe框架的層級模型并行
本文以混合異構(gòu)平臺中有2個(gè)GPU設(shè)備和2個(gè)FPGA設(shè)備為例說明層級并行和通道并行的模型混合并行策略。由于使用的FPGA設(shè)備的性能要低于GPU設(shè)備的性能,首先把2個(gè)FPGA設(shè)備合并成1個(gè)設(shè)備,然后在合并后的3個(gè)設(shè)備上用傳統(tǒng)的層級劃分策略進(jìn)行模型劃分,即按照每層的計(jì)算量和設(shè)備的計(jì)算力按比例把網(wǎng)絡(luò)模型按層劃分到每個(gè)設(shè)備上(如圖3a所示)。按層級劃分完成模型劃分之后,再把劃分到2個(gè)FPGA設(shè)備上的網(wǎng)絡(luò)層按卷積核通道數(shù)在2個(gè)FPGA設(shè)備上按計(jì)算能力進(jìn)行均等劃分(如圖3b所示)。如果2個(gè)FPGA設(shè)備的性能均等,那么劃分到每個(gè)設(shè)備上的通道數(shù)是一致的。
Figure 3 Model parallel training of hierarchy parallel and channel parallel圖3 層級并行與通道并行混合的模型并行
這種混合層級并行和通道并行的劃分策略有2個(gè)方面的優(yōu)點(diǎn):(1)混合并行策略對網(wǎng)絡(luò)模型的劃分是更加精細(xì)的,模型的劃分粒度不僅僅局限在以層級為單位的劃分,而是精細(xì)到了以通道為單位,這種混合劃分策略能夠更充分地利用不同類型設(shè)備的性能。(2)混合并行劃分策略可以減少混合異構(gòu)中設(shè)備流水線的長度(如圖2c和圖3c所示),為第4節(jié)模型并行訓(xùn)練時(shí)流水線的建立提供了便利。
Figure 4 Idle time of model parallel pipeline training when device number is 3 and micro-batch-size is 4圖4 模型并行訓(xùn)練流水過程中設(shè)備空閑時(shí)間(設(shè)備數(shù)量為3,微批次數(shù)量為4)
Gpipe框架是通過把批次劃分成更小的微批次來實(shí)現(xiàn)設(shè)備間的并行流水訓(xùn)練,劃分后的批次大小B=M/K,其中M為原批次大小,K為設(shè)備數(shù)量。圖4闡明了設(shè)備數(shù)量K為3,微批次數(shù)量為4時(shí)設(shè)備間流水效果。
通過圖4的流水過程分析可以得到,訓(xùn)練過程中有一半以上的時(shí)間至少有1個(gè)設(shè)備處于空閑狀態(tài),因此這樣的流水效果沒有充分利用設(shè)備的性能,反而在流水線建立上的時(shí)間占比很大[6]。為了縮短流水線建立的時(shí)間,傳統(tǒng)的模型并行算法通常是通過劃分更小的微批次來掩蓋流水線建立的時(shí)間。一般情況下,當(dāng)劃分的微批次數(shù)量越多,設(shè)備間的流水效果會更好,當(dāng)劃分后的微批次數(shù)量N>4×K,K為設(shè)備數(shù)量,流水線的建立時(shí)間就會占比很小。同時(shí),如果混合異構(gòu)平臺中設(shè)備數(shù)量巨大,就需要劃分更多的微批次來達(dá)到較好的流水效果。顯而易見的是,批處理總量是不變的,當(dāng)劃分的微批次數(shù)量越多,每次每個(gè)設(shè)備處理的批量大小就會越小。若設(shè)備每次處理的批量大小遠(yuǎn)小于設(shè)備的處理能力的時(shí)候,通常也會無法充分利用該設(shè)備的性能資源。
如何根據(jù)流水線長度和設(shè)備的處理能力來確定微批次的大小和數(shù)量就是一個(gè)急需解決的問題,本文根據(jù)以下2個(gè)原則來確定如何選擇微批次的劃分?jǐn)?shù)量。
在模型并行訓(xùn)練中,當(dāng)設(shè)備數(shù)量增多時(shí),通常流水線的長度也會隨之增加,因此花費(fèi)在流水建立的時(shí)間占比也會增大。而且混合異構(gòu)架構(gòu)下設(shè)備的類型多種多樣,通常會有很大的性能差異性(如圖5所示),這些差異性會給設(shè)備間流水的建立帶來通信瓶頸問題。
為了解決上述問題,本文提出一種混合異構(gòu)架構(gòu)下多設(shè)備合并的策略,通過合并一些性能較低的設(shè)備使合并后的設(shè)備的性能分布均勻(如圖6所示)。設(shè)備合并采用通過循環(huán)遍歷設(shè)備性能然后合并性能較低的2個(gè)設(shè)備的方式。假設(shè)第i個(gè)設(shè)備的性能記為Pi,整個(gè)設(shè)備群中設(shè)備的性能分布用平均差來刻畫,如式(1)所示:
(1)
算法1設(shè)備合并方法device_merge()
輸入:設(shè)備性能集合{Pi,…,Pn}。
輸出:合并后的設(shè)備性能集合{Pi,…,Pk}。
while(1)
{
{Pi,…,Pn}=Sort({Pi,…,Pn});
Pn-1=Pn-1+Pn;
Output {Pi,…,Pn-1};
Break;
}
n=n-1;
}
經(jīng)過設(shè)備合并之后的設(shè)備群流水線長度縮短了(如圖6所示),各設(shè)備性能差別很小或者已經(jīng)沒有差別。在完成設(shè)備合并之后需要進(jìn)行模型的劃分和映射,采用3.1節(jié)中的層級并行和通道并行混合劃分策略,首先根據(jù)合并之后設(shè)備的性能和模型各層的計(jì)算量按比例進(jìn)行劃分;然后在合并的設(shè)備上根據(jù)通道數(shù)目和設(shè)備性能按比例進(jìn)行劃分。本文提出的這種設(shè)備合并方法能夠和第3節(jié)提到的混合并行策略完美地結(jié)合在一起,不僅縮短了流水線的長度,而且還緩解了設(shè)備群中的性能較低設(shè)備的通信壓力。
Figure 5 The pipeline training before device combined when device number is 5 and micro-batch-size is 4圖5 設(shè)備合并前的流水效果圖(設(shè)備數(shù)量為5,微批次數(shù)量為4)
Figure 6 The pipeline training after device combined when device number is 5 and micro-batch-size is 4圖6 設(shè)備合并后的流水效果圖(設(shè)備數(shù)量為5,微批次數(shù)量為4)
在經(jīng)過上述設(shè)備合并之后模型并行訓(xùn)練需要建立設(shè)備間的流水,本文采用Gpipe框架中微批次劃分的方法使得各小批次在設(shè)備間流水執(zhí)行。Gpipe框架中微批次劃分方法是總的處理批次大小除以設(shè)備數(shù)量。這種方法通常不能完全利用設(shè)備性能或者流水建立的時(shí)間占比很大,為了緩解這個(gè)問題,本文提出根據(jù)流水線的長度和設(shè)備性能來動態(tài)地進(jìn)行微批次劃分。首先,計(jì)算得到合并后每個(gè)設(shè)備的傳輸帶寬和計(jì)算能力;然后分析批次的劃分對流水建立時(shí)間占比和設(shè)備利用率的影響。圖7是2個(gè)設(shè)備時(shí)微批次的劃分?jǐn)?shù)量大小對流水建立時(shí)間占比和設(shè)備性能利用率的影響曲線。
Figure 7 Influence of pipelining bubble time and device effective with the number of micro-batch圖7 微批次的劃分?jǐn)?shù)量對流水建立時(shí)間和設(shè)備利用率的影響
假設(shè)流水建立時(shí)間對整個(gè)訓(xùn)練時(shí)間的影響為Ppipe(batch_num),設(shè)備利用率損失為Dloss(batch_num),則batch_num需要滿足以下條件:
min(Ppipe(batch_num)+Dloss(batch_num))
(2)
滿足式(2)的batch_num能夠使設(shè)備間的流水效果和設(shè)備的利用率達(dá)到一個(gè)均衡的狀態(tài),進(jìn)而整個(gè)系統(tǒng)的性能達(dá)到最優(yōu)狀態(tài)。本文采用二分查找方法找到batch_num最優(yōu)解的。假設(shè)總的處理批量大小為Batch_size,混合異構(gòu)平臺中的設(shè)備最大處理批次為Batch_device,流水線長度為Pipe_num。流水線建立的時(shí)間占比為:
(3)
設(shè)備利用率損失為:
(4)
通常式(4)計(jì)算得到batch_num,劃分后的微批次由式(5)計(jì)算得到:
(5)
為了防止計(jì)算得到的micro_batch不為整數(shù),對每個(gè)micro_batch進(jìn)行±1微調(diào),使其都為整數(shù)且相加等于總的批處理大小。
表1以ResNet50模型為例說明了流水線的長度與Batch_size如何進(jìn)行選擇。每次處理的總批量為256,混合異構(gòu)平臺中以8個(gè)GPU為例,每個(gè)GPU處理的最大Batch_size為64。通過二分法查找得到表1的劃分結(jié)果。
Table 1 Result of micro-batch on ResNet50 with hybrid heterogeneous devices表1 混合異構(gòu)架構(gòu)下ResNet50的劃分結(jié)果
首先,本文對比在混合異構(gòu)平臺上模型并行算法與數(shù)據(jù)并行算法在精度上的差別,以標(biāo)準(zhǔn)的ResNet50模型在單個(gè)GPU上訓(xùn)練的精度(圖8中的Original)為基準(zhǔn),分別對比了數(shù)據(jù)并行和模型并行在混合異構(gòu)平臺中的表現(xiàn)。實(shí)驗(yàn)采用2種不同型號(2個(gè)NVIDIA Tesla V100和2個(gè)NVIDIA Tesla M4)的GPU設(shè)備,這2種型號的GPU設(shè)備在性能上有一定的差別。實(shí)驗(yàn)環(huán)境如下所示:
CPU:2路Intel(R)Xeon(R) CPU E5-2690 v3 @ 2.60 GHz(每個(gè)CPU包含12個(gè)物理core,24個(gè)thread cores);FPGA:Inspur F10S板卡x1;GPU:NVIDIA Tesla V100 ×2 NVIDIA Tesla M4 ×2;RAM:629 GB;OS:CentOS Linux release 7.6.1810 (Core);Kernel version:3.10.0-514.el7.x86_64;輸入圖像:ImageNet2012。
為了充分利用每個(gè)設(shè)備的性能,在數(shù)據(jù)并行時(shí),給不同型號的GPU設(shè)備設(shè)置的Batch_size是不一樣的,例如,NVIDIA Tesla V100每次處理的Batch_size設(shè)置為128,NVIDIA Tesla M4每次處理的Batch_size設(shè)置為64。在使用本文模型進(jìn)行并行訓(xùn)練時(shí),首先把2個(gè)NVIDIA Tesla M4合并成一個(gè)設(shè)備,使流水線長度減小為3;然后用層級并行和通道并行的混合并行策略把ResNet50模型分配到各個(gè)設(shè)備上;最后選取合適的微批次劃分(32×4),使整個(gè)設(shè)備群的流水狀態(tài)達(dá)到平衡。通過實(shí)驗(yàn)發(fā)現(xiàn),模型并行訓(xùn)練方法可以彌補(bǔ)混合異構(gòu)架構(gòu)中數(shù)據(jù)并行訓(xùn)練時(shí)出現(xiàn)的精度損失問題,如圖8所示,數(shù)據(jù)并行訓(xùn)練算法訓(xùn)練過程前期精度波動較大,通常需要更多的訓(xùn)練周期才能達(dá)到相同的精度Top-1 accuracy,如圖9所示。
Figure 8 Accuracy of data parallel and model parallel on hybrid heterogeneous platform圖8 混合異構(gòu)架構(gòu)下數(shù)據(jù)并行算法 與模型并行算法的精度(Epoch=90)
Figure 9 Accuracy curve of data parallel and model parallel on hybrid heterogeneous platform圖9 混合異構(gòu)下精度收斂曲線對比
然后,與Google提出的Gpipe模型并行流水算法在單異構(gòu)和混合異構(gòu)平臺上的性能表現(xiàn)進(jìn)行對比。與傳統(tǒng)的模型并行流水算法(Gpipe)相比,通過本文方法優(yōu)化之后的模型并行流水算法性能得到了相應(yīng)的提升。本文基于Gpipe與TensorFlow實(shí)現(xiàn)了ResNet50的模型并行流水訓(xùn)練,并且成功地部署到CPU、GPU和FPGA設(shè)備上進(jìn)行訓(xùn)練。本文分別在完全由GPU組成的單異構(gòu)訓(xùn)練環(huán)境和由GPU與FPGA共同組成的混合異構(gòu)訓(xùn)練環(huán)境進(jìn)行了實(shí)驗(yàn)驗(yàn)證。通過本文模型劃分策略和批次大小調(diào)整以后,單異構(gòu)環(huán)境下ResNet50模型的訓(xùn)練性能比Gpipe框架提升了3%~4%,如圖10所示。對于由GPU和FPGA組成的混合環(huán)境,由于FPGA設(shè)備性能的限制,只把模型的最后2層放到了FPGA設(shè)備上。實(shí)驗(yàn)表明,混合異構(gòu)環(huán)境下經(jīng)過本文提出的混合并行策略和批次劃分方法優(yōu)化之后,比傳統(tǒng)的模型并行流水算法的性能加速比提升了7%左右,如圖11所示。
Figure 10 Speedup of Gpipe and our method on single heterogeneous platform圖10 單異構(gòu)環(huán)境下性能加速比
Figure 11 Speedup of original and our method on hybrid heterogeneous platform圖11 混合異構(gòu)環(huán)境下性能加速比
本文提出了2種適用于混合異構(gòu)架構(gòu)平臺的模型并行訓(xùn)練優(yōu)化方法。首先針對混合異構(gòu)平臺中設(shè)備性能的差異性提出了混合層并行和通道并行的模型劃分策略,相比簡單的層并行方法,這種策略對模型的劃分更加精細(xì),能夠更加充分地利用設(shè)備性能。然后本文給出了一種動態(tài)劃分微批次的方法,該方法中的2個(gè)原則能夠使設(shè)備間流水線的建立和設(shè)備利用率達(dá)到平衡,進(jìn)而能夠最大限度地減小流水線建立的時(shí)間占比和提高設(shè)備的利用率。相比于數(shù)據(jù)并行方法,本文提出的模型并行方法能夠解決數(shù)據(jù)并行在混合異構(gòu)架構(gòu)中因設(shè)備性能分布不均帶來的精度損失問題。相比傳統(tǒng)的模型并行算法(Gpipe)具有更好的加速比,在單一類型設(shè)備的異構(gòu)平臺上的訓(xùn)練性能加速比提升4%左右,在混合異構(gòu)平臺的訓(xùn)練性能加速比相比沒有使用優(yōu)化方法之前能夠提升7%左右。