王 飛, 張多利, 汪 楊, 王澤中, 宋宇鯤
(合肥工業(yè)大學(xué) 電子科學(xué)與應(yīng)用物理學(xué)院,安徽 合肥 230601)
近年來,隨著深度學(xué)習(xí)廣泛應(yīng)用,嵌入式系統(tǒng)中專用的低功耗深度學(xué)習(xí)處理器受到關(guān)注。深度學(xué)習(xí)包含訓(xùn)練和推理2個運算階段。由于訓(xùn)練運算過程非常復(fù)雜,使得硬件設(shè)計難度激增,功耗和價格隨之上漲,大多數(shù)深度學(xué)習(xí)硬件將注意力集中在推理階段[1]。
當(dāng)深度學(xué)習(xí)芯片不具備片上訓(xùn)練能力時,需要將數(shù)據(jù)上傳至服務(wù)器端訓(xùn)練后更新本地模型,這樣會帶來2個問題:① 深度學(xué)習(xí)模型的參數(shù)量一般非常大,更新需要高帶寬、穩(wěn)定的網(wǎng)絡(luò)連接;② 隱私數(shù)據(jù)包括指紋、視網(wǎng)膜等,在網(wǎng)絡(luò)中傳輸會帶來安全問題。因此,有片上學(xué)習(xí)功能的深度學(xué)習(xí)硬件近年來成為研究熱點,目前已有一些研究成果。
文獻(xiàn)[2]提出的Socrates-D架構(gòu)是一種可以實現(xiàn)片上學(xué)習(xí)的多核并行深度學(xué)習(xí)硬件,計算單元內(nèi)使用2T1C的eDRAM,可以在不改變地址規(guī)則的情況下進行全連接層的訓(xùn)練;文獻(xiàn)[3]提出的Eyeriss架構(gòu)通過將二維卷積運算按行分解為一維卷積與部分和累加運算,并固定部分?jǐn)?shù)據(jù)在片上存儲器中,可以有效降低芯片功耗,同時實現(xiàn)高效的片上推理與訓(xùn)練過程。
作為深度學(xué)習(xí)的代表性應(yīng)用,卷積神經(jīng)網(wǎng)絡(luò)(convolutianal neural network,CNN)在數(shù)據(jù)分類和目標(biāo)識別領(lǐng)域表現(xiàn)優(yōu)異。為了實現(xiàn)CNN的推理與訓(xùn)練,本文提出一種帶有內(nèi)部離散式存儲結(jié)構(gòu)的計算單元,在不改變地址規(guī)則的情況下進行矩陣轉(zhuǎn)置乘運算,采用運算過程分割的運算陣列,以達(dá)成兼顧推理和訓(xùn)練功能的硬件結(jié)構(gòu)。
典型的CNN由多個計算層組成,依次包括若干個卷積層、池化層以及全連接層。卷積層的推理過程為:
(1)
其中:l為網(wǎng)絡(luò)層數(shù)(l=1,2,…,L);K為卷積核;X為特征圖;B為每層對應(yīng)的偏置;σ為激活函數(shù)。卷積層后是池化層,將特征圖分割為若干個區(qū)域后取均值或最大值輸出。
全連接層的推理過程可以用矩陣運算表示,即
Xl=σ(WlXl-1+Bl)
(2)
其中:X為輸入和輸出向量;W為權(quán)值矩陣。
CNN的訓(xùn)練過程通常基于梯度下降法,通過誤差反向傳播(backpropagation,BP)算法更新參數(shù)[4]。在訓(xùn)練過程中,輸出層n維向量XL都有對應(yīng)的理想輸出向量T,誤差E可定義為:
(3)
而BP算法的目的是通過更新各層的參數(shù),使得E對整個數(shù)據(jù)集取最優(yōu)解[5],涉及的推理和訓(xùn)練運算見表1所列。
表1 CNN推理與訓(xùn)練涉及的運算
本系統(tǒng)中的卷積運算分為2類:① 推理和誤差反傳中的小卷積核運算;② 權(quán)值更新時大尺寸卷積核運算。針對這2種類型,有2種運算方式。
1.2.1 卷積分解運算
為提高小尺寸卷積核的卷積計算效率,本系統(tǒng)采用卷積分解和離散式緩存結(jié)構(gòu),提高數(shù)據(jù)復(fù)用率和運算效率。二維卷積運算分解后如圖1所示,分解后的卷積運算可以使用1組一維算術(shù)邏輯單元(arithmetic and logic unit,ALU)陣列實現(xiàn)。
圖1 二維卷積分解為一維卷積
在CNN中,卷積運算通常是多輸入多輸出通道的。對于多輸入通道,可以按順序排列輸入特征圖和對應(yīng)的卷積核,通過輸出的緩存數(shù)據(jù)累加實現(xiàn),不增加新的硬件資源。對于多輸出通道的卷積運算,可以通過并行上述的一維ALU陣列構(gòu)成二維運算陣列實現(xiàn)。
1.2.2 矩陣乘形式卷積
針對大尺寸卷積核,可以將卷積展開為矩陣乘法進行運算,按此方法展開的輸入特征圖為分塊的類似Toeplitz矩陣形式,如圖2所示[6]。輸入特征圖的分塊在橫向上與卷積核尺寸相同,在縱向上與輸出特征圖的尺寸相同。
圖2 卷積運算展開為矩陣乘法
Toeplitz矩陣的特點在于主對角線元素相等,平行于主對角線的線上元素也相等,矩陣中各元素關(guān)于副對角線對稱。
為了適應(yīng)CNN運算中涉及矩陣卷積、向量運算等多類型運算,本文提出了基于指令配置計算資源的CNN加速器設(shè)計方法,將CNN運算過程分解為128位低層次的運算指令[7],如圖3所示。
圖3 CNN加速器指令格式
根據(jù)運算類型不同,輸入和輸出數(shù)據(jù)有各種不同的組織形式,需要進行數(shù)據(jù)分配與結(jié)果緩存。本系統(tǒng)框圖如圖4所示。
圖4 CNN加速器系統(tǒng)框圖
本系統(tǒng)的計算陣列包括1組二維排列的處理單元(processing element,PE),每個PE包含1個乘法器、1個加法器及若干寄存器組。計算陣列根據(jù)PE可劃分為二維陣列,而根據(jù)處理過程可劃分為乘法和加法2層,如圖5所示。
通常PE中乘法器和加法器直接相連,形成一個乘累加器,這樣的乘累加器可以處理矩陣乘、卷積等運算。2×2計算陣列處理矩陣乘向量的配置形式(模式A)如圖5a所示。
訓(xùn)練過程中涉及的矩陣轉(zhuǎn)置后乘向量的運算,需要將單個PE中的乘法器和加法器分離,每個PE單獨處理乘法,然后相鄰PE的乘法結(jié)果傳遞至一個加法器相加,形成加法樹結(jié)構(gòu)(模式B),如圖5b所示。
圖5 計算陣列的2種配置模式
計算單元設(shè)計結(jié)構(gòu)如圖6所示。圖6中,reg表示寄存器(register)。
圖6 計算單元設(shè)計結(jié)構(gòu)
寄存器組包含矩陣組、向量組、中間結(jié)果緩存3類。矩陣組按行緩存數(shù)據(jù)重用率低的數(shù)據(jù),包括全連接層的系數(shù)矩陣和卷積層的特征圖。向量組緩存需要重復(fù)使用的數(shù)據(jù),包括緩存全連接層的激勵向量和展開為向量形式的卷積核。中間結(jié)果緩存只在卷積計算時使用,此時x信號置0。用于中斷卷積中的部分和累加。
為實現(xiàn)計算陣列的2種配置模式,加法器的輸入需要通過多路選擇器(multiplexer,MUX)進行選擇。本文中每個加法器的每個輸入口最多有2種選擇,這樣的設(shè)計避免了MUX的輸入選擇過多導(dǎo)致系統(tǒng)性能下降。
在計算過程中,數(shù)據(jù)分配器負(fù)責(zé)將要進行計算的數(shù)據(jù)分配至對應(yīng)的PE中,包括向量分配、全連接層分配、卷積層分配及權(quán)值更新分配。
全連接層計算過程中,分配器首先讀入激勵向量,然后在計算過程中補充各PE的矩陣組數(shù)據(jù)。本系統(tǒng)在讀取時先將矩陣分塊,然后按行讀取數(shù)據(jù)。分塊的原則如下:① 根據(jù)運算節(jié)拍在行方向分塊,確保每個PE中都有數(shù)據(jù)進行運算,避免資源空閑;② 根據(jù)PE數(shù)量在列方向分塊。
在卷積層進行計算時,按一定順序讀入卷積核和輸入特征圖,進行相應(yīng)的地址跳變。這2種矩陣的尺寸參數(shù)均在指令中有體現(xiàn),根據(jù)這些參數(shù)就可以進行地址運算。以輸入特征圖為例,讀入順序為:各圖第1行→各圖第2行→…→各圖最后一行。
2.4.1 全連接層
全連接層的權(quán)值更新公式為:
W3←W3+ηs3·(X3)T
(4)
此運算需要2條指令,分解后如下:
s3←ηs3
(5)
W3←W3+s3·(X3)T
(6)
(5)式運算時,圖3指令中[31:0]段變?yōu)閷W(xué)習(xí)率,直接復(fù)制寫入矩陣組即可,運算完成后寫回至s3原地址。(6)式運算時,將s3寫入矩陣組,X3寫入向量組,W3通過圖6中x通道寫入,完成運算后直接寫回。
2.4.2 卷積層
卷積層的權(quán)值更新公式為:
ΔK1=s1*X1
(7)
K1←K1+ηΔK1
(8)
按1.2.2節(jié)所述的矩陣乘形式卷積可以用于計算(7)式。通常的矩陣與向量乘法只能用若干一維PE進行,而由于Toeplitz矩陣的性質(zhì),副對角線元素和與其平行的線上元素可以直接復(fù)制,因此可以從第2行開始在矩陣前添加適當(dāng)?shù)目招盘?寫入的1個數(shù)據(jù)可以在多個PE中使用。以輸入特征圖X尺寸為50×5、卷積核K尺寸為48×48為例,需要調(diào)用3×3的PE,輸入特征圖的數(shù)據(jù)流如圖7所示。
圖7 Toeplitz矩陣形式的輸入特征圖
對于輸入特征圖X,首先按行分解為X1,X2,…,X50,同時寫入所有PE。對于PE第2行,X1無需進行計算,第3行PE的X1和X2同理,此時該行處于不激活狀態(tài)。對于分解后的每行數(shù)據(jù)Xm,每個元素同樣有不激活狀態(tài),如圖7中灰色部分。
其中卷積核數(shù)據(jù)使用圖6的y和z路徑在PE間流動。其中PE 2.1和3.1中,向量組寄存器的寫地址比讀地址小50,形成K的多周期延遲效果。其余PE中寫地址與讀地址相同,形成單周期延遲效果。
本系統(tǒng)中使用的激活函數(shù)包括ReLU和Sigmoid 2種,要同時求其導(dǎo)數(shù)。ReLU函數(shù)的實現(xiàn)不再贅述,Sigmoid函數(shù)及其導(dǎo)數(shù)如下:
s(x)=1/(1+e-x)
(9)
s′(x)=s(x)[1-s(x)]
(10)
本文采用分段非線性擬合法實現(xiàn)Sigmoid函數(shù)[8],公式為:
p(x)=ax5+bx4+cx3+dx2+ex+f=
[(ax+b)x2+cx+d]x2+ex+f
(11)
同時,根據(jù)函數(shù)的對稱性,有
s(x)=1-s(-x)
(12)
因此,只需要擬合[0,+∞)區(qū)間即可。由于還需要計算導(dǎo)數(shù),(12)式運算不可避免。激活函數(shù)計算模塊如圖8所示,最大絕對誤差為9.885 7×10-7,可以滿足高精度擬合要求。
圖8 激活函數(shù)模塊
為了方便與PC端對比計算準(zhǔn)確性與加速比,本文在系統(tǒng)實現(xiàn)時采用32位單精度浮點數(shù),在Xilinx XC6VLX760-FF1760現(xiàn)場可編程門陣列(field-programmable gate array,FPGA)上實現(xiàn),資源消耗見表2所列,當(dāng)浮點運算IP核的流水延遲設(shè)置為4時,最高工作頻率為187.083 MHz。
表2 資源消耗統(tǒng)計結(jié)果
本系統(tǒng)采用PC+FPGA的架構(gòu)對加速器進行測試,包括計算準(zhǔn)確率和運行時間,并與CPU、GPU進行對比。其中CPU型號為IntelCorei5-9400F,主頻2.9 GHz;GPU型號為NVIDAGTX1080Ti,顯存容量11 GiB;FPGA運行頻率設(shè)為100 MHz。測試方案如圖9所示,使用以太網(wǎng)口在PC和FPGA間進行數(shù)據(jù)交互。
圖9 測試方案與模型
驗證采用的模型如圖10所示,推理過程包含58 084次乘累加運算,訓(xùn)練過程包含123 616次乘累加運算,需要訓(xùn)練21 450個參數(shù)。圖10中,Conv-1、Conv-2為卷積層,Pooling為池化層。
圖10 驗證CNN模型
單次推理和訓(xùn)練過程誤差見表3所列,單次累計誤差為8.043 7×10-6。
注:FC-1、FC-2為全連接層(fully connected layer)。
由表3可知:在推理過程中,卷積層會增大誤差,而全連接層會減小誤差,這是由于卷積層中的權(quán)值共享導(dǎo)致絕對誤差的積累,而全連接層的權(quán)值誤差可中和;權(quán)值更新過程中,卷積層的更新會導(dǎo)致明顯的誤差,這也是由于大尺寸卷積核的權(quán)值共享導(dǎo)致的。
在大量數(shù)據(jù)訓(xùn)練時,每次訓(xùn)練的誤差積累會導(dǎo)致PC與FPGA的CNN模型完全不同。大量訓(xùn)練次數(shù)下的識別率見表4所列。
由表4可知,在FPGA上的識別率比在PC上低0.63%。
本文使用的CNN在CPU、GPU及FPGA平臺上的運行時間見表5所列。由表5可知,本系統(tǒng)在FPGA上運行相比于CPU達(dá)到了7.67倍加速效果。但由于本系統(tǒng)使用數(shù)字信號處理器(digital signal processor,DSP)對單精度浮點數(shù)進行乘累加運算時,乘法結(jié)果需要等待上一幀加法結(jié)果才能進行下一步運算,無法發(fā)揮流水線的優(yōu)勢,因此運行速度略遜于GPU實現(xiàn)。
表5 3種平臺計算時間對比 單位:ms
本文考慮了便攜式應(yīng)用場合對片上學(xué)習(xí)CNN硬件加速器的需要,研究了基于BP算法訓(xùn)練CNN模型的原理與運算特點,設(shè)計一種可實現(xiàn)片上學(xué)習(xí)的CNN加速器,通過可配置數(shù)據(jù)流的二維運算陣列與數(shù)據(jù)分配器,提高了CNN各層運算的并行度;在Xilinx Virtex6 FPGA芯片上,實現(xiàn)了IEEE-754標(biāo)準(zhǔn)[9]下32位單精度浮點數(shù)CNN模型的訓(xùn)練過程,在保證識別率的前提下運行速度明顯優(yōu)于PC端。