梁修壯,倪 偉
(合肥工業(yè)大學(xué)微電子設(shè)計研究所,安徽 合肥 230601)
深度學(xué)習(xí)理論的應(yīng)用越來越廣泛,多種深度學(xué)習(xí)網(wǎng)絡(luò)模型應(yīng)運而生。其中,卷積神經(jīng)網(wǎng)絡(luò)使用最為廣泛,實質(zhì)上是一種人工神經(jīng)網(wǎng)絡(luò)模型,簡稱為CNN,與其它人工神經(jīng)網(wǎng)絡(luò)模型相比較,CNN模型具備層間連接的稀疏性與權(quán)重共享結(jié)構(gòu),更加接近生物神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),能夠直接處理圖像數(shù)據(jù),加大的簡化了數(shù)據(jù)處理過程。同時,CNN模型具有識別精度高、適應(yīng)性強、復(fù)雜度低的優(yōu)點,廣泛應(yīng)用于人臉識別[1]、醫(yī)療檢測[2]、圖像鑒別[3]等領(lǐng)域中,其中Hinton與Krizhevsky設(shè)計的用于圖形分類的AlexNet[4]模型,以37.5%的識別錯誤率獲得了ILSVRC比賽的冠軍,相較于傳統(tǒng)模型來看,AlexNet模型具備更加優(yōu)異的成績,許多學(xué)生投身到AlexNet模型研究中。
隨著卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用,其潛在的問題也逐漸顯現(xiàn),面對大規(guī)模卷積計算時,會受到GPGPU和GPCPU等通用處理器上計算能力的限制,為此FPGA等硬件加速深度卷積神經(jīng)網(wǎng)絡(luò)優(yōu)化計算方法的研究很有必要[5]。FPGA具備靈活性高、計算速度快、針對性強、成本低、邏輯資源豐富的優(yōu)勢,屬于一種半定制電路,芯片內(nèi)部的DSP單元可以極大的提升FPGA加速器的大規(guī)模卷積計算能力,并且FPGA的存儲器還可以為卷積計算中間結(jié)果提供臨時緩沖區(qū),由此可見,采用FPGA加速器優(yōu)化深度卷積神經(jīng)網(wǎng)絡(luò)計算能力是可行的。希望通過FPGA加速器的應(yīng)用,提升深度卷積神經(jīng)網(wǎng)絡(luò)的計算能力,滿足快速進行大規(guī)模卷積計算的需求,為其應(yīng)用發(fā)展助力[3]。
AlexNet模型由五層卷積層與三層全連接層構(gòu)成,共8層,具備池化、激活函數(shù)、填充、局部相應(yīng)歸一化等處理功能。AlexNet模型能夠?qū)σ?guī)格為227×227×3的三通道RGB格式圖像進行處理,得到1000個用于分類的值,利用特定函數(shù)獲取這些圖像的概率分布。
圖1 AlexNet模型
AlexNet模型(見圖1)第一層輸入為規(guī)格為227×227×3的RGB格式圖像,以步長4為單位通過11×11卷積核進行卷積計算,輸出96個規(guī)格為55×55的特征圖;第二層將第一層輸出特征圖分為兩組,對池化后特征圖增加兩個單位的0元素,規(guī)則變?yōu)?1×31,以步長1為單位通過5×5卷積核進行卷積計算,輸出128個規(guī)格為27×27的特征圖。經(jīng)過池化、激活共獲得256個規(guī)格為13×13的特征圖。依據(jù)上述流程,繼續(xù)進行第三層、第四層以及第五層卷積計算,最終得到256個規(guī)格為6×6的特征圖,將其與第一層全連接層參數(shù)計算可得4096個輸出值,通過第二層、第三層全連接層參數(shù)計算得到1000個用于圖像分類的數(shù)值,詳細的Alexnet絡(luò)模型參數(shù)如表1所示。
表1 Alexnet網(wǎng)絡(luò)模型參數(shù)表
Alexnet模型中共有三種不同規(guī)格的卷積核,占據(jù)了整個網(wǎng)絡(luò)90%的計算量,其計算結(jié)果需要經(jīng)過特定函數(shù)激活,并不同卷積層需要經(jīng)過池化或者填充處理。當深度卷積神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練結(jié)束后,全連接層占比為96%以上。
上述過程完成了深度卷積神經(jīng)網(wǎng)絡(luò)模型Alexnet的分析,為下述硬件加速架構(gòu)設(shè)計提供基礎(chǔ)支撐。
AlexNet模型每個卷積計算模塊包含多個卷積處理單元、線性緩存單元、池化單元與激活單元。為了優(yōu)化深度卷積神經(jīng)網(wǎng)絡(luò)計算能力,引入FPGA設(shè)計加速器,對各個卷積計算單元加速,具體深度卷積神經(jīng)網(wǎng)絡(luò)優(yōu)化計算過程如下所示。
FPGA加速器是由GPU與FPGA共同構(gòu)成的異構(gòu)計算框架[6]。其中,GPU能夠?qū)⑾嚓P(guān)指令和數(shù)據(jù)發(fā)送給FPGA加速器,F(xiàn)PGA芯片能夠根據(jù)收到的指令實現(xiàn)對應(yīng)的任務(wù)。FPGA芯片由外接存儲器、緩存單元以及計算單元組成。其中,計算單元有多個,各個單元都能實現(xiàn)對該層數(shù)據(jù)的激活、卷積以及池化等各種任務(wù)。緩存單元的功能是保存計算中間結(jié)果,使模型計算過程不間斷;外接存儲器的功能是保存訓(xùn)練好的AlexNet模型參數(shù)。
應(yīng)用FPGA加速器后,可以使深度卷積神經(jīng)網(wǎng)絡(luò)模型計算能力充分發(fā)揮,極大的提升深度卷積神經(jīng)網(wǎng)絡(luò)模型的效率。
圖2 模型計算流程
依據(jù)圖1所示深度卷積神經(jīng)網(wǎng)絡(luò)Alexnet模型計算流程,分別對每個卷積計算模塊中的卷積處理單元、線性緩存單元、池化單元與激活單元進行優(yōu)化處理。
卷積處理單元是AlexNet模型的核心計算環(huán)節(jié),負責單個卷積核對特征圖的計算,該單元處理效率絕大程度上決定著加速器對AlexNet模型的計算能力。
對于卷積神經(jīng)網(wǎng)絡(luò)模型來說,卷積需要處理的數(shù)據(jù)眾多,常用的二維卷積計算結(jié)構(gòu)如文獻[7]所示,使用移位寄存器增加數(shù)據(jù)在計算單元的停留以減少內(nèi)存的訪問,一部分寄存器用于計算時加載數(shù)據(jù),一部分用于對齊數(shù)據(jù),當初始數(shù)據(jù)加載完成每一個時鐘周期可以得到一個結(jié)果,當卷積核和特征圖尺寸較大時,這種單一的計算結(jié)構(gòu)極其容易浪費資源,為此將大矩陣拆分成若干個小矩陣的乘加運算結(jié)構(gòu),利用“?”表示卷積計算。
規(guī)格為P×Q的特征圖與N×M的卷積核矩陣進行卷積計算,通過拆分將其轉(zhuǎn)化為R×C的特征圖與T×S的卷積核矩陣的卷積計算。原有的計算單元拆分為若干個K×L小矩陣計算,其中,K與L分別表示的是行與列的拆分單位。需要注意的是P與N能夠被K整除,Q與M能夠被L整除,若不能滿足上述條件,需要對填充卷積核矩陣和特征圖,以一列或一行作為整體,利用0元素實現(xiàn)素擴展填充,使特征圖與卷積核矩陣規(guī)格滿足拆分的資格[8]。
為了降低AlexNet模型的數(shù)據(jù)處理量級, 用若干個小卷積乘加計算方法代替大卷積計算,可以極大的降低,并且K×L小卷積計算可以利用并行方式進行處理,極大的減少了卷積運算的規(guī)模,節(jié)省了硬件資源—FPGA加速器的應(yīng)用,使得深度卷積神經(jīng)網(wǎng)絡(luò)模型計算數(shù)據(jù)傳遞更加便利。
為了詳細介紹卷積處理單元加速策略,以AlexNet模型第一層卷積計算為例實施卷積拆分策略,具體實施過程如下所示。
將AlexNet模型第一層計算單元的11×11卷積核矩陣采用0元素擴充為12×12的卷積核矩陣,再次將其拆分為9個4×4的小卷積計算。將小卷積當成整體,改變卷積框的位置,并計算其權(quán)重,把得到的權(quán)重值相加并將結(jié)果輸出[9]。
未拆分之前,AlexNet模型第一層卷積計算輸出值為
Y=X?W
(1)
式(1)中,Y表示的是未拆分AlexNet模型第一層卷積計算輸出值;X表示的是輸入特征圖相應(yīng)卷積框的矩陣;W表示的是權(quán)重矩陣。
執(zhí)行卷積拆分策略,得到AlexNet模型第一層卷積計算輸出值為
Y′=X1?W1+X2?W2+X3?W3+X4?W4+X5?W5
+X6?W6+X7?W7+X8?W8+X9?W9
(2)
其中,Y′表示的是拆分后AlexNet模型第一層卷積計算輸出值;Xi與Wi分別表示的是拆分后的輸入特征圖與權(quán)重矩陣。
拆分后的小卷積矩陣相互獨立,利用并行方式處理。需要注意的是,由于填充元素為0,Y與Y′的數(shù)值相同。
由上述過程可知,通過卷積拆分策略可以極大的加速卷積處理單元。
對于深度卷積神經(jīng)網(wǎng)絡(luò)計算來說,每個輸出值均需要遍歷全部的輸入特征圖,為此卷積層計算不能并行。為了使不同卷積層以流水線方式進行計算,整體提升AlexNet模型的吞吐率,設(shè)計乒乓緩存結(jié)構(gòu)加速線性緩存單元。乒乓緩存結(jié)構(gòu)示意圖如圖3所示。
圖3 乒乓緩存結(jié)構(gòu)示意圖
如圖3所示,該單元對應(yīng)的是卷積層數(shù)據(jù),功能是對特征圖與權(quán)重進行保存。將一個卷積計算過程記為一個周期。該單元流程如下:周期一,復(fù)用器MUX自動加載數(shù)據(jù)緩沖模塊A數(shù)據(jù),將其傳送至計算單元A,將輸出的中間結(jié)果存儲于緩沖模塊C;周期二,加載數(shù)據(jù)緩沖模塊B數(shù)據(jù),并將其傳遞給計算單元A中,與此同時,將計算產(chǎn)生的中間特征圖存儲于數(shù)據(jù)緩沖模塊D。另外,將第一個周期結(jié)果加載到計算單元B中處理;周期三,重復(fù)周期一整個流程。綜上所述,對周期一到三進行重復(fù)切換,利用復(fù)用器調(diào)用數(shù)據(jù)緩沖模塊的數(shù)據(jù),使計算單元時刻處于計算狀態(tài),計算資源利用率達到最佳。
AlexNet模型采用的是ReLU激活函數(shù)實現(xiàn)激活單元的任務(wù),ReLU激活函數(shù)具有電路簡單的優(yōu)勢,通過一個比較電路激活輸出值,使輸出值中不包含0元素,主要通過與0元素比較輸出最大值來實現(xiàn)。
ReLU激活函數(shù)硬件電路如圖4所示。
圖4 ReLU激活函數(shù)硬件電路圖
對于激活單元來說,其輸入值為卷積層計算結(jié)果,輸出值連接池化單元,為池化單元的輸入提供數(shù)據(jù)支撐。若沒有池化層,將激活單元輸出數(shù)據(jù)直接傳遞給全連接層。
池化單元的任務(wù)對象是經(jīng)過激活處理的卷積層結(jié)果,通過池化操作輸出最大值或者平均值,并將其傳遞給下一層繼續(xù)完成池化操作。卷積計算是比較復(fù)雜的,而池化操作相對簡單。因此,大多數(shù)網(wǎng)絡(luò)都是通過池化進行加速的。最大池化單元計算流程如圖5所示。
圖5 最大池化單元計算流程圖
如圖5所示,最大池化單元規(guī)格為3×3,包含2個比較器與2L+4個寄存器,L表示的是卷積層輸出特征圖的行長度。
在匹配池化操作窗口移動過程中,利用2L+1個寄存器匹配數(shù)據(jù),并且緩存匹配數(shù)據(jù)。對于步長為2的池化單元,若輸入數(shù)據(jù)到達2L+1個寄存器中最后一個寄存器時,每加載一個數(shù)據(jù),比較器通過對比將最大值傳遞給下一個寄存器,直至與窗口移動步長一致為止,輸出結(jié)果即為最大池化結(jié)果。
上述池化單元加速策略可以在保障效率需求的情況下,節(jié)省硬件資源的使用,對于平均池化結(jié)構(gòu)也同樣適用。
通過上述設(shè)計實現(xiàn)了FPGA加速器深度卷積神經(jīng)網(wǎng)絡(luò)計算的優(yōu)化,為AlexNet模型應(yīng)用發(fā)展助力。
為了保障實驗的順利進行,AlexNet模型參數(shù)的準確性,在Nvidia GeForce GTX 1080 Ti顯卡上,基于經(jīng)典訓(xùn)練數(shù)據(jù)集ImageNet 2012圖像集,利用梯度下降方法對提出的AlexNet模型進行訓(xùn)練,部分訓(xùn)練結(jié)果如表2所示。
表2 部分訓(xùn)練結(jié)果表
如表2數(shù)據(jù)顯示,迭代次數(shù)為400000次時,訓(xùn)練損失達到最小;迭代次數(shù)為380000次時,訓(xùn)練準確率最高。通過對比研究后,選取迭代次數(shù)為380000時的模型參數(shù)進行實驗,其參數(shù)規(guī)模為235MB。
深度卷積神經(jīng)網(wǎng)絡(luò)計算能力由單層加速效果、FPGA資源消耗以及MAC效率決定,具體深度卷積神經(jīng)網(wǎng)絡(luò)計算能力實驗過程如下所示。
在時鐘頻率為100MHz下,采用XC7V2000T設(shè)備統(tǒng)計FPGA加速器深度卷積神經(jīng)網(wǎng)絡(luò)優(yōu)化計算方法5個卷積層計算延遲,并與Intel Xeon @2.20GHz CPU對比,得到加速比結(jié)果如圖6所示。
圖6 加速效果
對于AlexNet模型來說,不同的卷積層擁有不同的計算資源和計算量,那么,同樣的加速效果具有一定的差異,在遠低于和CPU運行頻率下相比,加速4.41~10.87倍,平均單層加速8.04倍。
FPGA加速器由查找表、觸發(fā)器、DSP與存儲器構(gòu)成。資源消耗見表3所列。由于AlexNet網(wǎng)絡(luò)模型權(quán)重和中間結(jié)果的數(shù)據(jù)量比較大,全部采用32-bit浮點數(shù)會需要大量的硬件資源,根據(jù)文獻[10]研究結(jié)果可知,高準確率識別不需要太高精度的神經(jīng)網(wǎng)絡(luò)參數(shù),降低神經(jīng)網(wǎng)絡(luò)參數(shù)的數(shù)據(jù)精度對識別的準確率影響不大。所以權(quán)重和中間結(jié)果采用的是16位定點數(shù)表示。共使用了1336塊18 kb的BRAM,主要用于中間數(shù)據(jù)緩存,930塊的DSP用于卷積中大量的乘法計算,還使用了大量寄存器緩存來自片外的權(quán)重數(shù)據(jù)和從BRAM讀取的數(shù)據(jù)。
表3 資源消耗
MAC效率由每個卷積層加載MAC數(shù)據(jù)處理量的延遲時間判定,延遲時間越短,表明MAC效率越高。通過實驗得到MAC效率數(shù)據(jù)如表4所示。
表4 MAC效率數(shù)據(jù)表
如表4所示,MAC效率范圍為73.12%~81.02%,對于不同的卷積層來說,MAC的效率是不同的,表4中的理想時延表示的是不將卷積計算考慮進去時,數(shù)據(jù)加載及對齊過程所需要的時延,通過單個層的MAC計算量除以配置DSP 數(shù)量獲得,但是實際延遲一定會大于理想延遲。
與其文獻[11]、[12]實現(xiàn)的AlexNet 5個卷積層相比,結(jié)果見表5所列。DSP的消耗數(shù)量與計算性能密切相關(guān),通常消耗DSP數(shù)量越多實現(xiàn)計算性能越高,但不同的計算結(jié)構(gòu)表現(xiàn)的計算性能會有差異,文獻[11]采用的是64-bit 浮點精度,消耗了2600個DSP,浮點數(shù)據(jù)計算資源消耗過高,與文獻[12]的實現(xiàn)相比,表明優(yōu)化設(shè)計的流水并行計算方式具有明顯優(yōu)勢。
表5 與其它AlexNet網(wǎng)絡(luò)實現(xiàn)的對比
為了解決傳統(tǒng)方法計算能力能力不佳、加速器加速效果不明顯等問題。本文設(shè)計一種FPGA加速器深度卷積神經(jīng)網(wǎng)絡(luò)優(yōu)化計算方法。引入FPGA設(shè)計加速器,利用拆分計算將卷積過程分解為更細粒度的并行計算,利用FPGA加速器實現(xiàn)優(yōu)化計算。通過實驗得出以下結(jié)論:
1)本文方法能夠有效提升加速效果,當卷積層為5層時,100 MHz下數(shù)據(jù)加速比能達到8.04平均值。
2)本文方法的,MAC效率較高。5個卷積層整體MAC效率達到76.08%。
3)本文方法能夠在低資源消耗率的情況下實現(xiàn)較高的吞吐量,在使用1020個DSP的情況下實現(xiàn)130.43 GOPS吞吐量,優(yōu)于同類設(shè)計。