李嘉輝 蔡述庭 陳學(xué)松 熊曉明
?
基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)的實現(xiàn)*
李嘉輝 蔡述庭 陳學(xué)松 熊曉明
(廣東工業(yè)大學(xué)自動化學(xué)院)
現(xiàn)有基于CPU或GPU的卷積神經(jīng)網(wǎng)絡(luò)實現(xiàn)方案,無法兼顧實時性、功耗以及便攜性的要求?;贔PGA強(qiáng)大的并行處理能力和超低功耗,在DE1-Soc開發(fā)板上采用Verilog HDL實現(xiàn)了使用MNIST數(shù)據(jù)集的阿拉伯?dāng)?shù)字手寫體識別卷積神經(jīng)網(wǎng)絡(luò)。網(wǎng)絡(luò)的每一層采用流水線和時分復(fù)用方法;單個時鐘周期能完成72次乘累加操作,在100 MHz的工作頻率下,加速器峰值運(yùn)算速度可達(dá)7.2 GMAC/s。與PC上運(yùn)行的定點數(shù)版本的C語言程序相比,在相同錯誤率6.43%的情況下,速度是其5.2倍。
卷積神經(jīng)網(wǎng)絡(luò);FPGA;性能加速
目前卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)的實現(xiàn)方案有基于CPU、GPU和FPGA三大類。因CPU的結(jié)構(gòu)特點以及通用計算機(jī)的架構(gòu)限制,導(dǎo)致基于CPU的方案功耗、便攜性和實時性不可兼得。雖然GPU具有強(qiáng)大的浮點運(yùn)算和并行處理能力,但基于GPU的方案,存在功耗過高,移動性能也不足的弱點[1-3]。因此,基于CPU或者GPU的實現(xiàn)方案在追求移動性能的場景下均不可取。FPGA具有強(qiáng)大的并行處理能力、靈活的可配置特性和超低功耗,可以考慮作為CNN的實現(xiàn)平臺。
目前,F(xiàn)PGA開發(fā)有2種途徑:一種是基于HDL的傳統(tǒng)途徑;另一種是使用高層次綜合工具,如OpenCL或者Xilinx的HLS[4],雖能加快FPGA開發(fā)流程,但資源消耗大、性能低,且開發(fā)人員不能對生成的電路進(jìn)行精準(zhǔn)干預(yù)。因此本文使用Verilog HDL語言,在DE1-Soc平臺下實現(xiàn)一個識別阿拉伯?dāng)?shù)字手寫體的CNN網(wǎng)絡(luò)。
本文實現(xiàn)的CNN網(wǎng)絡(luò)整體結(jié)構(gòu)如圖1所示。其中卷積層C1和C3的卷積核都是5×5的矩陣組;下采樣層S4和輸出層之間的192×1矩陣,由下采樣層的12個4×4矩陣直接展開得到,再經(jīng)過全連接層計算得到輸出層。
圖1 CNN網(wǎng)絡(luò)結(jié)構(gòu)示意圖
CNN加速系統(tǒng)分為2部分:一部分是在開發(fā)板上以Cortex-A9為中心的HPS,主要將樣本數(shù)據(jù)讀取并加載到DDR3 SDRAM的特定地址,然后告知CNN加速模塊數(shù)據(jù)已經(jīng)準(zhǔn)備完畢;另一部分是FPGA內(nèi)部實現(xiàn)的CNN加速模塊,實現(xiàn)一個使用AXI-HP接口的AXI4總線主機(jī),從DDR3 SDRAM中讀取樣本,計算并將結(jié)果寫回DDR3 SDRAM,再通過中斷通知HPS。另外,HPS通過AXI4-lite設(shè)置加速模塊的參數(shù),如數(shù)據(jù)存儲地址。加速系統(tǒng)整體架構(gòu)和CNN加速模塊結(jié)構(gòu)圖如圖2、圖3所示。
本文CNN實現(xiàn)方案具有以下特點:
1)通過時分復(fù)用降低對FPGA上DSP等資源的需求;
2)具體到某一層的實現(xiàn),采用流水線增加數(shù)據(jù)吞吐率;
3)使用定點數(shù)代替浮點數(shù),進(jìn)一步降低對BRAM和DSP的資源消耗;
4)對MNIST樣本預(yù)處理,避免因數(shù)據(jù)位數(shù)有限導(dǎo)致溢出。
圖2 加速系統(tǒng)整體架構(gòu)
圖3 CNN加速模塊結(jié)構(gòu)圖
以第一卷積層為例闡述卷積層的實現(xiàn)方法。第一卷積層的運(yùn)算過程如圖4所示,6個卷積核矩陣分別在輸入矩陣進(jìn)行平移,兩者重疊部分相乘求和得到輸出矩陣中的一個元素。輸入輸出矩陣和卷積核的數(shù)據(jù)在存儲器中的組織情況如圖5所示。每次對kernels的讀操作,能夠讀取6個數(shù)據(jù),故可同時計算6個輸出元素。為提高模塊處理能力,采取流水線結(jié)構(gòu),如圖6所示,其中表示當(dāng)前樣本在一批樣本中的序號;和表示輸出元素的坐標(biāo);和表示卷積核與輸入矩陣重疊部分中當(dāng)前處理的元素的坐標(biāo)(相對于重疊部分)。上述變量用于多層循環(huán)的遍歷,并用于產(chǎn)生輸入地址(i_addr,k_addr)和輸出地址(o_addr)。i_addr和k_addr分別用于檢索輸入和卷積核數(shù)據(jù)。檢索得到的數(shù)據(jù)相乘,各自進(jìn)行累加求和,再由模塊外部的sigmoid函數(shù)求值模塊得到輸出元素,寫入到o_addr指定地址中(圖6中,輸出地址傳輸路徑上省略了若干寄存器)。另外,圖6中存儲累加器輸出結(jié)果的寄存器初值是偏置值;粗線表示其上同時傳輸多個數(shù)據(jù)。
圖4 第一卷積層運(yùn)算過程示意圖
圖5 第一卷積層的數(shù)據(jù)存儲方式
圖6 第一卷積層的流水線示意圖
以第一下采樣層為例闡述下采樣層的實現(xiàn)方法。第一下采樣層的計算過程如圖7所示,一個樣本有6個24階輸入方陣,以二階方陣作為單元對輸入矩陣分塊并計算各方陣元素平均值,作為其輸出元素。
下采樣層的輸入輸出數(shù)據(jù)存儲排列方式,也是將矩陣按行展開為一維數(shù)組;存儲器中某地址對應(yīng)的字存儲同一樣本的多個矩陣相同坐標(biāo)的元素,從而一次訪問可同時計算多個輸出矩陣的元素(稱為一組輸出元素)。另外,使用雙端口ram存儲輸入輸出元素,從而只需要2個時鐘周期就能計算一組輸出元素。下采樣層也采取流水線的結(jié)構(gòu)實現(xiàn),如圖8所示,其中表示當(dāng)前樣本在一批樣本中的序號;和表示當(dāng)前輸出元素在輸出矩陣中的行列坐標(biāo);使用雙端口ram存儲輸入數(shù)據(jù),故各輸出元素的計算只需讀2次輸入數(shù)據(jù)存儲器input,這2次讀取標(biāo)記為變量。2次讀取的4個數(shù)據(jù)求和之后,舍棄結(jié)果最后2位,得到平均數(shù)存入寄存器。i_addr,o_addr和圖中粗線與前文意義相同。另外,圖8中輸出地址傳輸路徑省略了若干寄存器。
圖7 第一下采樣層的計算過程示意圖
圖8 第一下采樣層的流水線示意圖
全連接層的輸入是12個4階方陣,一個樣本輸入,最終輸出10個數(shù)值結(jié)果。權(quán)值矩陣可看做是10組4階方陣,每組12個方陣。10組權(quán)值矩陣均與輸入的同型矩陣組按元素相乘求和。單個樣本在該層的輸入數(shù)據(jù)的存儲排列情況,可以看做是字?jǐn)?shù)為16、位寬為12個數(shù)據(jù)項的一段存儲空間;共10組權(quán)值矩陣中的每一組也可以看成是相同大小的一段存儲空間。整個權(quán)值矩陣可以存儲在一個字?jǐn)?shù)為160、位寬為12個數(shù)據(jù)項的存儲器中。每組權(quán)值矩陣和單個樣本輸入數(shù)據(jù)存儲情況如圖9所示。
圖9 全連接層數(shù)據(jù)的存儲示意圖
全連接層的實現(xiàn)也通過并行化和流水線提高數(shù)據(jù)吞吐率,輸入數(shù)據(jù)和權(quán)值矩陣的存儲也用雙端口ram。其流水線示意圖如圖10所示,其中表示當(dāng)前樣本在一批樣本中的序號;和表示當(dāng)前處理的元素在4階方陣中的坐標(biāo);表示當(dāng)前使用哪組權(quán)值矩陣與輸入數(shù)據(jù)相乘。圖10中,w_addr表示用于檢索權(quán)值數(shù)據(jù)的地址;wght是存儲權(quán)值矩陣的存儲器。輸入到sigmoid求值模塊的寄存器初值就是全連接層的某偏置值。
常見的sigmoid函數(shù)求值模塊的實現(xiàn)方法有3種:1)查表法,將預(yù)先計算的結(jié)果存儲起來,把輸入數(shù)據(jù)轉(zhuǎn)換為查表地址,查詢結(jié)果;2)直接計算法,使用較為復(fù)雜的邏輯構(gòu)建計算電路;3)分段線性近似法,將函數(shù)曲線分為足夠多段,每一段使用直線段近似代替原圖像。因本文使用的FPGA內(nèi)BRAM有限,本設(shè)計只用于預(yù)測,不需要太高精度,所以使用分段線性近似法進(jìn)行sigmoid求值模塊的實現(xiàn)。另外,該模塊也采用流水線結(jié)構(gòu)設(shè)計。
圖10 全連接層的流水線示意圖
3.4.1 sigmoid模塊設(shè)計依據(jù)
1)本設(shè)計使用的定點數(shù)包含10位二進(jìn)制小數(shù),近似計算結(jié)果誤差不應(yīng)超過0.001;
3)當(dāng)輸入大于8時,函數(shù)值與1的差值小于0.001。
線性近似線段參數(shù)的計算:區(qū)間[0, 8]等分為32段,連接函數(shù)圖像在相鄰兩分點的交點,得到線性近似;計算各線段的斜率和截距??梢则炞C,近似計算的誤差不超過0.001。
3.4.2 模塊計算過程
1)對輸入取絕對值;
2)根據(jù)絕對值進(jìn)行近似計算;
3)根據(jù)原數(shù)據(jù)符號,決定是否使用1減去第2步的結(jié)果;
4)輸出結(jié)果。
本設(shè)計使用MNIST數(shù)據(jù)集作為訓(xùn)練和測試數(shù)據(jù)。PC配置:i5-3570,8GB DDR3-1600 MHz;開發(fā)板上的Soc FPGA芯片是5CSEMA5F31C6,邏輯容量為85 K,并包含一個以cortex-A9雙核CPU為核心的HPS。首先在PC上使用C語言編寫的程序(單精度浮點版本)進(jìn)行網(wǎng)絡(luò)訓(xùn)練(樣本已預(yù)處理),得到參數(shù);然后對參數(shù)定點化處理作為FPGA加速模塊的參數(shù);最后使用相同的測試集進(jìn)行測試,與PC上定點版本的正向預(yù)測過程進(jìn)行對比。CNN加速模塊最終工作頻率為100 MHz。
樣本數(shù)據(jù)預(yù)處理:原MNIST數(shù)據(jù)集使用uint8存儲數(shù)據(jù);若采用20位定點數(shù),則用原MNIST數(shù)據(jù)集運(yùn)算很可能導(dǎo)致溢出,產(chǎn)生錯誤,因此對樣本進(jìn)行預(yù)處理:設(shè)定閾值,當(dāng)輸入數(shù)據(jù)不超過該閾值,那么保持原值,否則輸出閾值。本設(shè)計使用16作為閾值。
實驗結(jié)果分2部分:PC上的正向預(yù)測過程錯誤率6.43%,平均每個樣本耗時852 us;FPGA方案錯誤率為6.43%,平均每個樣本總耗時164 us,因此加速效果為5.2倍。
本設(shè)計消耗的資源統(tǒng)計:
logic utilization:7%
DSP blocks:42%
total block memory bits:69%
total registers:4765
預(yù)測錯誤率6.43%與同類論文對比偏高,這是因為PC上網(wǎng)絡(luò)訓(xùn)練過程中,只對訓(xùn)練集樣本進(jìn)行一次遍歷,與FPGA加速模塊的設(shè)計無關(guān)。另外,第二卷積層的實現(xiàn)中,一個時鐘周期同時計算12個輸出特征圖的元素,每個輸出元素需要計算6對乘法,因此峰值性能能夠得到7.2 GMAC/s(工作頻率100 MHz)。對于本設(shè)計實現(xiàn)的CNN網(wǎng)絡(luò)算法,一個樣本的處理需要約2.06×105次乘累加操作,因此加速模塊的平均性能達(dá)到1.26 GMAC/s。對比文獻(xiàn)[5]中的性能,本文提出的設(shè)計性能更優(yōu)。另外,文獻(xiàn)[5]中使用浮點數(shù)進(jìn)行數(shù)據(jù)處理,以及關(guān)于激活函數(shù)計算使用查表法,都導(dǎo)致較高的BRAM使用率。
在正向預(yù)測過程中,卷積層用時最長,特別是第一卷積層,因其輸出矩陣尺寸較大且模塊的并行度不高(每個時鐘計算5次乘法)。可以考慮將第一卷積層的輸入數(shù)據(jù)的存儲器從1個擴(kuò)展為5個,那么可以同時從5個存儲器獲取數(shù)據(jù)來源,從而提高模塊并行度;而由此導(dǎo)致BRAM不足的問題,將輸入樣本數(shù)據(jù)進(jìn)行二值化即可。
本文提出的基于FPGA的CNN加速器設(shè)計,采用流水線和并行計算的方法,提高了加速器的吞吐率;使用時分復(fù)用的方法以及用定點數(shù)代替浮點數(shù),降低了資源利用率。通過采用MNIST數(shù)據(jù)集進(jìn)行測試,對比PC運(yùn)行的C語言程序,在相同預(yù)測準(zhǔn)確率的情況下,性能是PC實現(xiàn)的5.2倍。
[1] 畢占甲.基于多GPU的多層神經(jīng)網(wǎng)絡(luò)并行加速訓(xùn)練算法的研究[D].哈爾濱:哈爾濱工業(yè)大學(xué),2015.
[2] Strigl D, Kofler K, Podlipnig S. Performance and scalability of GPU-based convolutional neural networks[C]. 18th Euromicro Conference on Parallel, Distributed and Network-Based Processing, 2010.
[3] 劉琦,黃咨,陳璐艷,等.基于GPU的卷積檢測模型加速[J].計算機(jī)應(yīng)用與軟件,2016,33(5):226-230.
[4] Zhang Chen, Li Peng, Sun Guanyu, et al. Optimizing FPGA-based accelerator design for deep convolutional neural networks[C]. In ACM Int. Symp. On Field Programmable Gate Arrays, 2015:161-170.
[5] 余子健.基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)加速器[D].杭州:浙江大學(xué),2016.
[6] Suda N, Chandra V, Dasika G, et al. Throughput-optimized OpenCL-based FPGA accelerator for large-scale convolutional neural networks[C].Proceedings of the 2016 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays. ACM, 2016: 16-25.
The Realization of the Convolution Neural Network Based on FPGA
Li Jiahui Cai Shuting Chen Xuesong Xiong Xiaoming
(School of Automation, Guangdong University of Technology)
Convolutional Neural Network is a computation intensive algorithm based on deep learning, and it is common used in image classification, video recognition, etc. Due to the powerful parallel capability and flexibility of FPGA, it is frequently used as the platform to implementation of CNN. Meanwhile, the rapidly emerging mobile application of deep learning suggest that it is very significant to implement a CNN on mobile platform. Therefore, a DE1-Soc development board was used to implement a CNN network by Verilog HDL approach, using mnist as samples data. Finally, the implementation is 5.2 times faster than that on PC.
Convolution Neural Network; FPGA; Performance Acceleration
李嘉輝,男,1991年生,在讀碩士,主要研究方向:FPGA加速、深度學(xué)習(xí)。
蔡述庭(通訊作者),男,1979年生,博士,副教授,主要研究方向:FPGA加速、深度學(xué)習(xí)。E-mail:shutingcai@126.com
陳學(xué)松,男,1978年生,博士,副教授,主要研究方向:強(qiáng)化學(xué)習(xí)、機(jī)器學(xué)習(xí)。
熊曉明,男,1956年生,博士,教授,主要研究方向:IC設(shè)計、EDA技術(shù)。
國家自然科學(xué)基金(61201392);廣東省自然科學(xué)基金-自由申請項目(2015A030313497)。