梁修壯,倪 偉
(合肥工業大學微電子設計研究所,安徽 合肥 230601)
深度學習理論的應用越來越廣泛,多種深度學習網絡模型應運而生。其中,卷積神經網絡使用最為廣泛,實質上是一種人工神經網絡模型,簡稱為CNN,與其它人工神經網絡模型相比較,CNN模型具備層間連接的稀疏性與權重共享結構,更加接近生物神經網絡結構,能夠直接處理圖像數據,加大的簡化了數據處理過程。同時,CNN模型具有識別精度高、適應性強、復雜度低的優點,廣泛應用于人臉識別[1]、醫療檢測[2]、圖像鑒別[3]等領域中,其中Hinton與Krizhevsky設計的用于圖形分類的AlexNet[4]模型,以37.5%的識別錯誤率獲得了ILSVRC比賽的冠軍,相較于傳統模型來看,AlexNet模型具備更加優異的成績,許多學生投身到AlexNet模型研究中。
隨著卷積神經網絡的應用,其潛在的問題也逐漸顯現,面對大規模卷積計算時,會受到GPGPU和GPCPU等通用處理器上計算能力的限制,為此FPGA等硬件加速深度卷積神經網絡優化計算方法的研究很有必要[5]。FPGA具備靈活性高、計算速度快、針對性強、成本低、邏輯資源豐富的優勢,屬于一種半定制電路,芯片內部的DSP單元可以極大的提升FPGA加速器的大規模卷積計算能力,并且FPGA的存儲器還可以為卷積計算中間結果提供臨時緩沖區,由此可見,采用FPGA加速器優化深度卷積神經網絡計算能力是可行的。希望通過FPGA加速器的應用,提升深度卷積神經網絡的計算能力,滿足快速進行大規模卷積計算的需求,為其應用發展助力[3]。
AlexNet模型由五層卷積層與三層全連接層構成,共8層,具備池化、激活函數、填充、局部相應歸一化等處理功能。AlexNet模型能夠對規格為227×227×3的三通道RGB格式圖像進行處理,得到1000個用于分類的值,利用特定函數獲取這些圖像的概率分布。

圖1 AlexNet模型
AlexNet模型(見圖1)第一層輸入為規格為227×227×3的RGB格式圖像,以步長4為單位通過11×11卷積核進行卷積計算,輸出96個規格為55×55的特征圖;第二層將第一層輸出特征圖分為兩組,對池化后特征圖增加兩個單位的0元素,規則變為31×31,以步長1為單位通過5×5卷積核進行卷積計算,輸出128個規格為27×27的特征圖。經過池化、激活共獲得256個規格為13×13的特征圖。依據上述流程,繼續進行第三層、第四層以及第五層卷積計算,最終得到256個規格為6×6的特征圖,將其與第一層全連接層參數計算可得4096個輸出值,通過第二層、第三層全連接層參數計算得到1000個用于圖像分類的數值,詳細的Alexnet絡模型參數如表1所示。

表1 Alexnet網絡模型參數表
Alexnet模型中共有三種不同規格的卷積核,占據了整個網絡90%的計算量,其計算結果需要經過特定函數激活,并不同卷積層需要經過池化或者填充處理。當深度卷積神經網絡模型訓練結束后,全連接層占比為96%以上。
上述過程完成了深度卷積神經網絡模型Alexnet的分析,為下述硬件加速架構設計提供基礎支撐。
AlexNet模型每個卷積計算模塊包含多個卷積處理單元、線性緩存單元、池化單元與激活單元。為了優化深度卷積神經網絡計算能力,引入FPGA設計加速器,對各個卷積計算單元加速,具體深度卷積神經網絡優化計算過程如下所示。
FPGA加速器是由GPU與FPGA共同構成的異構計算框架[6]。其中,GPU能夠將相關指令和數據發送給FPGA加速器,FPGA芯片能夠根據收到的指令實現對應的任務。FPGA芯片由外接存儲器、緩存單元以及計算單元組成。其中,計算單元有多個,各個單元都能實現對該層數據的激活、卷積以及池化等各種任務。緩存單元的功能是保存計算中間結果,使模型計算過程不間斷;外接存儲器的功能是保存訓練好的AlexNet模型參數。
應用FPGA加速器后,可以使深度卷積神經網絡模型計算能力充分發揮,極大的提升深度卷積神經網絡模型的效率。

圖2 模型計算流程
依據圖1所示深度卷積神經網絡Alexnet模型計算流程,分別對每個卷積計算模塊中的卷積處理單元、線性緩存單元、池化單元與激活單元進行優化處理。
卷積處理單元是AlexNet模型的核心計算環節,負責單個卷積核對特征圖的計算,該單元處理效率絕大程度上決定著加速器對AlexNet模型的計算能力。
對于卷積神經網絡模型來說,卷積需要處理的數據眾多,常用的二維卷積計算結構如文獻[7]所示,使用移位寄存器增加數據在計算單元的停留以減少內存的訪問,一部分寄存器用于計算時加載數據,一部分用于對齊數據,當初始數據加載完成每一個時鐘周期可以得到一個結果,當卷積核和特征圖尺寸較大時,這種單一的計算結構極其容易浪費資源,為此將大矩陣拆分成若干個小矩陣的乘加運算結構,利用“?”表示卷積計算。
規格為P×Q的特征圖與N×M的卷積核矩陣進行卷積計算,通過拆分將其轉化為R×C的特征圖與T×S的卷積核矩陣的卷積計算。原有的計算單元拆分為若干個K×L小矩陣計算,其中,K與L分別表示的是行與列的拆分單位。需要注意的是P與N能夠被K整除,Q與M能夠被L整除,若不能滿足上述條件,需要對填充卷積核矩陣和特征圖,以一列或一行作為整體,利用0元素實現素擴展填充,使特征圖與卷積核矩陣規格滿足拆分的資格[8]。
為了降低AlexNet模型的數據處理量級, 用若干個小卷積乘加計算方法代替大卷積計算,可以極大的降低,并且K×L小卷積計算可以利用并行方式進行處理,極大的減少了卷積運算的規模,節省了硬件資源—FPGA加速器的應用,使得深度卷積神經網絡模型計算數據傳遞更加便利。
為了詳細介紹卷積處理單元加速策略,以AlexNet模型第一層卷積計算為例實施卷積拆分策略,具體實施過程如下所示。
將AlexNet模型第一層計算單元的11×11卷積核矩陣采用0元素擴充為12×12的卷積核矩陣,再次將其拆分為9個4×4的小卷積計算。將小卷積當成整體,改變卷積框的位置,并計算其權重,把得到的權重值相加并將結果輸出[9]。
未拆分之前,AlexNet模型第一層卷積計算輸出值為
Y=X?W
(1)
式(1)中,Y表示的是未拆分AlexNet模型第一層卷積計算輸出值;X表示的是輸入特征圖相應卷積框的矩陣;W表示的是權重矩陣。
執行卷積拆分策略,得到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分別表示的是拆分后的輸入特征圖與權重矩陣。
拆分后的小卷積矩陣相互獨立,利用并行方式處理。需要注意的是,由于填充元素為0,Y與Y′的數值相同。
由上述過程可知,通過卷積拆分策略可以極大的加速卷積處理單元。
對于深度卷積神經網絡計算來說,每個輸出值均需要遍歷全部的輸入特征圖,為此卷積層計算不能并行。為了使不同卷積層以流水線方式進行計算,整體提升AlexNet模型的吞吐率,設計乒乓緩存結構加速線性緩存單元。乒乓緩存結構示意圖如圖3所示。

圖3 乒乓緩存結構示意圖
如圖3所示,該單元對應的是卷積層數據,功能是對特征圖與權重進行保存。將一個卷積計算過程記為一個周期。該單元流程如下:周期一,復用器MUX自動加載數據緩沖模塊A數據,將其傳送至計算單元A,將輸出的中間結果存儲于緩沖模塊C;周期二,加載數據緩沖模塊B數據,并將其傳遞給計算單元A中,與此同時,將計算產生的中間特征圖存儲于數據緩沖模塊D。另外,將第一個周期結果加載到計算單元B中處理;周期三,重復周期一整個流程。綜上所述,對周期一到三進行重復切換,利用復用器調用數據緩沖模塊的數據,使計算單元時刻處于計算狀態,計算資源利用率達到最佳。
AlexNet模型采用的是ReLU激活函數實現激活單元的任務,ReLU激活函數具有電路簡單的優勢,通過一個比較電路激活輸出值,使輸出值中不包含0元素,主要通過與0元素比較輸出最大值來實現。
ReLU激活函數硬件電路如圖4所示。

圖4 ReLU激活函數硬件電路圖
對于激活單元來說,其輸入值為卷積層計算結果,輸出值連接池化單元,為池化單元的輸入提供數據支撐。若沒有池化層,將激活單元輸出數據直接傳遞給全連接層。
池化單元的任務對象是經過激活處理的卷積層結果,通過池化操作輸出最大值或者平均值,并將其傳遞給下一層繼續完成池化操作。卷積計算是比較復雜的,而池化操作相對簡單。因此,大多數網絡都是通過池化進行加速的。最大池化單元計算流程如圖5所示。

圖5 最大池化單元計算流程圖
如圖5所示,最大池化單元規格為3×3,包含2個比較器與2L+4個寄存器,L表示的是卷積層輸出特征圖的行長度。
在匹配池化操作窗口移動過程中,利用2L+1個寄存器匹配數據,并且緩存匹配數據。對于步長為2的池化單元,若輸入數據到達2L+1個寄存器中最后一個寄存器時,每加載一個數據,比較器通過對比將最大值傳遞給下一個寄存器,直至與窗口移動步長一致為止,輸出結果即為最大池化結果。
上述池化單元加速策略可以在保障效率需求的情況下,節省硬件資源的使用,對于平均池化結構也同樣適用。
通過上述設計實現了FPGA加速器深度卷積神經網絡計算的優化,為AlexNet模型應用發展助力。
為了保障實驗的順利進行,AlexNet模型參數的準確性,在Nvidia GeForce GTX 1080 Ti顯卡上,基于經典訓練數據集ImageNet 2012圖像集,利用梯度下降方法對提出的AlexNet模型進行訓練,部分訓練結果如表2所示。

表2 部分訓練結果表
如表2數據顯示,迭代次數為400000次時,訓練損失達到最小;迭代次數為380000次時,訓練準確率最高。通過對比研究后,選取迭代次數為380000時的模型參數進行實驗,其參數規模為235MB。
深度卷積神經網絡計算能力由單層加速效果、FPGA資源消耗以及MAC效率決定,具體深度卷積神經網絡計算能力實驗過程如下所示。
在時鐘頻率為100MHz下,采用XC7V2000T設備統計FPGA加速器深度卷積神經網絡優化計算方法5個卷積層計算延遲,并與Intel Xeon @2.20GHz CPU對比,得到加速比結果如圖6所示。

圖6 加速效果
對于AlexNet模型來說,不同的卷積層擁有不同的計算資源和計算量,那么,同樣的加速效果具有一定的差異,在遠低于和CPU運行頻率下相比,加速4.41~10.87倍,平均單層加速8.04倍。
FPGA加速器由查找表、觸發器、DSP與存儲器構成。資源消耗見表3所列。由于AlexNet網絡模型權重和中間結果的數據量比較大,全部采用32-bit浮點數會需要大量的硬件資源,根據文獻[10]研究結果可知,高準確率識別不需要太高精度的神經網絡參數,降低神經網絡參數的數據精度對識別的準確率影響不大。所以權重和中間結果采用的是16位定點數表示。共使用了1336塊18 kb的BRAM,主要用于中間數據緩存,930塊的DSP用于卷積中大量的乘法計算,還使用了大量寄存器緩存來自片外的權重數據和從BRAM讀取的數據。

表3 資源消耗
MAC效率由每個卷積層加載MAC數據處理量的延遲時間判定,延遲時間越短,表明MAC效率越高。通過實驗得到MAC效率數據如表4所示。

表4 MAC效率數據表
如表4所示,MAC效率范圍為73.12%~81.02%,對于不同的卷積層來說,MAC的效率是不同的,表4中的理想時延表示的是不將卷積計算考慮進去時,數據加載及對齊過程所需要的時延,通過單個層的MAC計算量除以配置DSP 數量獲得,但是實際延遲一定會大于理想延遲。
與其文獻[11]、[12]實現的AlexNet 5個卷積層相比,結果見表5所列。DSP的消耗數量與計算性能密切相關,通常消耗DSP數量越多實現計算性能越高,但不同的計算結構表現的計算性能會有差異,文獻[11]采用的是64-bit 浮點精度,消耗了2600個DSP,浮點數據計算資源消耗過高,與文獻[12]的實現相比,表明優化設計的流水并行計算方式具有明顯優勢。

表5 與其它AlexNet網絡實現的對比
為了解決傳統方法計算能力能力不佳、加速器加速效果不明顯等問題。本文設計一種FPGA加速器深度卷積神經網絡優化計算方法。引入FPGA設計加速器,利用拆分計算將卷積過程分解為更細粒度的并行計算,利用FPGA加速器實現優化計算。通過實驗得出以下結論:
1)本文方法能夠有效提升加速效果,當卷積層為5層時,100 MHz下數據加速比能達到8.04平均值。
2)本文方法的,MAC效率較高。5個卷積層整體MAC效率達到76.08%。
3)本文方法能夠在低資源消耗率的情況下實現較高的吞吐量,在使用1020個DSP的情況下實現130.43 GOPS吞吐量,優于同類設計。