張立國 黃文漢 金 梅
(燕山大學電氣工程學院 秦皇島 066004)
近年來,深度學習[1]被廣泛應用于安全防護[2]、醫(yī)療康養(yǎng)[3-5]、自動駕駛[6-8]等領域。卷積神經網絡(convolutional neural network,CNN)是深度學習中的一種重要架構。目前,實現卷積神經網絡加速器的平臺以中央處理器(central processing unit,CPU)、圖形處理器(graphics processing unit,GPU)、專用集成電路(application specific integrated circuit,ASIC)和現場可編程門陣列(field programmable gate array,FPGA)為主[9]。其中,CPU 受限于內存帶寬,計算CNN 的大量數據時效率較低;GPU 擁有大量計算核心和高速內存帶寬,主要用于加速圖像數據的運算,在深度學習訓練階段的優(yōu)勢明顯;ASIC[10-12]是可以實現特定算法的加速器,在計算效率、功耗和面積上表現最好;但是,ASIC 只能為既定的算法加速,昂貴的開發(fā)成本不能適應愈發(fā)復雜和深層次的網絡結構。相比之下,FPGA 具有高并行度、低功耗、靈活編程和短開發(fā)周期等特點,這些綜合優(yōu)勢使FPGA 相較于其他3 個平臺更適合深度學習的前向推理過程。
本文設計基于FPGA 的卷積神經網絡加速器,神經網絡結構為LeNet-5[13],使用Verilog 硬件描述語言,數據格式為IEEE 754 標準的16 bits 浮點類型。
近年來,已有許多對FPGA 實現卷積神經網絡的相關研究。
文獻[14]使用異構計算架構成功實現了目標檢測卷積神經網絡的硬件加速。方案選擇軟核CPU 實例化在FPGA 上,并通過CPU 控制數據調度,使FPGA 能夠實現卷積、ReLU 非線性激活、最大值池化等算法的硬件加速。通過按照特定方式排列輸入數據,實現了將多維卷積運算轉化成一維卷積運算,從而提高了數據并行度。盡管該方案只能為特定神經網絡進行加速,但其成功地為硬件加速提供了一種可行的方案。值得注意的是,一旦神經網絡結構發(fā)生改變,則需要重新搭建加速系統(tǒng),無法應對復雜多變的神經網絡。
文獻[15]提出的卷積硬件計算單元設計具有可擴展性,可以在資源有限的情況下復用卷積計算模塊,同時采用對應數據分割的形式提高并行度,從而顯著提高了第1 層卷積的計算速度。然而,該方案在卷積復用的同時會犧牲速度,因此在要求實時性的應用場景中可能缺乏優(yōu)勢。
文獻[16]設計了一個2D 卷積算法,該算法采用較少的寄存器、乘法器、加法器和控制模塊,從而節(jié)省了大量的硬件開銷。該算法使用塊浮點(block-floating-point,BFP)算法進行數據處理,數據位寬選擇16 位和8 位,相比傳統(tǒng)的32 位數據位寬,可以至少降低50%的資源開銷。但是,這種算法采用較低精度的數據運算方式,因此不可避免地導致識別精度下降。
在大多數對卷積神經網絡加速器的硬件設計中,采用量化后的16 位[17]甚至8 位[18]定點數作為參數。這樣的設計雖然可以減少數據存儲以及計算量,但是不可避免地損失了精度。于是,本文設計浮點運算單元(processing element,PE),它由浮點加法器和浮點乘法器構成。
浮點運算單元相對于定點運算單元的優(yōu)勢有:
(1)可以表示非常大或非常小的數值,以及小數和分數。
(2)可以提供高精度的計算和表示,因為指數位和尾數位的可變性。
(3)通過硬件的優(yōu)化,在消耗一定資源的同時,可以減少延時,且達到幾乎等同于神經網絡最優(yōu)的精度效果。
在浮點數加法器硬件電路設計中,為了減少資源開銷,設計預移位(pre-shifting)功能:如果2 個操作數指數不相等時,將較小的數值通過右移操作使指數相等。
在浮點乘法器的設計中,有效數字的乘法運算占運算時間的比重最大,因此,將指數計算與有效數字計算并行,消去了指數計算時間,提高了計算效率。
將浮點加法器串聯(lián)在浮點乘法器后組成浮點運算單元,并且加入3 個寄存器用以寄存輸入和輸出。
卷積神經網絡中的三維圖像卷積運算是卷積神經網絡中的重點。圖像的三維卷積運算可以按不同維度進行拆解,從而達到不同程度的并行度。圖1所示為卷積層多層嵌套循環(huán)模型圖。
圖1 卷積層多層嵌套循環(huán)模型圖
將圖像卷積運算按照不同維度展開可以得到不同的并行度。
(1)卷積核內的并行
卷積核內的并行是指在卷積運算中,對于每一個卷積核內的元素,都可以獨立地進行計算,從而加速卷積運算。具體來說,假設卷積核的大小為K×K,那么在卷積運算的過程中,可以同時計算卷積核內的所有元素,而不需要逐個進行計算。這種并行計算的方式可以有效地提高卷積運算的速度。
(2)特征圖內的并行
特征圖內的并行是指在卷積神經網絡中,一個特征圖與一個卷積核的卷積操作相當于將卷積核在特征圖上滑動計算卷積,同時參與計算的滑動窗口的個數稱為特征圖內的并行度。
(3)輸出通道間的并行
特征圖與一個卷積核進行卷積運算后輸出一張二維的特征圖作為輸出特征圖的一個通道。同時參與卷積計算的卷積核個數即為輸出通道間的并行度。
設計卷積核內全并行,特征圖內的并行度根據例化卷積運算單元調節(jié),輸出通道間的并行度通過例化單通道卷積模塊個數調節(jié)。因此,本文設計的加速器在卷積運算部分可以在各維度進行并行度調節(jié),適應不同網絡結構,可重構性強。
本文設計的卷積神經網絡硬件加速系統(tǒng)架構如圖2 所示,系統(tǒng)主要由寄存器傳輸級(register transfer level,RTL)描述的卷積神經網絡加速器、直接內存訪問模塊與處理器組成。卷積神經網絡加速器主要負責卷積層、激活函數層、池化層、全連接層和SoftMax 層的計算。直接內存訪問模塊承擔數據的傳輸。處理器的功能是通過配置總線為整個系統(tǒng)的任務進行調度以及加速器中寄存器的配置。存儲器用于存儲輸入圖像數據、特征圖緩存數據和輸出結果數據。
圖2 卷積神經網絡加速系統(tǒng)架構
實驗實現的卷積神經網絡結構為LeNet-5,該卷積神經網絡結構的卷積核大小均為5 ×5,步長為1,池化方式采用平均池化,激活函數為ReLU 函數。輸入圖像尺寸固定為32 ×32。
LeNet-5 網絡共有3 層卷積層,每層卷積層的卷積核種類分別為6、16、120。
圖3 是浮點加法器結構圖,運算數據為IEEE 754 標準格式的16 bits 浮點數,2 個輸入記為操作數1 和操作數2,輸出為記為和。按照IEEE 754 標準格式將2 個輸入操作數拆包為符號位、指數位和尾數位。在操作數1 或操作數2 的特殊情況下,和分別為操作數2 或操作數1。一般情況下,首先比較2 個操作數的指數部分,以指數大的數為標準,另一個輸入操作數通過右移指數差值個位數使指數相等。其次判斷兩輸入的符號位,若符號位相同,則小數部分直接相加;若符號位不同,則用正數減負數。最后結果打包為IEEE 754 標準格式輸出。
圖3 浮點加法器結構圖
圖4 是浮點乘法器結構圖,2 個輸入操作數分別記為操作數1 和操作數2,輸出記為乘積。特殊情況下,其中一個輸入為0 時,乘積為0。一般情況下,首先用異或判斷符號位是否相同,若相同則乘積符號為正;若不同則符號位為負。根據IEEE 754 標準,乘積的指數為操作數1 的指數與操作數2 的指數的和,小數部分直接用一個乘法器相乘,乘積規(guī)則化的同時調節(jié)指數位。
圖4 浮點乘法器結構圖
本文設計的浮點乘法器與浮點加法器組合成浮點基本運算單元,如圖5 所示。浮點乘法器輸入2個16 bits 的數據,浮點加法器把浮點乘法器的結果與上一次累加的結果相加。
設計的卷積運算單元如圖6 所示,其中例化浮點基本運算單元,每個浮點基本運算單元運算需要一個周期,根據卷積核的尺寸可以求出卷積運算單元需要的周期數。
圖6 卷積運算單元
設計的單通道卷積模塊并行結構如圖7 所示,其中例化卷積運算單元模塊,通過改變例化卷積運算單元模塊的數量,可以控制單個卷積核對一個特征圖進行卷積運算的并行度。通過滑窗選擇模塊將輸入特征圖分割成與卷積核尺寸相同的多個滑窗塊,用于同時和卷積核計算。
圖7 單通道卷積模塊并行結構
本文設計多通道模塊并行結構如圖8 所示,通過增加例化單通道卷積模塊的數量,可以讓特征圖和不同卷積核同時進行卷積運算,提高了輸出通道的并行度。卷積核選擇模塊從卷積核堆中選擇需要運算的卷積核。
圖8 多通道卷積模塊并行結構
本設計采用了ReLU 函數作為激活函數。
ReLU 函數公式如式(1)所示。
ReLU 函數圖像如圖9 所示。
圖9 ReLU 函數圖像
相較于Sigmoid 函數和tanh 函數,ReLU 函數具有3 個優(yōu)勢。首先,它更貼近于生物學神經元的工作方式。其次,梯度下降和方向傳播的效率更高,這有助于避免梯度爆炸和梯度消失等問題。最后,Re-LU 函數的計算較為簡單,不需要像其他復雜的激活函數一樣進行指數和冪函數運算,降低了資源開銷。根據ReLU 函數,數據與0 比較即可得到輸出值。
設計平均池化單元結構如圖10 所示,該單元由3 個浮點加法器和1 個移位寄存器組成。當執(zhí)行采樣區(qū)域尺寸為2 ×2 的池化運算時,如圖所示,將數據1 和數據2 相加、數據3 和數據4 相加,再將2 個和相加,加法器3 的輸出結果進入乘法器與常數0.25相乘得到一個池化采樣區(qū)的結果。
圖10 平均池化單元
設計單通道平均池化模塊并行結構如圖11 所示。通過改變實例化平均池化單元的數量,可以調整池化采樣的并行度。在資源充足的情況下,可以盡可能地提高并行度,以提高運算效率。以LeNet-5網絡為例,當處理一張尺寸為N×N的特征圖時,最大并行度可以達到(N/2)× (N/2)。
圖11 單通道池化模塊并行結構
設計多通道平均池化模塊結構如圖12 所示,通過改變例化單通道平均池化模塊的數量而改變同時進行池化特征圖的層數。最大并行度即為特征圖深度。
圖12 多通道平均池化模塊并行結構
LeNet-5 神經網絡的全連接層后還有一層Soft-Max 函數,其作用是將求得的分類結果歸一化,得到每個分類的概率。而實際應用中,只需要知道概率最大的一個或者幾個分類,并不需要關心其概率大小,所以為了減少資源開銷和提高運算速度,本設計采用比較器選擇出最大的一個分類來代替SoftMax模塊。
本實驗在Vivado 工具上進行仿真和綜合,電路最高工作頻率為100 MHz,在Xilinx 的Zynq UltraScale+MPSoC ZCU104 開發(fā)板上進行驗證。
Xilinx FPGA 開發(fā)板資源名稱說明:查找表(look-up table,LUT);觸發(fā)器(flip-flop,FF);數字信號處理器(digital signal processing,DSP)。
以下對各模塊的資源分配情況進行統(tǒng)計及分析。
資源使用情況如表1 所示,該模塊使用205 個LUT,82 個FF,1 個DSP。
表1 C 卷積單元模塊資源統(tǒng)計表
由此可以看出,對于1 次卷積運算(1 塊卷積區(qū)域和1 個卷積核的卷積過程),只需要使用1 個DSP就可以實現。
資源使用情況如表2 所列,該模塊使用6137 個LUT,4296 個FF,28 個DSP。
表2 單通道卷積模塊資源統(tǒng)計表
該模塊的功能是將輸入特征圖的一個通道按卷積核尺寸分割成一定數量的待卷積運算的塊,其數量可以自由調節(jié)。當資源足夠,可以增加例化卷積單元的數量提高運算并行度。本實驗設置例化卷積單元的數量為28,即將輸入特征圖分割成28 個待卷積運算的塊,同時進行28 個卷積運算。
資源使用情況見表3,該模塊使用98 192 個LUT,68 736 個FF,448 個DSP。
表3 多通道卷積模塊資源統(tǒng)計表
該模塊的功能通過改變例化單通道卷積模塊的個數來改變同時輸出特征圖的通道數。卷積核選擇模塊從卷積核堆中選擇即將進行卷積的卷積核。在資源允許的情況下,該模塊可以通過例化更多的單通道卷積模塊,實現多個卷積核之間的運算并行度。
在100 MHz 工作頻率下,計算輸入特征圖尺寸為14×14×6,與16 個尺寸為5 ×5 的卷積核進行卷積運算,例化的卷積單元模塊個數為28,單通道卷積模塊個數為16,此時加速器峰值算力為44.8 GFLOPS,功率為4.51 W。
本文的硬件加速器性能與CPU、GPU 對比如表4所示,速度顯著高于CPU,功耗低于GPU 2 個量級。
表4 CPU、GPU 與硬件加速器性能對比表
本文的加速器性能與其他研究的硬件加速器對比如表5 所示,文獻[19]使用16 bits 定點數,精度要低于本文的設計,對比文獻[20]的設計,本文的能效比要高2.15倍。
表5 與其他硬件加速器研究比較表
根據本文實驗部分的結果進行分析可以得出,本文設計的卷積運算單元資源開銷極少,核心運算單元DSP 只需要1 個。并且可以通過調節(jié)單通道卷積模塊和多通道卷積模塊中例化子模塊的數量來調節(jié)并行度,在不同資源的FPGA 上平衡面積、功耗和速度。
未來的研究方向如下:卷積核內的并行度對卷積運算的效率提升有重要的影響,可以考慮脈動陣列等方式使計算效率進一步提升;在數據傳輸上,可以考慮增加Ping-Pong 以減少數據存取帶來的延時。