陳 杰,李 程,劉 仲
(國(guó)防科技大學(xué)計(jì)算機(jī)學(xué)院,湖南 長(zhǎng)沙 410073)
近年來(lái),以卷積神經(jīng)網(wǎng)絡(luò)為代表的深度學(xué)習(xí)技術(shù)不僅在圖像識(shí)別[1-3]、自然語(yǔ)言處理[4,5]等領(lǐng)域發(fā)揮了巨大的作用,而且在金融[6,7]、推薦算法[8,9]和物理學(xué)[10]等領(lǐng)域也同樣彰顯了重大的應(yīng)用價(jià)值。然而,卷積神經(jīng)網(wǎng)絡(luò)模型的性能提升是以龐大的數(shù)據(jù)和計(jì)算量為前提的。傳統(tǒng)CPU(Central Processing Unit)設(shè)計(jì)的側(cè)重點(diǎn)在于通用性,集成了較多的控制單元,對(duì)深度學(xué)習(xí)的加速效果不夠理想。為了加快深度學(xué)習(xí)計(jì)算,許多科技公司投入了大量人力物力,用于定制深度學(xué)習(xí)加速器,如谷歌的張量處理器TPU(Tensor Processing Unit)[11]、海思研發(fā)的NPU(Neural network Processing Unit)[12]和英特爾研發(fā)的深度學(xué)習(xí)訓(xùn)練加速器NNP(Nervana Neural network Processors)[13]。這些深度學(xué)習(xí)加速器具有更高的并行處理能力,在面向深度學(xué)習(xí)領(lǐng)域應(yīng)用時(shí)的功耗和效率表現(xiàn)要遠(yuǎn)強(qiáng)于通用CPU的。
FT-M7004是一款由國(guó)防科技大學(xué)自主研發(fā)的多核向量加速器,在大規(guī)模矩陣乘法、快速傅里葉變換等科學(xué)計(jì)算應(yīng)用領(lǐng)域能夠?qū)崿F(xiàn)較高的計(jì)算效率。FT-M7004采用了單指令流多數(shù)據(jù)流SIMD(Single Instruction Multiple Data)技術(shù)和超長(zhǎng)指令字VLIW(Very Long Instruction Word)架構(gòu),支持標(biāo)向量混合運(yùn)算,具備強(qiáng)大的并行處理能力。卷積神經(jīng)網(wǎng)絡(luò)的計(jì)算瓶頸主要在于卷積層和全連接層,因?yàn)檫@2層算子的實(shí)現(xiàn)需要大量的乘加運(yùn)算。FT-M7004也集成了大量的乘加器,在加速卷積神經(jīng)網(wǎng)絡(luò)的計(jì)算上擁有顯著優(yōu)勢(shì)。然而目前基于多核向量加速器的深度學(xué)習(xí)推理和訓(xùn)練算法還缺乏系統(tǒng)性的研究。
卷積神經(jīng)網(wǎng)絡(luò)主要由數(shù)據(jù)輸入層、卷積層、激活函數(shù)、池化層和全連接層組成,其中計(jì)算主要集在卷積層和全連接層。文獻(xiàn)[14]指出卷積層占據(jù)了90%~95%的計(jì)算量。因此,如何高效地實(shí)現(xiàn)卷積層的推理和訓(xùn)練算法是研究的重點(diǎn)。在算法層次上,Img2col[15,16]、Winograd算法[17,18]、Cook-Toom算法[19]和FFT(Fast Fourier Transform)[20]用于實(shí)現(xiàn)卷積層推理,col2img用于實(shí)現(xiàn)卷積層訓(xùn)練。Img2col主要是通過(guò)將圖像數(shù)據(jù)和卷積核數(shù)據(jù)展開(kāi)為二維矩陣的形式,以矩陣乘法的形式實(shí)現(xiàn)卷積計(jì)算。Img2col算法的缺點(diǎn)是需要在每一層對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,存在較多的冗余空間開(kāi)銷。Winograd算法將圖像數(shù)據(jù)和卷積核數(shù)據(jù)分割成塊,并將數(shù)據(jù)展開(kāi),之后將乘法轉(zhuǎn)變成加法。在卷積核尺寸較大時(shí),Winograd算法加速效果不佳。Cook-Toom算法與Winograd算法類似,其加速效果和使用范圍均不如前者的。卷積操作同樣可以轉(zhuǎn)換成FFT來(lái)加速,之后再進(jìn)行逆變換得到最終結(jié)果。當(dāng)卷積核尺寸較小時(shí),FFT算法加速效果收益不大。同時(shí),由于上述算法主要應(yīng)用于CPU和GPU,與FT-M7004平臺(tái)的體系結(jié)構(gòu)差異較大,所以需要針對(duì)多核向量加速器設(shè)計(jì)新的推理和訓(xùn)練算法。
本文針對(duì)自主設(shè)計(jì)的多核向量加速器FT-M7004上的VGG[21]網(wǎng)絡(luò)模型推理和訓(xùn)練算法,分別提出了卷積、池化和全連接等核心算子的向量化映射方法,并進(jìn)行了性能測(cè)試與分析。本文工作主要包含以下幾個(gè)方面:
(1)分析了FT-M7004體系結(jié)構(gòu)的特點(diǎn);
(2)提出了卷積、池化和全連接算子的前向推理和反向訓(xùn)練算法的向量化映射方法;
(3)采用DMA(Direct Memory Access)雙緩沖傳輸、向量并行和權(quán)值共享等優(yōu)化策略,在FT-M7004平臺(tái)上對(duì)上述算法進(jìn)行優(yōu)化;
(4)對(duì)不同規(guī)模的卷積、池化和全連接算法進(jìn)行了性能測(cè)試與分析。
FT-M7004包含CPU和向量加速器2種處理器核心。CPU用于運(yùn)行操作系統(tǒng),進(jìn)行任務(wù)管理;向量加速器采用VLIW和SIMD體系結(jié)構(gòu),為FT-M7004提供了主要的計(jì)算能力。FT-M7004集成了4個(gè)向量加速器核,單核單精度浮點(diǎn)運(yùn)算峰值性能可以達(dá)到128 GFlops。每個(gè)加速器的核心由1個(gè)標(biāo)量處理單元SPU(Scalar Processing Unit)和1個(gè)向量處理單元VPU(Vector Processing Unit)組成。SPU主要用于標(biāo)量運(yùn)算和流控管理,并支持將標(biāo)量寄存器的數(shù)據(jù)廣播到VPU中的向量寄存器,使得SPU可以為向量單元運(yùn)算提供數(shù)據(jù)。VPU集成了16個(gè)同構(gòu)的向量處理單元VPE(Vector Processing Element)。每個(gè)VPE包含了4個(gè)乘累加MAC(Multiply ACcumulate)單元,提供了大部分的算力。FT-M7004的片上陣列存儲(chǔ)器AM(Array Memory)采用了多存儲(chǔ)體的組織方式,能同時(shí)支持2個(gè)向量存儲(chǔ)操作和DMA向量數(shù)據(jù)訪問(wèn)操作,為VPU提供了多達(dá)2 048位的訪存帶寬,能夠滿足16個(gè)VPE的高并行SIMD計(jì)算需求。
本節(jié)將對(duì)本文算法中使用到的符號(hào)進(jìn)行說(shuō)明。所有張量的索引都是從0開(kāi)始。圖像和權(quán)重的原始數(shù)據(jù)分別采用NCHW(N表示圖像批處理大小,C表示圖像通道數(shù),H表示圖像的高度,W表示圖像的寬度)和OCHW(O表示卷積核數(shù)量,C表示卷積核通道數(shù),H表示卷積核的高度,W表示卷積核的寬度)布局。令N表示批處理的圖像數(shù)量;F′表示網(wǎng)絡(luò)每一層前向推理的輸入張量;Z′表示網(wǎng)絡(luò)每一層前向推理的輸出張量;dZ′表示網(wǎng)絡(luò)每一層訓(xùn)練的輸入張量;dF′表示網(wǎng)絡(luò)每一層訓(xùn)練的輸出張量;pF′表示對(duì)輸入張量F′的所有特征圖外圍填充零后的張量;Zd,i,j表示卷積層輸出的第d幅特征圖第i行第j列的值。卷積層和池化層輸入圖像的通道數(shù)為C,輸出圖像的通道數(shù)為O,高度和寬度分別為nH和nW。WEI表示卷積核或全連接層的權(quán)重,bias表示偏置向量,卷積核的高為kH,寬為kW,卷積步長(zhǎng)為st。WEId,c,m,n表示4維卷積核張量WEI在索引[d,c,m,n]處的值。在池化層,池化單元的高、寬和步長(zhǎng)的表示與卷積層的一致。全連接層的符號(hào)同理。X[m,k]表示矩陣X中第m行、第k列的元素。M[d:]表示矩陣M中第d行的元素,M[d:m,]表示矩陣M中第d行到第m行的元素。矩陣Ar*c,表示A的行數(shù)為r、列數(shù)為c,bias[n]表示向量bias第n個(gè)位置的元素。Zn,d,i,j表示卷積層第n個(gè)樣本在第d個(gè)通道第i行第j列的值。X[:i]代表矩陣X的第i列。全連接層的輸入神經(jīng)元個(gè)數(shù)為K,輸出神經(jīng)元個(gè)數(shù)為M。Abs表示一個(gè)函數(shù),當(dāng)輸入值為負(fù)時(shí),輸出值為0,否則仍為輸入值。pad表示輸入特征圖邊緣填充零的個(gè)數(shù)。Max(x,0)表示對(duì)輸入的標(biāo)量x與0進(jìn)行比較,取其中的最大值。
本文算法將卷積神經(jīng)網(wǎng)絡(luò)前向計(jì)算的輸入特征數(shù)據(jù)和反向傳播的輸入誤差梯度進(jìn)行存儲(chǔ)。如圖1所示,每一列存儲(chǔ)一個(gè)樣本數(shù)據(jù),每列的存儲(chǔ)順序?yàn)?首先為圖像通道C方向優(yōu)先,接著是圖像寬度W方向優(yōu)先,最后是圖像高度H方向優(yōu)先;如圖2所示,卷積核張量存儲(chǔ)為二維卷積核矩陣,其中矩陣的每一行表示一個(gè)卷積核,每行的存儲(chǔ)順序首先為卷積核寬度kW方向優(yōu)先,接著是卷積核高度kH方向優(yōu)先,最后是卷積核通道C方向優(yōu)先。本文算法均采用這種數(shù)據(jù)布局,因此卷積神經(jīng)網(wǎng)絡(luò)中的張量都將轉(zhuǎn)換為二維矩陣。為了便于區(qū)分3.1節(jié)中的張量,以F和Z分別代表實(shí)際的輸入和輸出張量,WT表示實(shí)際的權(quán)重。
Figure 1 Input image layout conversion
Figure 2 Weight data layout conversion
直接卷積算法如式(1) 所示,單次只能計(jì)算一個(gè)輸出值,效率較低,且需要對(duì)原始輸入進(jìn)行補(bǔ)0,存在較大的數(shù)據(jù)搬運(yùn)開(kāi)銷。
pF′t,c,i*st+m,j*st+n)
(1)
本文提出了一種批圖像融合卷積計(jì)算算法,可以將卷積計(jì)算轉(zhuǎn)換成大規(guī)模矩陣乘法,如圖3所示,同時(shí)也不需要對(duì)原始圖像進(jìn)行補(bǔ)零填充。
Figure 3 Implementation of convolutional algorithm
如算法1所示,可以提前計(jì)算當(dāng)前卷積區(qū)域填充0的個(gè)數(shù),只從卷積核矩陣和輸入圖像矩陣提取實(shí)際參與運(yùn)算的行與列。令卷積區(qū)域左上角的元素所在行為i、所在列為j,則其上方填充零的行數(shù)up0為Max(pad-i,0),其下方填充零的行數(shù)down0為Max(pad+kH-H-pad,0),其左側(cè)填充零的列數(shù)left0為Max(pad-j,0),其右側(cè)填充零的列數(shù)right0為Max(j+kW-W-pad,0)。實(shí)際參與運(yùn)算的輸入圖像矩陣的起始行號(hào)為i+up0-pad,起始列號(hào)為j+left0-pad。實(shí)際參與運(yùn)算的卷積核矩陣的起始行號(hào)為up0,起始列號(hào)為left0。通過(guò)行號(hào)和列號(hào)即可提取對(duì)應(yīng)的子矩陣。
算法1 Conv_forward輸入:F,WT。輸出:Z。步驟1 pH=H+pad*2,pW=W+2*pad;步驟2 for (int h=0;h 接下來(lái)定義被提取的卷積核子矩陣為W,輸入圖像的子矩陣為M,則有式(2): (2) 其中,x=d+i*O*nW+j*O。 從卷積層的推理過(guò)程,可以得到卷積層對(duì)輸入圖像的梯度,如式(3)所示: (3) 其中,i′=i*st+m,j′=j*st+n,i∈[0,nH-1],j∈[0,nW-1]。式(3)可繼續(xù)化簡(jiǎn)為式(4): (4) 其中,m=i′-i*st,n=j′-j*st,且m∈[0,kH-1],n∈[0,kW-1]。當(dāng)(i′-m)/st∈[0,nH-1]且(i′-m)可被st整除,同時(shí)(j′-n)/st∈[0,nH-1]且(j′-n)可被st整除時(shí),式(4)可進(jìn)一步化簡(jiǎn)為式(5): (5) 令δdZl,o,i*st,j*st=dZ′l,o,i,j,且對(duì)于δdZ′l,o,k,t,若k不可被st整除或t不可被st整除,則δdZ′l,o,k,t為0。由式(5)可推出式(6): (6) 其中,i′≥m且j′ ≥n。 令δpdZ′l,o,i+kH-1,j+kW-1=δdZ′l,o,i,j,且對(duì)于δpdZ′l,o,k,t,若k∈[0,kH-2]或t∈[0,kW-2] ,則δpdZ′l,o,k,t為0。由式(6)可推出式(7): (δpdZ′l,o,i′-m+kH-1,j′-n+kW-1×WEIo,c,m,n) (7) 令m′=kH-1-m,n′=kW-1-n,可得到式(8): WEIo,c,kH-1-m′,kW-1-n′) (8) 式(8)可等價(jià)轉(zhuǎn)換為式(9): WEIo,c,kH-1-m,kW-1-n) (9) 令rotWo,c,m,n=WEIo,c,kH-1-m,kW-1-n,如式(10)所示。卷積核的訓(xùn)練過(guò)程實(shí)質(zhì)是在dZ′的每個(gè)矩陣行列間直接插入st-1行列零元素后(即δdZ),再在元素外圍填充高度和寬度為kH-1和kW-1的零元素后的梯度矩陣(即pδdZ′),作為新的卷積層的輸入。旋轉(zhuǎn)180°后的卷積核矩陣rotW作為卷積核。兩者進(jìn)行卷積計(jì)算得到的結(jié)果。但是,由于填充零的過(guò)程中存在大量的數(shù)據(jù)搬移開(kāi)銷,效率低下。本文提出了算法2,避免了填充零帶來(lái)的額外開(kāi)銷,同樣以矩陣乘法的形式實(shí)現(xiàn)了其中的核心計(jì)算。 (10) 算法2 Conv_backward輸入:dZ,Weight。輸出:dF。步驟1 for (int h=pad;h 為了確定rotW矩陣中真正參與運(yùn)算的行與列,算法2中使用hS來(lái)記錄卷積核中參與運(yùn)算的起始行號(hào),使用wS來(lái)記錄卷積核中參與運(yùn)算的起始列號(hào)。原梯度矩陣的起始行號(hào)h0對(duì)應(yīng)pδdZ′中梯度矩陣的第h0*st+kH-1行。原梯度矩陣的起始列號(hào)w0對(duì)應(yīng)rotW每個(gè)矩陣中的第w0*st+kW-w列。實(shí)際參與卷積計(jì)算的梯度矩陣每一列的元素間隔st-1個(gè)元素,每一行間隔st-1個(gè)元素。最后類似算法1中提取子矩陣的方式,在不對(duì)原數(shù)據(jù)填充零的情況下,完成卷積層的訓(xùn)練。 針對(duì)FT-M7004的體系結(jié)構(gòu),本文使用算法3來(lái)高效實(shí)現(xiàn)最大池化層的計(jì)算。 本節(jié)使用index矩陣記錄Buffer中每一列的最大值,并計(jì)算其對(duì)應(yīng)F中的行號(hào),得到輸出圖像的子矩陣。 以最大池化層為例,對(duì)于每一個(gè)輸出位置Z′n,d,i,j,都需要找到其對(duì)應(yīng)的輸入位置F′n,d,i′,j′,并繼續(xù)傳播輸入的梯度。具體算法實(shí)現(xiàn)如算法4所示。 算法4 MaxPool2d_backward輸入:dZ。輸出:dF。步驟1 for(int c=0;c 算法4中pos代表推理時(shí)最大值所對(duì)應(yīng)的行號(hào),k代表最大值對(duì)應(yīng)的列,算法的核心是將dZ矩陣第row行第k列的值累加至dF中的第pos行第k列。 全連接層的本質(zhì)是矩陣乘法,其計(jì)算如式(11)和式(12)所示: (11) Z=WT×F+bias (12) 具體計(jì)算如算法5所示。 算法5 FC_forward輸入:F,WT,Bias。輸出:Z。步驟1 for (int i=0;i 每次將矩陣WT第i行第j個(gè)元素乘以矩陣F第j行元素,并將結(jié)果累加至矩陣Z的第i行,相較樸素矩陣乘法擁有更好的空間局部性。 從全連接層的推理過(guò)程不難得出對(duì)權(quán)重和偏置求導(dǎo)的式(13)和式(14): (13) (14) dW[i,k]的值即為dZ的第i行與F的第k行相乘,dF[k,j]的值為dZ的第j列與WT的第k列相乘,如式(15)所示: (15) 然而向量加速器在矩陣間列運(yùn)算上的效果表現(xiàn)不佳,所以需要對(duì)式(15)進(jìn)行轉(zhuǎn)換,轉(zhuǎn)置矩陣為WT,則有式(16): (16) 所以,dF就等于轉(zhuǎn)置后的WT矩陣與dZ矩陣進(jìn)行矩陣乘法。具體算法如算法6所示。 算法6 FC_backward輸入:dZ,lr。輸出:dF。步驟1 for (int i=0;i 由式(13)可知,bias梯度的每一個(gè)值實(shí)際上對(duì)應(yīng)了dZ矩陣每一行的和。 面向FT-M7004平臺(tái),卷積神經(jīng)網(wǎng)絡(luò)推理和訓(xùn)練算法的優(yōu)化需要經(jīng)過(guò)以下步驟:首先,需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,將圖像數(shù)據(jù)和權(quán)重?cái)?shù)據(jù)的布局進(jìn)行調(diào)整;其次,將輸入圖像數(shù)據(jù)從DDR(Double Data Rate synchronous)內(nèi)存中傳輸?shù)疥嚵写鎯?chǔ)器AM(Array Memory);再次,對(duì)核心計(jì)算進(jìn)行向量并行優(yōu)化;最后,將訓(xùn)練結(jié)果從向量空間傳輸?shù)紻DR內(nèi)存中。在以上步驟中,涉及到的優(yōu)化有以下幾個(gè)方面: (1)數(shù)據(jù)布局預(yù)處理; (2)DMA雙緩沖區(qū)傳輸; (3)權(quán)值共享; (4)向量并行優(yōu)化。 在第1層卷積計(jì)算過(guò)程中,圖像數(shù)據(jù)通過(guò)DMA轉(zhuǎn)置傳輸?shù)较蛄筷嚵写鎯?chǔ)器(AM)中,單個(gè)樣本的圖像數(shù)據(jù)全部存儲(chǔ)在同一列中。第1層卷積計(jì)算完成后,圖像數(shù)據(jù)通過(guò)DMA傳回DDR并保持相同格式。在后續(xù)的卷積、池化、全連接等計(jì)算過(guò)程中,圖像數(shù)據(jù)的存儲(chǔ)格式保持不變。這種數(shù)據(jù)格式有助于將大量小規(guī)模的卷積計(jì)算直接轉(zhuǎn)化為大規(guī)模的矩陣乘法,并以行連續(xù)的方式進(jìn)行數(shù)據(jù)訪問(wèn),可以最大限度地實(shí)現(xiàn)計(jì)算的向量化和并行化,提高計(jì)算性能和內(nèi)存訪問(wèn)效率。 本文提出DMA 雙緩沖區(qū)的數(shù)據(jù)搬移優(yōu)化策略。首先,在AM中劃分一塊區(qū)域用于存放輸入圖像數(shù)據(jù);其次,將該區(qū)域劃分為A和B2個(gè)緩沖區(qū),在將一個(gè)輸入圖像的子矩陣傳入A緩沖區(qū)后,開(kāi)始計(jì)算的同時(shí),將下一個(gè)輸入圖像的子矩陣傳入B緩沖區(qū);在A緩沖區(qū)計(jì)算完之后,再將下一個(gè)輸入子矩陣傳入A緩沖區(qū),同時(shí)進(jìn)行B緩沖區(qū)的計(jì)算。采用這種方式可以實(shí)現(xiàn)計(jì)算與數(shù)據(jù)搬移重疊,若數(shù)據(jù)傳輸時(shí)間小于計(jì)算時(shí)間,則可以有效隱藏?cái)?shù)據(jù)傳輸時(shí)間,從而提高整體計(jì)算效率。 卷積權(quán)重?cái)?shù)據(jù)通過(guò)DMA廣播傳輸?shù)矫總€(gè)核的標(biāo)量存儲(chǔ)器SM(Scalar Memeory)。只需一次DDR數(shù)據(jù)訪問(wèn)即可實(shí)現(xiàn)所有參與計(jì)算的圖像的權(quán)重?cái)?shù)據(jù)共享,可以大大減少權(quán)重?cái)?shù)據(jù)的傳輸時(shí)間,同時(shí)最大程度地實(shí)現(xiàn)權(quán)重?cái)?shù)據(jù)的共享。 權(quán)重?cái)?shù)據(jù)通過(guò)標(biāo)量Load指令讀入第k個(gè)標(biāo)量寄存器(Rk),然后通過(guò)廣播指令傳送到第k個(gè)向量寄存器(VRK)。圖像數(shù)據(jù)通過(guò)向量Load指令讀入第i個(gè)向量寄存器(VRi)。VRK和VRi的乘加并行計(jì)算是使用SIMD的向量化計(jì)算。 向量處理器的并行計(jì)算效率可以通過(guò)標(biāo)量和向量之間的協(xié)同計(jì)算來(lái)最大化。 本文的實(shí)驗(yàn)?zāi)繕?biāo)平臺(tái)是FT-M7004,另外選擇了NVIDIA?的GTX 1080、Pascal Titan X和Maxwell Titan X進(jìn)行對(duì)比實(shí)驗(yàn)。 本文選取了不同批大小的圖像數(shù)量作為輸入,使用Caffe框架推理和訓(xùn)練VGG16模型的結(jié)果作為輸出,將兩者轉(zhuǎn)換為FT-M7004上的數(shù)據(jù)布局用于對(duì)照。結(jié)果如表1所示,可以看到,對(duì)于不同的批圖像大小,本文的推理和訓(xùn)練算法均能輸出正確的結(jié)果。 Table 1 Results correctness analysis 5.3.1 卷積層推理性能分析 衡量卷積層算法性能的一個(gè)重要指標(biāo)是計(jì)算效率。計(jì)算效率可通過(guò)實(shí)際性能與理論峰值性能的比值來(lái)得到。測(cè)試結(jié)果如圖4所示,分別列出了VGG16模型中13種不同的卷積層在推理時(shí)的計(jì)算效率。隨著卷積核個(gè)數(shù)的增多,計(jì)算效率得到了穩(wěn)步提升。在最后一個(gè)卷積層,計(jì)算效率甚至可以超過(guò)100%,這是因?yàn)楸疚奶岢龅乃惴ú恍枰~外填充零,理論峰值性能考慮到了填充零帶來(lái)的影響,所以偏低。 Figure 4 Convolution computation efficiency of VGG16(Inference) 5.3.2 卷積層訓(xùn)練性能分析 卷積層訓(xùn)練性能測(cè)試結(jié)果如圖5所示,分別列出了VGG16模型中12種不同的卷積層在訓(xùn)練時(shí)的計(jì)算效率。可以看到,隨著卷積核個(gè)數(shù)的增多,計(jì)算效率依次增加。 Figure 5 Convolution computation efficiency of VGG16(Training) 5.3.3 池化層推理性能分析 池化層推理性能測(cè)試結(jié)果如圖6所示,分別列出了VGG16模型中5種不同的池化層推理時(shí)的計(jì)算效率和數(shù)據(jù)訪問(wèn)效率,其中折線表示計(jì)算效率。從圖6可以看出,池化層的計(jì)算效率很低,平均約為4.00%。這是由于池化層的計(jì)算量較小,大部分時(shí)間開(kāi)銷集中在數(shù)據(jù)搬移上。然而,池化層的數(shù)據(jù)訪問(wèn)效率非常高,平均約為80.00%。這是因?yàn)槌鼗瘜铀袛?shù)據(jù)訪問(wèn)都是根據(jù)本文提出的算法以訪問(wèn)矩陣行的形式實(shí)現(xiàn)的。 Figure 6 Performance of pooling layer(Inference) 5.3.4 池化層訓(xùn)練性能分析 池化層訓(xùn)練性能測(cè)試結(jié)果如圖7所示,分別列出了VGG16模型中5種不同的池化層訓(xùn)練時(shí)的的計(jì)算效率和數(shù)據(jù)訪問(wèn)效率,其中折線表示計(jì)算效率。從圖7可以看出,池化層在訓(xùn)練時(shí)的計(jì)算效率很低,平均約為2.39%,數(shù)據(jù)訪問(wèn)效率平均約為47.59%。造成池化層訓(xùn)練性能不如推理性能的主要原因在于,根據(jù)本文提出的訓(xùn)練算法,通過(guò)數(shù)組記錄最大值位置的方式不能實(shí)現(xiàn)對(duì)矩陣的逐行訪問(wèn),更多時(shí)間花費(fèi)在了不規(guī)則的數(shù)據(jù)訪問(wèn)上;而池化層的計(jì)算量占比極小,對(duì)性能影響不大。 Figure 7 Performance of pooling layer(Training) 5.3.5 全連接層性能分析 全連接層性能測(cè)試結(jié)果如圖8和圖9所示,分別列出了VGG16模型中3種不同的全連接層在推理和訓(xùn)練時(shí)的計(jì)算效率。由于全連接層的矩陣較大,最小的權(quán)重矩陣尺寸為4096*1000,最大尺寸為25088*4096,所以計(jì)算效率極高,推理時(shí)計(jì)算效率平均達(dá)到了93.17%,訓(xùn)練時(shí)計(jì)算效率平均達(dá)到了81.98%。全連接層訓(xùn)練時(shí),本質(zhì)上也采用了矩陣乘法的形式,所以能達(dá)到較高的計(jì)算效率。 Figure 8 Computation efficiency of fully connected layer(Inference) Figure 9 Computation efficiency of fully connected layer(Training) 5.3.6 與GPU平臺(tái)的性能對(duì)比 與GPU平臺(tái)的性能對(duì)比結(jié)果如表2和圖10所示。表2是FT-M7004與其他3款高性能GPU在VGG16模型上的推理延遲(單位為s)和吞吐量(單位為fps)測(cè)試結(jié)果。在推理延遲方面,每推理一幅圖像,GTX 1080的用時(shí)為0.068 8 s,Pascal TitanX的為0.006 0 s,MaxWell TitanX的為0.010 8 s,而FT-M7004的為0.090 0 s。吞吐量方面,GTX 1080每秒鐘可推理111幅圖像,Pascal TitanX每秒可推理163幅圖像,MaxWell TitanX每秒可推理92幅圖像,而FT-M7004則每秒可推理16幅圖像。產(chǎn)生這一性能差距的原因在于3款高性能GPU的峰值性能遠(yuǎn)高于FT-M7004的,GTX 1080的峰值性能為9 TFlops,Pascal TitanX的為11 TFlops,MaxWell TitanX的為6.7 TFlops,而擁有4個(gè)加速器核心的FT-M7004的峰值性能為512 GFlops。圖10分別列出了4種硬件在VGG16模型上的計(jì)算效率。在推理時(shí),FT-M7004的計(jì)算效率能達(dá)到87.76%,效果最為出色。在訓(xùn)練時(shí),FT-M7004的計(jì)算效率為59.74%,僅次于GTX 1080的65.52%。這是因?yàn)镚TX 1080的浮點(diǎn)運(yùn)算能力峰值和帶寬比FT-M7004平臺(tái)的高,訓(xùn)練時(shí)需要的計(jì)算量和訪存量更大。 Table 2 Analysis of inference delay and throughput表2 推理延遲與吞吐量分析 Figure 10 Performance comparison of different platforms 面向FT-M7004平臺(tái),本文完成了對(duì)卷積算子、池化算子和全連接算子的優(yōu)化。本文結(jié)合 FT-M7004平臺(tái)的特性,使用向量并行化、DMA雙緩沖傳輸和向量并行優(yōu)化等優(yōu)化方法,提高了程序 的性能。實(shí)驗(yàn)結(jié)果表明,在 FT-M7004平臺(tái)上,本文提出的算法能夠較好地考慮到體系結(jié)構(gòu)的特點(diǎn),實(shí)現(xiàn)極高的計(jì)算效率。同時(shí),本文還與NVIDIA GPU平臺(tái)進(jìn)行了實(shí)驗(yàn)對(duì)比,推理時(shí)計(jì)算效率領(lǐng)先20%以上,訓(xùn)練時(shí)計(jì)算效率雖然不是最佳,但性能差距不大。后續(xù)將針對(duì)其他深度學(xué)習(xí)算子完善其在FT-M7004平臺(tái)上的實(shí)現(xiàn)與優(yōu)化。3.4 卷積層訓(xùn)練算法
3.5 池化層推理算法
3.6 池化層訓(xùn)練算法
3.7 全連接層推理算法
3.8 全連接層訓(xùn)練算法
4 面向FT-M7004平臺(tái)的優(yōu)化
4.1 數(shù)據(jù)布局預(yù)處理
4.2 DMA雙緩沖區(qū)傳輸
4.3 權(quán)值共享
4.4 向量并行優(yōu)化
5 實(shí)驗(yàn)與結(jié)果分析
5.1 實(shí)驗(yàn)環(huán)境
5.2 正確性分析
5.3 性能分析
6 結(jié)束語(yǔ)