李景軍,張 宸,曹 強(qiáng)
華中科技大學(xué) 武漢光電國(guó)家研究中心,武漢 430074
隨著深度學(xué)習(xí)技術(shù)的發(fā)展,卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)被廣泛應(yīng)用到人臉識(shí)別、物體檢測(cè)等領(lǐng)域。另外,處理器計(jì)算能力的增強(qiáng),不僅縮短了模型訓(xùn)練的時(shí)間,而且也使得CNN技術(shù)得到了進(jìn)一步的研究和開發(fā)。例如,Google公司開發(fā)的FaceNet網(wǎng)絡(luò)模型人臉識(shí)別精度可以達(dá)到99.63%[1]。微軟開發(fā)的Optasia,在大城市交通攝像機(jī)的關(guān)聯(lián)查詢方面,也表現(xiàn)出很高的精度和性能[2]。
雖然CNN取得了很高的精度,但是復(fù)雜的網(wǎng)絡(luò)模型給處理器帶來了極大的挑戰(zhàn)。例如,為了達(dá)到57.1%的top-1精度和80.2%的top-5精度,AlexNet[3]需要迭代358000次[4]。VGG-16[5]擁有13800萬個(gè)權(quán)值參數(shù),一次迭代需要155億次浮點(diǎn)操作[6]。對(duì)于大型網(wǎng)絡(luò)模型(例如ResNet[7]),常常由幾十或者幾百層組成,模型具有更多的參數(shù),迭代計(jì)算需要更多的浮點(diǎn)操作。由于CPU采用復(fù)雜的控制邏輯和分支預(yù)測(cè),利用CPU訓(xùn)練大型神經(jīng)網(wǎng)絡(luò)模型時(shí)間很長(zhǎng),完成一次訓(xùn)練往往需要幾天甚至十幾天。
為了加速訓(xùn)練過程,F(xiàn)PGA、GPU和一些專用加速器[8-13]被相繼開發(fā),通過優(yōu)化并行計(jì)算、流水線或近數(shù)據(jù)處理等方式,加快神經(jīng)網(wǎng)絡(luò)的執(zhí)行速度。GPU具有強(qiáng)大的并行處理能力,因此深度學(xué)習(xí)工作者大多使用GPU訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。Song等人[14]通過對(duì)任務(wù)進(jìn)行分類,動(dòng)態(tài)調(diào)度GPU的內(nèi)部資源,在mobile GPU上實(shí)現(xiàn)了不同任務(wù)在延時(shí)、能耗和精度方面的權(quán)衡。Rhu等人[15]同時(shí)利用顯存和內(nèi)存存儲(chǔ)特征圖和參數(shù),實(shí)現(xiàn)了GPU訓(xùn)練更大的網(wǎng)絡(luò)模型。此外,cuDNN[16]、cuBLAS[17]等GPU加速庫和一些并行算法的出現(xiàn),從算法上優(yōu)化了矩陣乘法,縮短了矩陣運(yùn)算的時(shí)間。
利用GPU神經(jīng)網(wǎng)絡(luò)訓(xùn)練速度得到了很大的提升,但是GPU的計(jì)算資源和顯存仍然未被充分利用[18]。訓(xùn)練復(fù)雜的網(wǎng)絡(luò)模型時(shí),如何高效地利用GPU,仍然有待進(jìn)一步研究。與之前的工作相比,本文注重于探究和分析在訓(xùn)練CNN過程中GPU資源是否被充分利用,以及GPU的計(jì)算效率是否達(dá)到最高。量化了GPU加速庫、神經(jīng)網(wǎng)絡(luò)模型和批次對(duì)GPU計(jì)算效率和資源利用率的影響。另外,統(tǒng)計(jì)了神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中每層的參數(shù)和特征圖的顯存占用量,為后續(xù)利用GPU訓(xùn)練大規(guī)模網(wǎng)絡(luò)模型的研究鋪平道路。
總之,本文的主要貢獻(xiàn)如下:
(1)把神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程分解為6個(gè)階段,通過細(xì)粒度的實(shí)驗(yàn),給出了每個(gè)階段的延時(shí),明確地指出圖像預(yù)處理和反向傳播的矩陣乘法是最耗時(shí)的操作。
(2)對(duì)比了cuDNN和cuBLAS庫加速CNN訓(xùn)練的差異。卷積層cuDNN的計(jì)算效率和資源利用率分別是cuBLAS的2倍和1.7倍,但是在全連接層兩者差距不大。
(3)探究了網(wǎng)絡(luò)模型和批次對(duì)GPU計(jì)算效率和資源利用率的影響。對(duì)于不同網(wǎng)絡(luò)模型,卷積層的計(jì)算效率和資源利用率都遠(yuǎn)遠(yuǎn)高于全連接層。另外,較大的批次雖然會(huì)帶來計(jì)算效率的提升,但是資源利用率不會(huì)升高。
(4)統(tǒng)計(jì)了不同網(wǎng)絡(luò)模型每層的顯存使用情況,為以后研究訓(xùn)練超出GPU顯存的網(wǎng)絡(luò)模型奠定基礎(chǔ)。
本文組織結(jié)構(gòu)如下:第2章簡(jiǎn)述相關(guān)工作;第3章介紹CNN的背景、數(shù)據(jù)流以及實(shí)驗(yàn)方法;第4章針對(duì)CNN數(shù)據(jù)流,對(duì)每個(gè)階段進(jìn)行細(xì)粒度的量化分析;第5章展示并分析實(shí)驗(yàn)結(jié)果;第6章總結(jié)全文。
先前大部分工作研究和設(shè)計(jì)了神經(jīng)網(wǎng)絡(luò)加速器,從硬件來加速網(wǎng)絡(luò)訓(xùn)練過程[19-23]。本文重點(diǎn)從數(shù)據(jù)流的角度闡述神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程,并量化了訓(xùn)練過程中GPU的計(jì)算效率和資源利用率,為之后GPU或者神經(jīng)網(wǎng)絡(luò)加速器的研究奠定基礎(chǔ)。
神經(jīng)網(wǎng)絡(luò)的計(jì)算非常耗時(shí),因此有大量的工作對(duì)此優(yōu)化[24-26],但是圖像預(yù)處理耗時(shí)也比較長(zhǎng),需要進(jìn)一步優(yōu)化。盡管使用快速存儲(chǔ)設(shè)備可以分?jǐn)傔@一開銷,但預(yù)處理的問題并沒有得到解決。隨著計(jì)算能力的提升,圖像預(yù)處理會(huì)拖慢神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。
另外,還有一些探究網(wǎng)絡(luò)模型性能的工作。Shi等人[27]在不同的硬件平臺(tái)上對(duì)多種網(wǎng)絡(luò)模型進(jìn)行了評(píng)估。通過比較各種模型的運(yùn)行時(shí)間,衡量網(wǎng)絡(luò)模型對(duì)硬件平臺(tái)的敏感程度。雖然本文也是通過時(shí)間延時(shí)衡量性能,但是主要在單個(gè)GPU平臺(tái),評(píng)估GPU計(jì)算效率和資源利用率,分析不同網(wǎng)絡(luò)模型性能差異的根本原因。Li等人[28]對(duì)比了cuda-convnet和cuDNN下網(wǎng)絡(luò)模型的吞吐量,然后針對(duì)內(nèi)存布局重點(diǎn)討論了矩陣乘法帶來的吞吐量差異。從塊和寄存器分配等角度探究GPU資源利用情況,更注重于充分開發(fā)GPU的計(jì)算潛力。
本章首先對(duì)CNN進(jìn)行簡(jiǎn)要介紹,闡述CNN數(shù)據(jù)流的每個(gè)步驟,然后針對(duì)訓(xùn)練網(wǎng)絡(luò)模型的過程設(shè)計(jì)實(shí)驗(yàn)方法。
常見的卷積神經(jīng)網(wǎng)絡(luò)主要由3種類型的層組成:卷積層(conv)、池化層(pool)和全連接層(fc)。為了防止過擬合,提高網(wǎng)絡(luò)的準(zhǔn)確率,研究人員會(huì)添加額外的層(norm、dropout等)。CNN就是由這些層按照一定順序組合而成,網(wǎng)絡(luò)的模型參數(shù)和權(quán)值都保存在這些層中。圖1展示了一個(gè)簡(jiǎn)單的CNN網(wǎng)絡(luò)模型。
Fig.1 Convolutional neural network圖1 卷積神經(jīng)網(wǎng)絡(luò)
卷積層,卷積層是利用一系列卷積核與輸入數(shù)據(jù)進(jìn)行卷積操作。在NCHW內(nèi)存布局中,卷積計(jì)算如式(1)所示:
其中,K是卷積核;X和Y分別是卷積層的輸入和輸出;Ni是批次大??;Ci和Co分別是輸入和輸出通道數(shù);Hi和Wi分別是輸入特征圖的高和寬;KH和KW代表卷積核的大小??傊?,卷積層通過卷積核從輸入的特征圖中提取各種局部特征,比如邊、角等。
池化層,也叫下采樣層,普遍的實(shí)現(xiàn)方式有兩種:最大池化和均值池化。最大池化是對(duì)鄰域內(nèi)的特征點(diǎn)求最大值,均值池化是對(duì)鄰域內(nèi)的特征點(diǎn)求平均值。以均值池化為例,計(jì)算如式(2)所示:
池化層對(duì)卷積層提取的局部特征進(jìn)行下采樣,抽象為低分辨率的特征圖。
全連接層,又叫作內(nèi)積層。全連接層將之前層學(xué)到的特征圖映射到樣本空間。全連接層可以看作卷積核為KH=1,KW=1的卷積層。其中,H和W分別為上一層結(jié)果的高度和寬度。
Softmax層,一般在網(wǎng)絡(luò)模型的最后,用來計(jì)算分類對(duì)象的概率。它的輸入來自全連接層。Softmax層的計(jì)算如式(3)所示:
其中,Xk是上層輸出的最大預(yù)測(cè)值。
訓(xùn)練神經(jīng)網(wǎng)絡(luò)是學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)權(quán)值參數(shù)W的過程,該過程需要進(jìn)行多次迭代(比如AlexNet迭代450000次),每次迭代又可以細(xì)分為前向傳播(Forward)和反向傳播(Backward),如圖2所示。
Fig.2 Forward and backward propagation of CNN圖2 卷積神經(jīng)網(wǎng)絡(luò)的前向和反向傳播
在前向傳播中,CNN網(wǎng)絡(luò)模型中的層按照從前至后順序依次執(zhí)行,第L層的輸出是第L+1層的輸入。在前向傳播的末尾,一個(gè)損失函數(shù)J被定義,用于衡量網(wǎng)絡(luò)模型輸出的預(yù)測(cè)結(jié)果Yi與真實(shí)標(biāo)簽Ti的差異,得到推斷誤差,如式(4)所示:
在反向傳播過程中,利用鏈?zhǔn)椒▌t和隨機(jī)梯度下降算法[29-31],由后至前計(jì)算權(quán)值梯度ΔW。計(jì)算如式(5)、式(6)所示:
最后,使用權(quán)值的梯度ΔW更新每層對(duì)應(yīng)的權(quán)值:
圖3展示了一個(gè)典型的CNN數(shù)據(jù)流。對(duì)于訓(xùn)練階段,神經(jīng)網(wǎng)絡(luò)的迭代過程可以細(xì)分為6個(gè)階段:
Fig.3 Data flow of CNN in computer systems圖3 計(jì)算系統(tǒng)的CNN數(shù)據(jù)流
數(shù)據(jù)預(yù)取①:首先,預(yù)取線程從存儲(chǔ)設(shè)備(比如硬盤、SSD)讀取圖像數(shù)據(jù)和對(duì)應(yīng)的標(biāo)簽到內(nèi)存。為了提高圖像讀取速度,圖像數(shù)據(jù)可以以數(shù)據(jù)庫(LMDB、LevelDB)或者HDF5格式保存在存儲(chǔ)設(shè)備。
圖像預(yù)處理②:對(duì)圖像進(jìn)行均值消減、裁剪、縮放等操作,變換到網(wǎng)絡(luò)規(guī)定的輸入大小(AlexNet網(wǎng)絡(luò)模型是3×227×227)。
數(shù)據(jù)拷貝③:將批次大小張圖像數(shù)據(jù)從內(nèi)存異步拷貝到顯存,供GPU計(jì)算使用。
網(wǎng)絡(luò)計(jì)算④:從顯存中讀取圖像數(shù)據(jù)、權(quán)值等,執(zhí)行每層的計(jì)算(包括前向傳播和反向傳播),并在反向傳播過程中計(jì)算每層的權(quán)值梯度ΔW。
權(quán)值更新⑤:利用權(quán)值梯度ΔW,通過W=W+ΔW更新顯存中的權(quán)值,并準(zhǔn)備下次迭代,迭代直至訓(xùn)練結(jié)束。
模型保存⑥:在訓(xùn)練過程中,為了避免進(jìn)程異?;蛘呦到y(tǒng)崩潰丟失訓(xùn)練的網(wǎng)絡(luò)模型,常常需要使用快照技術(shù)在一定數(shù)量的迭代次數(shù)后(例如10000次),將網(wǎng)絡(luò)模型保存到存儲(chǔ)設(shè)備。
本文的目的是探索神經(jīng)網(wǎng)絡(luò)訓(xùn)練階段GPU的計(jì)算效率和資源利用率,并分析影響GPU性能的根本原因。使用延時(shí)時(shí)間作為評(píng)價(jià)性能的指標(biāo)。首先對(duì)神經(jīng)網(wǎng)絡(luò)的一次迭代過程進(jìn)行量化分析,從數(shù)據(jù)流的角度詳細(xì)地給出迭代中各個(gè)階段的執(zhí)行時(shí)間。然后,從GPU加速庫、網(wǎng)絡(luò)模型和批次三方面討論對(duì)GPU計(jì)算效率和資源利用率的影響。最后統(tǒng)計(jì)了網(wǎng)絡(luò)模型中每層的權(quán)值數(shù)據(jù)和特征圖對(duì)顯存的使用情況。Caffe[32-33]提供了一個(gè)開發(fā)友好的平臺(tái),并且在訓(xùn)練神經(jīng)網(wǎng)絡(luò)方面展現(xiàn)出了良好的性能,因此選用Caffe作為本文的實(shí)驗(yàn)平臺(tái)。
硬件和軟件平臺(tái):表1詳細(xì)地展示了實(shí)驗(yàn)中使用的CPU和GPU的規(guī)格信息。本文使用的軟件平臺(tái)如表2所示。cuDNN是專為神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)的GPU加速庫,對(duì)卷積層、池化層、正則化層和激活層進(jìn)行大量?jī)?yōu)化。與cuDNN不同,cuBLAS是針對(duì)GPU設(shè)計(jì)的線性代數(shù)運(yùn)算庫,能夠利用GPU加速計(jì)算密集型操作。
Table 1 Hardware configurations表1 硬件配置
Table 2 Software configurations表2 軟件配置
網(wǎng)絡(luò)模型和負(fù)載:在實(shí)驗(yàn)中,本文選擇MNIST[34]和ImageNet[35]數(shù)據(jù)集作為不同網(wǎng)絡(luò)模型的負(fù)載。Ima-geNet數(shù)據(jù)集作為AlexNet[3]網(wǎng)絡(luò)和VGG-16[5]網(wǎng)絡(luò)的輸入,MNIST數(shù)據(jù)集作為L(zhǎng)eNet[36]網(wǎng)絡(luò)的輸入。ImageNet(240 GB,LMDB)包含128萬張訓(xùn)練圖像和50000張測(cè)試圖像,是一個(gè)用于訓(xùn)練視覺類網(wǎng)絡(luò)模型的典型大數(shù)據(jù)集。數(shù)據(jù)集中每一張圖像都用從0到999范圍內(nèi)的一個(gè)數(shù)字標(biāo)記,每一個(gè)數(shù)字代表自然界中一個(gè)具體的物種。另一方面,MNIST(59 MB,LMDB)數(shù)據(jù)集通常用于手寫數(shù)字的分類,有60000張訓(xùn)練圖像和10000張測(cè)試圖像。MNIST中的所有圖像都是28×28像素的灰度圖,每張圖像用0到9中的一個(gè)數(shù)字標(biāo)記,每一個(gè)數(shù)字代表一種手寫數(shù)字。
首先從數(shù)據(jù)流的角度,量化地給出一次迭代中各個(gè)階段的執(zhí)行時(shí)間,包括數(shù)據(jù)預(yù)取、圖像預(yù)處理、數(shù)據(jù)拷貝、網(wǎng)絡(luò)計(jì)算和權(quán)值更新。然后針對(duì)網(wǎng)絡(luò)計(jì)算階段,統(tǒng)計(jì)每層的執(zhí)行時(shí)間,并根據(jù)每層主要函數(shù)的執(zhí)行時(shí)間,分析網(wǎng)絡(luò)計(jì)算的瓶頸。
圖4列出了在磁盤陣列(4×HDD,RAID 0)和單個(gè)硬盤上訓(xùn)練AlexNet網(wǎng)絡(luò)模型,批次為256時(shí)各階段的執(zhí)行時(shí)間和一次迭代總時(shí)間。其中權(quán)值更新耗時(shí)較短,圖像預(yù)處理(transform)和網(wǎng)絡(luò)計(jì)算(forward和backward)耗時(shí)較長(zhǎng),數(shù)據(jù)預(yù)取時(shí)間與存儲(chǔ)設(shè)備有關(guān)。
Fig.4 Alexnets per stage computation latency over disk array and HDD圖4 Alexnet磁盤陣列和硬盤上各個(gè)階段計(jì)算延遲
圖像預(yù)處理:依次從內(nèi)存中讀取256張圖像,對(duì)每張圖像進(jìn)行均值消減、剪裁、縮放等操作。由于數(shù)據(jù)集有限,網(wǎng)絡(luò)模型需要迭代幾十萬次,為了防止之后的迭代過程使用與本次迭代相同的圖像數(shù)據(jù)作為輸入,圖像預(yù)處理引入了隨機(jī)函數(shù),在一定程度上隨機(jī)控制圖像轉(zhuǎn)換操作,防止過擬合。圖像轉(zhuǎn)換操作雖然簡(jiǎn)單,但是要對(duì)每個(gè)像素進(jìn)行操作,CPU處理256張圖像轉(zhuǎn)換需要大約110 ms。
數(shù)據(jù)拷貝:轉(zhuǎn)換后的圖像數(shù)據(jù)仍然保存在內(nèi)存中,實(shí)驗(yàn)中,150 MB數(shù)據(jù)從內(nèi)存拷貝到顯存需要13 ms。如果每次迭代前都需要串行地執(zhí)行數(shù)據(jù)預(yù)取、圖像預(yù)處理和數(shù)據(jù)拷貝,GPU大部分時(shí)間空閑。因此如圖3所示,使用單獨(dú)的預(yù)取線程進(jìn)行數(shù)據(jù)預(yù)取,同時(shí)數(shù)據(jù)拷貝以異步的方式執(zhí)行,這樣不僅可以高效利用內(nèi)存帶寬,而且分?jǐn)偭藬?shù)據(jù)預(yù)取階段的時(shí)間花銷。
網(wǎng)絡(luò)計(jì)算:網(wǎng)絡(luò)計(jì)算階段耗時(shí)223 ms,其中,前向傳播和反向傳播分別占40%和60%。
另外對(duì)于磁盤陣列,迭代時(shí)間主要取決于網(wǎng)絡(luò)計(jì)算(computation)的時(shí)間。而對(duì)于單個(gè)磁盤,數(shù)據(jù)讀取時(shí)間是磁盤陣列的5.4倍,較慢的讀取速度,大大增加了預(yù)取時(shí)間。數(shù)據(jù)層需要等待預(yù)取線程的圖像數(shù)據(jù),因此迭代時(shí)間決定于數(shù)據(jù)預(yù)取的時(shí)間。磁盤陣列的讀取速度能夠滿足網(wǎng)絡(luò)計(jì)算的需求,因此接下來重點(diǎn)分析網(wǎng)絡(luò)計(jì)算階段。
為了進(jìn)一步細(xì)粒度探究網(wǎng)絡(luò)計(jì)算階段的真實(shí)執(zhí)行情況,使用Nvidia Visual Profiler統(tǒng)計(jì)AlexNet網(wǎng)絡(luò)模型一次迭代中每層的函數(shù)執(zhí)行情況,并按照延時(shí)時(shí)間從大到小排序,表3展示了延時(shí)最高的15個(gè)函數(shù)。在所有耗時(shí)較高的函數(shù)中,卷積層的矩陣乘法運(yùn)算占87%,尤其是前兩個(gè)卷積層反向傳播中矩陣乘法運(yùn)算(bconv1和bconv2),占整個(gè)迭代時(shí)間的50%。因此,細(xì)粒度地分析卷積層矩陣操作的延時(shí),量化評(píng)估GPU的計(jì)算效率和資源利用情況,揭示影響GPU性能的根本原因,顯得格外重要。此外,池化層和全連接層反向傳播中的延時(shí)也不容忽視。
以AlexNet網(wǎng)絡(luò)模型為例,量化地給出了每一層計(jì)算操作的時(shí)間,為之后的實(shí)驗(yàn)分析提供了基礎(chǔ)。
針對(duì)網(wǎng)絡(luò)計(jì)算階段,首先對(duì)比AlexNet網(wǎng)絡(luò)在不同GPU加速庫下的GPU計(jì)算效率和資源利用率。然后細(xì)粒度地分析在大型、中型和小型網(wǎng)絡(luò)模型下GPU的性能差異。此外,還量化地揭示了在訓(xùn)練網(wǎng)絡(luò)模型過程中,每層的特征圖和權(quán)值數(shù)據(jù)的顯存占用情況。
Table 3 Top-15 latency of major functions in layers表3 層中主要函數(shù)時(shí)間延時(shí)的前15名
統(tǒng)計(jì)了在cuDNN和cuBLAS上訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的計(jì)算延時(shí),包括前向傳播、反向傳播和梯度更新,如圖5所示。cuBLAS庫的前向傳播和反向傳播過程比cuDNN慢了65%。由于權(quán)值更新階段的時(shí)間延時(shí)不超過4.4%,省略這部分的分析。
Fig.5 Latency for computation phase over cuDNN and cuBLAS圖5 cuDNN和cuBLAS在計(jì)算階段的延時(shí)
圖6展示了cuDNN和cuBLAS庫每層執(zhí)行時(shí)間對(duì)比(前向傳播和反向傳播)。從圖中可以看出,在相同的存儲(chǔ)設(shè)備和預(yù)取延時(shí)條件下,cuDNN計(jì)算更快,尤其是conv層和norm層,cuBLAS的平均延時(shí)分別是cuDNN的4倍和3.25倍。從整體來看,norm層、relu層和pool層耗時(shí)較短,重點(diǎn)分析conv層。
Fig.6 Per layer computation latency over cuDNN and cuBLAS圖6 cuDNN和cuBLAS每層的延時(shí)
為了深入地探究cuDNN和cuBLAS的計(jì)算效率,量化分析計(jì)算性能,用實(shí)際吞吐量與峰值吞吐量的比值衡量GPU的計(jì)算效率:
其中,flops是卷積層單精度浮點(diǎn)計(jì)算次數(shù);t是卷積層的執(zhí)行時(shí)間;Cores是GPU的CUDA核數(shù)量。
圖7展示了本文的實(shí)驗(yàn)結(jié)果,卷積層cuDNN的計(jì)算效率遠(yuǎn)高于cuBLAS,是cuBLAS的2倍。雖然cuBLAS在全連接層的計(jì)算效率較高,但是與cuDNN差別不大。前面提到,卷積層cuBLAS的總延時(shí)是cuDNN的4倍,但卷積層的計(jì)算效率僅僅為cuDNN的一半,這是因?yàn)榫矸e層cuBLAS每次處理一張圖像,循環(huán)執(zhí)行256次(批次256)。cuDNN一次處理256張圖像,減少了CUDA函數(shù)調(diào)用次數(shù)。另外,處理過程中的一些異步操作(im2col[16])也會(huì)在一定程度上減少耗時(shí)。
Fig.7 Per layer compute efficiency over cuDNNandcuBLAS圖7 cuDNN和cuBLAS每層的計(jì)算效率
表4列出了卷積層和全連接層網(wǎng)絡(luò)計(jì)算過程中的矩陣信息??梢钥闯?,對(duì)于相同大小的結(jié)果矩陣,cuDNN和cuBLAS實(shí)際執(zhí)行的子矩陣大小也有很大差別。這一方面是由硬件條件決定的(例如顯存大小、寄存器數(shù)量等),另一方面也與GPU內(nèi)部塊和線程的劃分有關(guān)。
為了進(jìn)一步探究GPU內(nèi)部計(jì)算資源的利用情況,探究GPU計(jì)算效率低的原因,定義矩陣乘法計(jì)算過程中實(shí)際劃分的線程塊的數(shù)量:
Table 4 Detail information of CNN dominated kernels表4 CNN主要核函數(shù)的詳細(xì)信息
其中,M×N是結(jié)果矩陣的大小;m×n是CUDA劃分后實(shí)際執(zhí)行的子矩陣的大小,這樣結(jié)果矩陣就可以通過執(zhí)行若干個(gè)子矩陣操作計(jì)算。
由于GPU寄存器資源有限,而矩陣乘法是寄存器密集型的操作,每個(gè)線程至少使用81個(gè)寄存器,因此從寄存器利用的角度衡量最大可用的線程塊數(shù):
如果Gridsize小于maxBlocks,則說明GPU資源未充分利用。如果Gridsize大于maxBlocks,則GPU資源也存在利用率不高的情形,為了量化GPU資源利用率,使用RU衡量GPU的資源利用效率:
其中,cycles是GPU執(zhí)行完所有Gridsize需要的時(shí)鐘周期。在反向傳播過程中,既有權(quán)值梯度的計(jì)算,又有梯度映射的計(jì)算。表3中顯示,對(duì)于大多數(shù)層,權(quán)值梯度ΔW的計(jì)算延時(shí)高于梯度映射ΔY的計(jì)算延時(shí)。盡管conv2層梯度映射延時(shí)較高,但是與權(quán)值梯度延時(shí)差距不大。因此,重點(diǎn)分析反向傳播中權(quán)值梯度的計(jì)算過程。圖8展示了本文的實(shí)驗(yàn)結(jié)果。
Fig.8 Resource utilization of main layers over cuDNN and cuBLAS圖8 cuDNN和cuBLAS在關(guān)鍵層的資源利用率
對(duì)于cuDNN,卷積層的資源利用率最高,基本都在95%以上,全連接層在80%左右。而對(duì)于cuBLAS,卷積層的資源利用率平均只有47%,全連接層的資源利用率達(dá)到最高。這是因?yàn)榫矸e層cuBLAS每次處理一張圖像,數(shù)據(jù)量較少,實(shí)際分配的Gridsize要小于maxBlocks,導(dǎo)致GPU的計(jì)算資源并沒有充分利用。而cuDNN是將256張圖像的處理過程融合成一次大矩陣操作,訓(xùn)練過程較大的批次,使得結(jié)果矩陣很大,從而Gridsize遠(yuǎn)大于maxBlocks,實(shí)現(xiàn)了較高的資源利用率和計(jì)算效率。另外對(duì)于全連接層,cuDNN和cuBLAS都是將一批圖像的計(jì)算看作一次矩陣操作,因此兩者的資源利用率相近。
bfc6層cuBLAS資源利用率遠(yuǎn)高于cuDNN,是因?yàn)閏uBLAS使用了較大的blocksize,一定程度上使得Gridsize大于maxBlocks。
總之,由于cuDNN和cuBLAS矩陣操作方面處理方式的不同,使得它們?cè)谟?jì)算效率和資源利用率上差異很大。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型時(shí),由于較大的批次和數(shù)據(jù)量,使得cuDNN的性能要高于cuBLAS。因此,根據(jù)網(wǎng)絡(luò)模型結(jié)果矩陣的大小,合理地分配設(shè)置子矩陣大小、塊大小和線程數(shù),會(huì)增加GPU的計(jì)算效率和資源利用率,加快訓(xùn)練過程。
不同網(wǎng)絡(luò)模型使用的卷積核和圖像大小不同,間接地導(dǎo)致GPU資源分配不均勻,從而影響訓(xùn)練性能。因此,在不同模型下,對(duì)比了GPU的計(jì)算效率和資源利用率。圖9、圖10分別展示了3種網(wǎng)絡(luò)模型LeNet、AlexNet和VGG-16的GPU計(jì)算效率和資源利用率。
首先無論是大型、中型還是小型網(wǎng)絡(luò)模型,卷積層的計(jì)算效率都高于全連接層,是全連接層的1.94倍。這是因?yàn)榫矸e層的矩陣大小遠(yuǎn)遠(yuǎn)大于全連接層,GPU計(jì)算效率更高。另外VGG-16中卷積層矩陣更大,計(jì)算效率最高,其次是AlexNet和LeNet。而全連接層的計(jì)算效率AlexNet最高,其次是VGG-16和LeNet。由于較小的網(wǎng)絡(luò)模型和簡(jiǎn)單的計(jì)算操作,LeNet的卷積層和全連接層的計(jì)算效率都不高。
Fig.9 Compute efficiency of GPU in main layers overAlexNet,LeNet and VGG-16圖9 AlexNet、LeNet和VGG-16在關(guān)鍵層GPU的計(jì)算效率
Fig.10 Resource utilization of main layers overAlexNet,LeNet and VGG-16圖10 AlexNet、LeNet和VGG-16在關(guān)鍵層的資源利用率
從資源利用率角度看,較大的矩陣規(guī)模和復(fù)雜的矩陣運(yùn)算使VGG-16和AlexNet在卷積層的資源利用率幾乎達(dá)到了100%。AlexNet網(wǎng)絡(luò)在全連接層的資源利用率達(dá)到了80%,VGG-16和LeNet都低于50%。這是因?yàn)锳lexNet的全連接層分配了較大的blocksize和r,較小的maxBlocks使得Gridsize是max-Blocks的1.5倍。而LeNet和VGG-16網(wǎng)絡(luò)模型,實(shí)際分配的Gridsize不到maxBlocks的一半,導(dǎo)致了極低的資源利用率。
VGG-16的全連接層反向傳播(bfc6、bfc7和bfc8)的資源利用率遠(yuǎn)高于前向傳播(fc6、fc7和fc8)。由5.1節(jié)的分析可知,對(duì)于大部分卷積層和全連接層,反向傳播計(jì)算參數(shù)梯度的時(shí)間長(zhǎng)于計(jì)算輸入的梯度,因此,主要討論參數(shù)梯度計(jì)算階段的資源利用情況。VGG-16的全連接層在參數(shù)梯度計(jì)算中擁有比輸入梯度計(jì)算更大的batchsize和r,另外VGG-16復(fù)雜的網(wǎng)絡(luò)模型和較多的參數(shù),也進(jìn)一步加大了Gridsize和maxBlocks之間的差值,增大了資源利用率。
總之,通過圖9和圖10,卷積層的資源利用率和計(jì)算效率較高,并且相比于小型網(wǎng)絡(luò)(LeNet),中型網(wǎng)絡(luò)(AlexNet)和大型網(wǎng)絡(luò)(VGG-16)的計(jì)算效率達(dá)到了70%。全連接層的資源利用率和計(jì)算效率普遍較低,對(duì)于全連接層較多的網(wǎng)絡(luò),增大全連接層的計(jì)算效率顯得格外重要。
通過5.1節(jié)和5.2節(jié)可知,分配的blocksize大小、寄存器的數(shù)量以及使用的Gridsize大小會(huì)對(duì)計(jì)算效率和資源利用率產(chǎn)生很大影響。前面已經(jīng)量化地討論了GPU加速庫和網(wǎng)絡(luò)模型帶來的性能差異。但是訓(xùn)練階段批次大小也會(huì)影響結(jié)果矩陣的大小,進(jìn)而通過Gridsize影響計(jì)算效率和資源利用率。
圖11和圖12分別給出了AlexNet網(wǎng)絡(luò)模型在批次為128、256和512時(shí)的計(jì)算效率和資源利用率??梢钥闯觯卧酱笥?jì)算效率越高。批次為512的計(jì)算效率比256和128分別高出11%和41%。因此,適當(dāng)增加批次會(huì)增加GPU的計(jì)算效率。
Fig.11 Compute efficiency of main layers over different batchsizes圖11 不同批次下關(guān)鍵層的計(jì)算效率
Fig.12 Resource utilization of main layers over different batchsizes圖12 不同批次下關(guān)鍵層的資源利用率
從資源利用率角度看,不同批次并沒有太大差別且都大于80%。這是因?yàn)樵谇跋騻鞑ブ?,盡管批次的差異會(huì)造成Gridsize差別很大(與批次大小成正比),但是不同批次的blocksize和r完全相同,因此資源利用率基本相同。fc8層512批次的GPU資源利用率較高的原因是完成所有Gridsize需要的時(shí)鐘周期cycles不嚴(yán)格地與Gridsize成正比。另外,在反向傳播中沒有出現(xiàn)這種現(xiàn)象,這是因?yàn)樵诜聪騻鞑ブ袇?shù)梯度的計(jì)算,參數(shù)的數(shù)量不會(huì)隨著批次改變??傊?,計(jì)算效率會(huì)在一定程度上隨著批次的增大而提高,但是批次對(duì)資源利用率的影響極小,基本可以忽略。因此計(jì)算效率和資源利用率并不是嚴(yán)格正相關(guān)。
圖13展示了不同網(wǎng)絡(luò)模型的顯存占用情況。可以看出,隨著人們對(duì)模型計(jì)算精度需求的提升,網(wǎng)絡(luò)模型不斷增大,顯存使用越來越大。在當(dāng)前的框架中,為了提升網(wǎng)絡(luò)的訓(xùn)練過程速度,所有的數(shù)據(jù)包括權(quán)值、特征圖和預(yù)取圖像都存放在顯存,通過這種方式減少GPU對(duì)內(nèi)存的訪問,減低內(nèi)存與顯存數(shù)據(jù)拷貝的時(shí)間開銷。但是當(dāng)網(wǎng)絡(luò)模型所需顯存大于顯存的最大容量時(shí),模型的訓(xùn)練過程將無法執(zhí)行。另外,盡管總的顯存使用量很高,但是層級(jí)的顯存利用率不到20%。在分析GPU計(jì)算效率和資源利用率的同時(shí),很有必要關(guān)注并量化地分析訓(xùn)練過程中顯存的使用情況。
Fig.13 GPU memory allocation size and max layer-wise usage圖13 不同模型的顯存分配和層級(jí)的最大顯存使用
為了探究不同網(wǎng)絡(luò)模型下顯存的使用情況,量化顯存利用率,對(duì)LeNet、AlexNet和VGG網(wǎng)絡(luò)每層的顯存占用情況進(jìn)行了詳細(xì)的分析,結(jié)果如圖14~圖16所示。
Fig.14 GPU memory allocation size of each layer inAlexNet(512)圖14 AlexNet(512)網(wǎng)絡(luò)每層顯存占用情況
Fig.15 GPU memory allocation size of each layer in LeNet(256)圖15 LeNet(256)網(wǎng)絡(luò)每層顯存占用情況
Fig.16 GPU memory allocation size of each layer in VGG-16(64)圖16 VGG-16(64)網(wǎng)絡(luò)每層顯存占用情況
前兩個(gè)卷積層和第一個(gè)全連接層顯存占用較高,因?yàn)榍皟蓚€(gè)卷積層使用大量卷積核在原始圖像上進(jìn)行特征提取(比如AlexNet的conv1層有96個(gè)卷積核),生成大量特征圖。全連接層將特征圖映射到樣本空間,參數(shù)數(shù)據(jù)量遠(yuǎn)大于特征圖量。Relu層和drop層沒有顯存分配,因?yàn)檫@些層在卷積層上進(jìn)行原地更新。
雖然訓(xùn)練階段顯存占用量很大,但是每層的顯存占用較低,因此根據(jù)每層的數(shù)據(jù)量對(duì)顯存進(jìn)行合理的分配將會(huì)提高GPU訓(xùn)練大型網(wǎng)絡(luò)的能力。
本文針對(duì)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練階段進(jìn)行了細(xì)粒度的分析,量化地給出了數(shù)據(jù)預(yù)取、數(shù)據(jù)拷貝、網(wǎng)絡(luò)計(jì)算等階段的時(shí)間延時(shí)以及每層的時(shí)間延時(shí)。對(duì)于網(wǎng)絡(luò)計(jì)算階段,探討了GPU加速庫、網(wǎng)絡(luò)模型和批次對(duì)GPU計(jì)算效率和資源利用率的影響。另外,給出了不同網(wǎng)絡(luò)模型每層的參數(shù)、特征圖等的顯存占用量,指出了通過調(diào)度每層顯存分配能實(shí)現(xiàn)訓(xùn)練大規(guī)模神經(jīng)網(wǎng)絡(luò)。