滿 濤,郭子豪,曲志堅(jiān)
(山東理工大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,山東 淄博 255049)
隨著計(jì)算機(jī)視覺和深度學(xué)習(xí)的迅速發(fā)展和廣泛應(yīng)用,對(duì)于卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)的關(guān)注度越來越高。但是,隨著CNN的網(wǎng)絡(luò)深度和規(guī)模越來越大,由此帶來的功耗較大和計(jì)算效率低等問題又使得人們關(guān)注于使用不同架構(gòu)的硬件來加速CNN的計(jì)算[1-3]。對(duì)于CNN,現(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,FPGA)使用軟硬件協(xié)作來執(zhí)行CNN網(wǎng)絡(luò),可重構(gòu)配置以便在速度、功耗和靈活性之間權(quán)衡,可以大大提高計(jì)算效率并降低功耗。
目前的研究主要針對(duì)CNN模型的壓縮和終端推理計(jì)算的設(shè)計(jì)與優(yōu)化。在模型壓縮方面,Choi等[4]分別對(duì)目標(biāo)權(quán)重和激活分別量化并形成一個(gè)整體量化神經(jīng)網(wǎng)絡(luò)(Quantized Neural Network,QNN)的新技術(shù);Ding等[5]提出使用2的冪的有限組合替代權(quán)重,從而用移位操作代替乘累加操作,實(shí)現(xiàn)了更高的準(zhǔn)確性和更快的速度。在FPGA的設(shè)計(jì)與優(yōu)化方面,Zhang等[6]設(shè)計(jì)了一種對(duì)特征圖分塊展開的加速方法并提出Roofline模型優(yōu)化資源利用率,Li等[7]設(shè)計(jì)了一種單指令多數(shù)據(jù)(Single Instruction Multiple Data,SIMD)的卷積與流水線結(jié)構(gòu)進(jìn)行CNN加速,Stylianos等[8]提出一種以同步數(shù)據(jù)流(Synchronous Dataflow,SDF)計(jì)算模型為基礎(chǔ)的加速器框架,Yang等[9]使用移位操作和1×1卷積優(yōu)化網(wǎng)絡(luò)設(shè)計(jì)了新的加速器架構(gòu)和CNN模型。
本文針對(duì)使用浮點(diǎn)數(shù)進(jìn)行卷積計(jì)算導(dǎo)致的計(jì)算復(fù)雜度高、模型占用空間大和運(yùn)算速度慢的問題,設(shè)計(jì)了一種基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)加速器。首先,通過設(shè)計(jì)動(dòng)態(tài)定點(diǎn)量化方法,實(shí)現(xiàn)了將浮點(diǎn)CNN模型各層的權(quán)值和特征圖參數(shù)動(dòng)態(tài)量化為定點(diǎn)模型;其次,通過輸入即輸出方式的流水線架構(gòu)提高數(shù)據(jù)吞吐率,并對(duì)卷積運(yùn)算單元進(jìn)行并行優(yōu)化以提升計(jì)算效率;最后,采用MNIST手寫數(shù)字字符庫和CIFAR-10數(shù)據(jù)集進(jìn)行方案和功能驗(yàn)證。
CNN是由大量具有可學(xué)習(xí)功能參數(shù)(也稱為“權(quán)重”)執(zhí)行點(diǎn)積的神經(jīng)元構(gòu)建的,并且需要反向傳播進(jìn)行訓(xùn)練并向前傳播進(jìn)行測(cè)試。CNN與傳統(tǒng)識(shí)別算法不同,其輸入數(shù)據(jù)可以使用圖像,并且不再需要特征提取和數(shù)據(jù)重建。在此條件下,CNN的前向傳播等效于二維卷積,這意味著CNN具有很強(qiáng)的確定性和并行性便于對(duì)其加速。經(jīng)典的CNN模型由許多不同的層組成,特征圖依次在這些層上進(jìn)行運(yùn)算,下一層都從上一層的輸出中讀取輸入特征,然后執(zhí)行和輸出。常用的CNN層包括卷積層、池化層、全連接層和分類層。
LeNet-5是一個(gè)非常成功且典型的卷積神經(jīng)網(wǎng)絡(luò)模型[10],其網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
圖1 LeNet-5網(wǎng)絡(luò)結(jié)構(gòu)圖
對(duì)于MNIST數(shù)據(jù)集,LeNet-5網(wǎng)絡(luò)的輸入為28×28×1大小像素的圖片,對(duì)于CIFAR-10數(shù)據(jù)集,該網(wǎng)絡(luò)的輸入為32×32×3大小像素的圖片。輸入圖像按照網(wǎng)絡(luò)結(jié)構(gòu)的順序依次通過conv1-pool1-conv2-pool2-fc1-fc2層后輸出10個(gè)特征值,然后在softmax層中進(jìn)行歸一化求出最大概率值,進(jìn)而得出分類結(jié)果。兩個(gè)數(shù)據(jù)集的網(wǎng)絡(luò)參數(shù)設(shè)置如表1所示。
表1 網(wǎng)絡(luò)參數(shù)表
采用ARM+FPGA的整體架構(gòu)設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)的前向推斷加速,包括ARM處理器部分(Processing System,PS)和FPGA邏輯資源部分(Programmable Logic,PL)。因?yàn)榫矸e神經(jīng)網(wǎng)絡(luò)的計(jì)算密集層主要為卷積層和全連接層,所以進(jìn)行軟硬件劃分時(shí),在FPGA上實(shí)現(xiàn)的主要是網(wǎng)絡(luò)的運(yùn)算,而ARM處理器主要負(fù)責(zé)對(duì)輸入數(shù)據(jù)和參數(shù)進(jìn)行預(yù)加載和分配,并執(zhí)行對(duì)FPGA初始階段的控制。
系統(tǒng)的結(jié)構(gòu)框架如圖2所示。左上方為ARM處理器PS部分,灰色區(qū)域?yàn)榭删幊踢壿婸L部分。PS部分主要包括ARM雙核處理器及其控制的數(shù)據(jù)輸入端口、分類結(jié)果輸出端口、DDR(Double Data Rate)存儲(chǔ)模塊和IP(Internet Protocol)網(wǎng)絡(luò)接口,PL部分主要由AXI_DMA控制模塊、片上存儲(chǔ)器和由不同層的IP核構(gòu)成的CNN硬件加速器組成。
圖2 系統(tǒng)結(jié)構(gòu)框圖
系統(tǒng)的具體工作流程如下:ARM Cortex-A9處理器通過IP網(wǎng)絡(luò)接口從上位機(jī)獲取MNIST數(shù)據(jù)集或CIFAR-10數(shù)據(jù)集的特征圖和權(quán)值參數(shù)數(shù)據(jù)并存入到DDR存儲(chǔ)模塊中,然后驅(qū)動(dòng)AXI_DMA模塊,從直接存儲(chǔ)寄存器(Direct Memory Access,DMA)中將特征圖和權(quán)值參數(shù)傳輸?shù)狡洗鎯?chǔ)器(Random Access Memory,RAM)。ARM會(huì)控制CNN硬件加速器模塊從片上存儲(chǔ)器中讀取所需的特征圖和權(quán)重參數(shù)數(shù)據(jù)進(jìn)行計(jì)算,在CNN加速模塊計(jì)算完之后將計(jì)算結(jié)果存儲(chǔ)在片上存儲(chǔ)器中。整個(gè)運(yùn)算過程完畢之后,ARM會(huì)驅(qū)動(dòng)AXI_DMA模塊,將運(yùn)算結(jié)果從片上存儲(chǔ)器傳輸?shù)紻MA再傳輸?shù)紻DR存儲(chǔ)器中,ARM通過IP網(wǎng)絡(luò)接口將結(jié)果傳輸給上位機(jī)。
CNN硬件加速器模塊的實(shí)現(xiàn)是通過將卷積神經(jīng)網(wǎng)絡(luò)的各個(gè)層設(shè)計(jì)成IP核,然后將各層IP核按照網(wǎng)絡(luò)的結(jié)構(gòu)連接到一起,通過AXI4-Streaming總線來傳輸數(shù)據(jù)流,各層之間采用輸入即輸出的計(jì)算模式。該計(jì)算模式實(shí)現(xiàn)了流水線操作,數(shù)據(jù)流可以由每個(gè)層獨(dú)立地驅(qū)動(dòng),上一層計(jì)算好的數(shù)據(jù)可以立即傳出,既節(jié)省了整個(gè)網(wǎng)絡(luò)的內(nèi)存占用又提高了系統(tǒng)魯棒性。
為了減少FPGA在計(jì)算時(shí)的資源耗費(fèi),在網(wǎng)絡(luò)模型識(shí)別準(zhǔn)確率保持不變或者略微下降的前提下,一般采用數(shù)據(jù)量化來降低網(wǎng)絡(luò)模型計(jì)算時(shí)的數(shù)據(jù)位寬[11]。文獻(xiàn)[12]從優(yōu)化CNN運(yùn)行內(nèi)存帶寬角度出發(fā),統(tǒng)計(jì)了CNN分別采用浮點(diǎn)數(shù)與定點(diǎn)數(shù)計(jì)算時(shí)MNIST手寫數(shù)字?jǐn)?shù)據(jù)集的識(shí)別錯(cuò)誤率,其測(cè)試結(jié)果顯示數(shù)據(jù)在使用定點(diǎn)16位和定點(diǎn)32位時(shí)錯(cuò)誤率基本沒有變化。
在FPGA上進(jìn)行卷積計(jì)算時(shí)大部分使用乘法器和加法器進(jìn)行設(shè)計(jì)。乘法器和加法器的資源消耗與數(shù)據(jù)精度息息相關(guān)。根據(jù)實(shí)驗(yàn)得出,乘法器和加法器主要耗費(fèi)數(shù)字信號(hào)處理器(Digital Signal Processing,DSP)和查找表(Look-up Table,LUT)資源。不同精度下,乘法器和加法器的資源耗費(fèi)如表2所示。
表2 資源耗費(fèi)比較
表2表明,選擇浮點(diǎn)32位精度設(shè)計(jì)單個(gè)乘法器和加法器時(shí),DSP和LUT消耗都比較大。然而,定點(diǎn)數(shù)16位精度的加法器不消耗DSP,只消耗較少的LUT;乘法器的資源消耗也大大減少。因此,在確保數(shù)據(jù)精度不變或較少變化的前提下,定點(diǎn)計(jì)算具有很大的優(yōu)勢(shì)。
文獻(xiàn)[13-14]介紹了對(duì)于網(wǎng)絡(luò)模型參數(shù)和輸入輸出特征圖的采用動(dòng)態(tài)定點(diǎn)數(shù)量化的方法。本文借鑒了相關(guān)的量化思路,設(shè)計(jì)并采用16位動(dòng)態(tài)定點(diǎn)數(shù)對(duì)卷積神經(jīng)網(wǎng)絡(luò)中的參數(shù)和特征圖進(jìn)行量化,如圖3所示。在對(duì)每一層的輸入輸出特征圖和權(quán)重參數(shù)進(jìn)行量化時(shí),采用階碼來表示每一層參數(shù)和特征圖分配給小數(shù)部分的位數(shù),每一層的階碼是固定的,層與層之間的階碼是根據(jù)數(shù)據(jù)分布范圍動(dòng)態(tài)調(diào)整的。
圖3 動(dòng)態(tài)定點(diǎn)量化
動(dòng)態(tài)定點(diǎn)量化定點(diǎn)數(shù)xfixed由以下公式表示:
(1)
式中:s表示符號(hào)位,f表示階碼,B表示量化的位寬長度,xi表示尾數(shù)部分。定點(diǎn)數(shù)xfixed最高位為符號(hào)位。
動(dòng)態(tài)定點(diǎn)數(shù)量化包含以下三個(gè)部分:
(1)參數(shù)量化
在進(jìn)行量化之前,需要先找到每層權(quán)重參數(shù)的最優(yōu)階碼fw:
fw=argmin|Xfloat-Xfw|。
(2)
式中:Xfloat表示在CNN訓(xùn)練中某層權(quán)重參數(shù)的原始浮點(diǎn)值,Xfw表示在給定階碼fw的情況下對(duì)Xfloat定點(diǎn)化后再轉(zhuǎn)換回浮點(diǎn)數(shù)的值。在CNN原始的浮點(diǎn)數(shù)權(quán)重和定點(diǎn)量化后的權(quán)重差的值最小的情況下得出的fw為該層的最優(yōu)階碼。
(2)中間特征圖量化
其次,需要按照網(wǎng)絡(luò)的結(jié)構(gòu)對(duì)網(wǎng)絡(luò)中每層的輸入輸出特征圖進(jìn)行量化,使得每層特征圖具有共同的階碼fo,其滿足
fo=argmin|Pfloat-Pfo|。
(3)
式中:Pfloat表示CNN前向推斷中的輸出特征圖的原始浮點(diǎn)數(shù)值,Pfo表示給定階碼fo的情況下對(duì)原始數(shù)據(jù)定點(diǎn)化后再轉(zhuǎn)回浮點(diǎn)數(shù)的值。其余過程與參數(shù)量化類似。
(3) 中間參數(shù)量化
在對(duì)權(quán)重參數(shù)和中間特征圖進(jìn)行定點(diǎn)量化之后,還需要對(duì)中間的計(jì)算結(jié)果進(jìn)行量化。采用乘加和移位的方式對(duì)CNN中間計(jì)算產(chǎn)生的定點(diǎn)數(shù)進(jìn)行操作,保證卷積神經(jīng)網(wǎng)絡(luò)在FPGA上的數(shù)據(jù)計(jì)算和傳輸都采用定點(diǎn)數(shù)來進(jìn)行。中間參數(shù)量化的階碼fm的計(jì)算公式如下:
fm=argmin|Mfloat-Mfm|。
(4)
由以上的量化計(jì)算公式可得LeNet-5模型的階碼如表3所示。CNN模型進(jìn)行計(jì)算時(shí)采用量化后的參數(shù)進(jìn)行運(yùn)算,對(duì)定點(diǎn)數(shù)進(jìn)行乘累加運(yùn)算,將運(yùn)算結(jié)果按照每層的階碼再進(jìn)行量化操作,量化后的特征圖再作為下一層的輸入?yún)⑴c到下一層的計(jì)算,直到完成CNN模型所有的計(jì)算。
表3 CNN各層階碼
ARM端的一個(gè)任務(wù)是負(fù)責(zé)從DDR內(nèi)存到FPGA片上存儲(chǔ)器的數(shù)據(jù)傳輸,通過AXI_DMA模塊實(shí)現(xiàn)。通過AXI4-Lite總線對(duì)AXI_DMA模塊進(jìn)行配置,對(duì)DDR存儲(chǔ)模塊的指定區(qū)間執(zhí)行讀寫任務(wù),DMA通過AXI4總線讀取DDR內(nèi)的特征圖數(shù)據(jù),并通過AXI4-Streaming總線將讀取到的數(shù)據(jù)輸入片上緩存模塊,進(jìn)而給到CNN加速IP,并將最后的結(jié)果通過總線接收后傳輸至ZYNQ處理系統(tǒng),完成數(shù)據(jù)的傳輸。
進(jìn)行數(shù)據(jù)傳輸?shù)目偩€使用了握手協(xié)議更為簡單的AXI4-Streaming總線。AXI4-Streaming總線協(xié)議去除了地址概念,不再是一種地址映射協(xié)議,而是數(shù)據(jù)流通信協(xié)議,可以始終不斷地對(duì)一個(gè)地址讀寫,因此該協(xié)議主要面向高速的、大數(shù)據(jù)量的數(shù)據(jù)流傳輸,這提高了數(shù)據(jù)傳輸?shù)男?。存?chǔ)器直接訪問DMA是一種高速的數(shù)據(jù)傳輸操作,在存取數(shù)據(jù)的過程中,數(shù)據(jù)的傳輸由FPGA上的獨(dú)立控制器控制和調(diào)度,這樣CPU和其他功能模塊可以負(fù)責(zé)其他任務(wù)。通過使用AXI4-Streaming協(xié)議和直接存儲(chǔ)寄存器DMA可以為系統(tǒng)提供更高的數(shù)據(jù)傳輸吞吐量。
為了減少存儲(chǔ)器傳輸延遲,本設(shè)計(jì)將所有的特征圖數(shù)據(jù)和權(quán)重參數(shù)都存儲(chǔ)在片上存儲(chǔ)器中,在運(yùn)行時(shí)可以重新加載。
本文設(shè)計(jì)了如圖4所示的卷積計(jì)算單元,將卷積計(jì)算單元設(shè)計(jì)為多個(gè)部分,包括存儲(chǔ)模塊、移位寄存器、乘法器陣列、加法樹和累加器,一方面通過將數(shù)據(jù)存儲(chǔ)在多個(gè)存儲(chǔ)模塊中來同時(shí)獲取多個(gè)數(shù)據(jù);另一方面是將復(fù)雜的卷積運(yùn)算轉(zhuǎn)換成乘加法運(yùn)算,需要使用較多的DSP資源來提升并行性。
圖4 卷積計(jì)算單元
為了減少緩沖區(qū)的使用和提高計(jì)算的吞吐量,采用了不改變滑窗計(jì)算過程并且使用較少DSP資源的乘加樹計(jì)算方法。該卷積層輸入多張?zhí)卣鲌D及其對(duì)應(yīng)權(quán)重,分別經(jīng)過乘累加運(yùn)算后得到一組卷積結(jié)果。對(duì)該組結(jié)果進(jìn)行相加后,得到一個(gè)卷積計(jì)算的輸出,然后對(duì)結(jié)果進(jìn)行緩存。設(shè)計(jì)的卷積計(jì)算單元能夠?qū)⒍鄠€(gè)特征圖計(jì)算并行,從結(jié)構(gòu)的層面對(duì)卷積神經(jīng)網(wǎng)絡(luò)并行加速。
由于塊隨機(jī)存取存儲(chǔ)器(Block Random Access Memory,BRAM)的限制,無法把所有數(shù)據(jù)都存入到BRAM上進(jìn)行計(jì)算,若通過DDR讀取傳入數(shù)據(jù)再進(jìn)行計(jì)算,則速度會(huì)受到影響。在設(shè)計(jì)時(shí)提出將輸入特征圖存儲(chǔ)于基于LUT的存儲(chǔ)模塊中,權(quán)重存儲(chǔ)于基于BRAM的存儲(chǔ)模塊中,通過添加約束指令來實(shí)現(xiàn)對(duì)于存儲(chǔ)模塊的分割,以便于并行獲取多個(gè)輸入數(shù)據(jù)。
如圖4所示,有4個(gè)存儲(chǔ)模塊輸入特征圖1~4負(fù)責(zé)存儲(chǔ)輸入特征圖,4個(gè)存儲(chǔ)模塊權(quán)重參數(shù)1~4負(fù)責(zé)存儲(chǔ)權(quán)重。對(duì)于包含填充操作的卷積神經(jīng)網(wǎng)絡(luò),需在輸入特征圖的邊緣位置填充0。根據(jù)當(dāng)前卷積操作所在的時(shí)鐘周期,負(fù)責(zé)執(zhí)行點(diǎn)積的數(shù)據(jù)被存入移位寄存器Ai和Bi中,然后使用4個(gè)乘法器陣列對(duì)權(quán)值和特征圖進(jìn)行乘法運(yùn)算,將計(jì)算值共享給加法樹進(jìn)行累加計(jì)算,最后的累加器負(fù)責(zé)將上一層的輸出的值求和,結(jié)果再經(jīng)過之后的非線性函數(shù)ReLU送到下一層。在計(jì)算的過程中不用等待當(dāng)前計(jì)算完成再獲取下一組數(shù)據(jù),而是在下一個(gè)時(shí)鐘周期繼續(xù)獲取數(shù)據(jù),構(gòu)成一個(gè)數(shù)據(jù)處理流水線。因此,整個(gè)卷積計(jì)算模塊具有高吞吐量,從而整體的數(shù)據(jù)處理速度也得到提高。
本文設(shè)計(jì)的池化模塊如圖5所示,通過5個(gè)for循環(huán)遍歷輸入通道、輸入特征圖長寬和卷積核大小,并可根據(jù)模型選擇三種池化方式。
圖5 池化運(yùn)算單元
平均值池化一般由輸入數(shù)據(jù)和一個(gè)系數(shù)恒定的系數(shù)乘加實(shí)現(xiàn),最大值和最小值池化由比較器實(shí)現(xiàn)。池化的步長為2,窗口尺寸為2×2,以類似滑動(dòng)窗口的方式來進(jìn)行池化操作。
本文進(jìn)行硬件設(shè)計(jì)使用的開發(fā)板是Xilinx公司的PYNQ-Z2,該開發(fā)板使用的是ZYNQ-7000 xc7z020clg400-1的FPGA芯片。實(shí)驗(yàn)中的硬件開發(fā)環(huán)境為Vivado 2019.1和Vivado HLS 2019.1。在通用的CPU平臺(tái)上用軟件實(shí)現(xiàn)了與FPGA完全一致的CNN模型,CPU采用的是Inter Core i5-8300H處理器,主頻為2.3 GHz,卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和執(zhí)行采用基于Python的Tensorflow 1.15框架。實(shí)驗(yàn)的測(cè)試數(shù)據(jù)集是MNIST數(shù)據(jù)集和CIFAR-10數(shù)據(jù)集。
通過PYNQ開源框架,用戶可以可直接在PYNQ-Z2上進(jìn)行開發(fā)和測(cè)試。本設(shè)計(jì)所采用的基于PYNQ的測(cè)試流程如下:
Step1 在Vivado開發(fā)環(huán)境中對(duì)設(shè)計(jì)的方案進(jìn)行綜合、布局布線、生成bit和tcl文件,給FPGA上電并啟動(dòng)。
Step2 給DDR存儲(chǔ)模塊加載網(wǎng)絡(luò)參數(shù)和數(shù)據(jù)集。
Step3 通過PYNQ進(jìn)行SoC編程,Overlay比特流,配置FPGA。
Step4 對(duì)測(cè)試集中的圖片進(jìn)行識(shí)別,識(shí)別完成后FPGA輸出識(shí)別結(jié)果,ARM處理器從PL端讀回測(cè)試結(jié)果,并通過IP網(wǎng)絡(luò)接口傳至上位機(jī)。
Step5 如果當(dāng)前批次中的圖片未處理完,則重復(fù)操作Step 4;如果測(cè)試完成,記錄識(shí)別時(shí)間并傳至上位機(jī)。
在文獻(xiàn)[15-16]中,使用16位定點(diǎn)數(shù)量化進(jìn)行模型壓縮導(dǎo)致的識(shí)別準(zhǔn)確率的下降范圍為0.02%~2.88%。不同批次下,本文采用數(shù)據(jù)量化的方法進(jìn)行模型壓縮后的準(zhǔn)確率如表4所示,在MNIST數(shù)據(jù)集下由數(shù)據(jù)量化引入的精度損失不超過0.6%,在CIFAR-10數(shù)據(jù)集下由數(shù)據(jù)量化引入的精度損失范圍是0.5%~1.4%。
表4 不同批次下準(zhǔn)確率對(duì)比
在批次為500的情況下,本文將數(shù)據(jù)量化后的參數(shù)代替原有的參數(shù)在軟件平臺(tái)進(jìn)行測(cè)試后發(fā)現(xiàn),對(duì)于MNIST數(shù)據(jù)集卷積神經(jīng)網(wǎng)絡(luò)的識(shí)別準(zhǔn)確率從98.6%降低到98.4%,對(duì)于CIFAR-10數(shù)據(jù)集卷積神經(jīng)網(wǎng)絡(luò)的識(shí)別準(zhǔn)確率由75.3%降低至74.2%,可見是由數(shù)據(jù)量化的使用導(dǎo)致了準(zhǔn)確率的下降。經(jīng)過FPGA實(shí)現(xiàn)后,兩個(gè)數(shù)據(jù)集的識(shí)別率仍為98.4%和74.2%,說明硬件實(shí)現(xiàn)并未導(dǎo)致新的識(shí)別精度的下降。
本次設(shè)計(jì)經(jīng)過綜合、布局布線后,Vivado 2019.1給出的資源使用情況如圖6所示,圖中列出了LeNet-5模型在MNIST數(shù)據(jù)集和CIFAR-10數(shù)據(jù)集下FPGA的資源使用情況。
圖6 FPGA資源消耗
通過對(duì)FPGA資源使用情況分析可以發(fā)現(xiàn),BRAM、LUT和DSP48乘法器是本設(shè)計(jì)占用率比較大的資源。由于本文使用的方法是將權(quán)值參數(shù)全部放在片上BRAM中,特征圖的值存儲(chǔ)在基于LUT的存儲(chǔ)模塊上,所以對(duì)于BRAM和LUT的資源使用率非常高。對(duì)于乘法部分運(yùn)算邏輯全部使用的DSP資源。可以看出,本設(shè)計(jì)對(duì)資源的利用率很高。
由于文獻(xiàn)[17-20]并未給出功耗及性能指標(biāo),對(duì)于功耗方面,本文按照對(duì)比文獻(xiàn)中的時(shí)鐘頻率和資源使用率,使用Xilinx Power Estimator(XPE)得出其FPGA的運(yùn)行功耗;對(duì)于性能方面,本文按照文獻(xiàn)[21]中的關(guān)于計(jì)算量的公式對(duì)其進(jìn)行了計(jì)算以方便對(duì)比,CNN中的計(jì)算量指的是輸入一張圖像,CNN網(wǎng)絡(luò)模型進(jìn)行一次完整的前向傳播所發(fā)生的浮點(diǎn)運(yùn)算次數(shù),也即模型的時(shí)間復(fù)雜度,單位為FLOPs。而GFLOPS是指每秒十億次浮點(diǎn)運(yùn)算的次數(shù),表示計(jì)算的速度,與GOPS近似相等,是一種衡量硬件性能的指標(biāo),所以本文使用GFLOPS來進(jìn)行性能分析。單個(gè)卷積層的計(jì)算如公式(5)所示:
FLOPs=2×Ho×Wo×K2×Cin×Cout。
(5)
式中:Ho、Wo表示每個(gè)卷積核輸出特征圖的高度和寬度;K表示每個(gè)卷積核的邊長;Cin表示每個(gè)卷積核的通道數(shù),也即輸入通道數(shù);Cout表示本卷積層擁有的卷積核數(shù),也即輸出通道數(shù)。
對(duì)于全連接層,浮點(diǎn)運(yùn)算次數(shù)計(jì)算公式如下:
FLOPs=2×I×O。
(6)
式中:I表示全連接層輸入維度,O表示輸出維度。
根據(jù)表5列出的實(shí)驗(yàn)結(jié)果,本文的硬件工作平臺(tái)FPGA的工作頻率為100 MHz,識(shí)別每張圖片的時(shí)間為MNIST數(shù)據(jù)集2.067 ms和CIFAR-10數(shù)據(jù)集4.98 ms,且功耗僅為1.6 W左右。識(shí)別時(shí)間在Jupyter notebook中可視化的時(shí)間損耗為計(jì)算時(shí)間,包括網(wǎng)絡(luò)部署時(shí)間、Python腳本解釋器初始化時(shí)間、內(nèi)存?zhèn)鬏斠约扒跋騻鞑サ臅r(shí)間。
表5 相關(guān)工作比較
此外,通過本次設(shè)計(jì)的板級(jí)測(cè)試,得到系統(tǒng)的性能等數(shù)據(jù)與其他文獻(xiàn)的對(duì)比,如表5所示。文獻(xiàn)[17-20]與本文設(shè)計(jì)比較類似,均研究了在FPGA上實(shí)現(xiàn)小型網(wǎng)絡(luò)的加速方案,文獻(xiàn)[17-18]使用的是MNIST數(shù)據(jù)集,文獻(xiàn)[19-20]使用的是CIFAR-10數(shù)據(jù)集。通過比較,文獻(xiàn)[17]使用的數(shù)據(jù)精度更低,但本文在單幀時(shí)間、功耗及性能方面更優(yōu)。文獻(xiàn)[18]在單幀時(shí)間及性能方面均優(yōu)于本文設(shè)計(jì),但其使用了1 180個(gè)DSP,使用的DSP數(shù)量約是本文設(shè)計(jì)的9.2倍,但在性能方面僅為本設(shè)計(jì)的1.9倍,本文在單位DSP的性能貢獻(xiàn)方面優(yōu)于該文獻(xiàn)。文獻(xiàn)[19]雖然在功耗方面與本文相近,但是本文在性能方面為其15.7倍,能效比方面為其15.5倍。文獻(xiàn)[20]使用了32位浮點(diǎn)數(shù),其單幀時(shí)間、性能和能效比方面都不如本設(shè)計(jì)。綜上所述,本文設(shè)計(jì)的FPGA加速方案具有更好的綜合性能。
表6為本文設(shè)計(jì)所使用的開發(fā)平臺(tái)與同等網(wǎng)絡(luò)結(jié)構(gòu)下CPU和GPU性能對(duì)比。由表6可知,本設(shè)計(jì)實(shí)現(xiàn)的FPGA加速器功耗僅為文獻(xiàn)[22]中CPU和GPU的5.8%和6.6%,性能方面相比也有較大的提升。
表6 與CPU、GPU的比較
為了解決目前硬件設(shè)備上實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)資源有限和功耗過大問題,本文提出了一種基于流水線架構(gòu)的卷積神經(jīng)網(wǎng)絡(luò)加速器架構(gòu)。該架構(gòu)針對(duì)CNN網(wǎng)絡(luò)的結(jié)構(gòu)設(shè)計(jì)卷積計(jì)算策略,并在FPGA平臺(tái)上量化了網(wǎng)絡(luò)參數(shù),解決了卷積神經(jīng)網(wǎng)絡(luò)需要大量FPGA資源進(jìn)行計(jì)算的問題。為了優(yōu)化內(nèi)存,本文提出了一種CNN各層輸入即輸出的工作方式,各層IP按照流水線的方式工作,大大提高了數(shù)據(jù)交互效率。本設(shè)計(jì)在xc7z020上實(shí)現(xiàn)了LeNet-5,實(shí)驗(yàn)結(jié)果表明,與LeNet-5在CPU、GPU和其他FPGA平臺(tái)中的實(shí)現(xiàn)相比,本文提出的方法保持了準(zhǔn)確率,節(jié)省了資源,降低了功耗,對(duì)資源和功耗有限的平臺(tái)實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的加速具有重要意義。
為了進(jìn)一步提高FPGA加速器的性能,后續(xù)的研究方向主要集中在探索模型壓縮的算法并設(shè)計(jì)更大更復(fù)雜的加速器,提升FPGA硬件架構(gòu)的通用性。