電子科技大學(xué)電子科學(xué)與工程學(xué)院 周 航 賀雅娟
近年來(lái),卷積神經(jīng)網(wǎng)絡(luò)(CNN)在機(jī)器視覺(jué)等方面取得了巨大成功。為提升嵌入式設(shè)備上運(yùn)行CNN的速度和能效,本文針對(duì)LeNet-5網(wǎng)絡(luò)模型,先對(duì)該網(wǎng)絡(luò)模型進(jìn)行感知量化訓(xùn)練,特征圖和權(quán)重量化為8位整型數(shù)據(jù)。然后設(shè)計(jì)一種卷積神經(jīng)網(wǎng)絡(luò)加速器系統(tǒng),該片上系統(tǒng)(SoC)采用Cortex-M3為處理器,所提出的系統(tǒng)處理一張MNIST圖像所需時(shí)間5.3ms,精度達(dá)到98.2%。
CNN已成功應(yīng)用于圖像識(shí)別等應(yīng)用,隨著CNN解決更復(fù)雜的問(wèn)題,計(jì)算和存儲(chǔ)的需求急劇增加。然而,在一些低功耗的邊緣計(jì)算設(shè)備中,功耗是重要指標(biāo)。目前的研究主要針對(duì)CNN推理階段模型的壓縮和量化。大多數(shù)設(shè)計(jì)都用定點(diǎn)計(jì)算單元代替浮點(diǎn)單元。ESE采用12位定點(diǎn)權(quán)重和16位定點(diǎn)神經(jīng)元設(shè)計(jì),Guo等在嵌入式FPGA上使用8位單元進(jìn)行設(shè)計(jì)。但之前的設(shè)計(jì)主要采用Zynq或者HLS開(kāi)發(fā),功耗較大。
本文設(shè)計(jì)了一種基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)加速系統(tǒng)。首先,通過(guò)感知量化訓(xùn)練的方法,實(shí)現(xiàn)了將浮點(diǎn)CNN模型的各層權(quán)重和特征圖量化成8比特整型;其次,通過(guò)采用單層時(shí)分復(fù)用的方式,設(shè)計(jì)流水線架構(gòu)提高數(shù)據(jù)吞吐率;再次,設(shè)計(jì)基于Cortex-M3的SoC;最后,采用MNIST手寫數(shù)字進(jìn)行方案和功能驗(yàn)證。
LeNet-5是一個(gè)典型的卷積神經(jīng)網(wǎng)絡(luò)模型,不包含輸入一共有7層。分別為3層卷積層,2層池化層,以及2層全連接層。
針對(duì)目前CNN模型較大,參數(shù)多且不適合在移動(dòng)設(shè)備上使用,Google團(tuán)隊(duì)提出了一種量化方案。該方案在推理過(guò)程中使用純整。量化方案是量化整數(shù)q到實(shí)數(shù)r的映射,如公式(1)所示:
其中常數(shù)S和Z是量化參數(shù)。S表示比例系數(shù),是一個(gè)任意的正實(shí)數(shù)。Z表示零點(diǎn)。CNN中主要的操作,比如卷積層的卷積,以及全連接層的乘累加,都可以看成是矩陣乘法。考慮實(shí)數(shù)兩個(gè)N×N的矩陣r1和r2的乘積r3=r1r2。將每個(gè)矩陣ra的項(xiàng)表示為ra(r,j),其中1≤i,j≤N,用qa(r,j)表示量化項(xiàng),根據(jù)矩陣乘法的定義,得到:
乘以浮點(diǎn)數(shù)M,可以轉(zhuǎn)化成先乘以定點(diǎn)數(shù)M1,再進(jìn)行右移n+31。
將公式(2)中所有零點(diǎn)Z1,Z2,Z3都設(shè)為0,可以大大簡(jiǎn)化推理階段的運(yùn)算。另外將偏置加法和激活函數(shù)合并到其中。比例系數(shù)Sbias=S1S2,零點(diǎn)Zbias=0。由于選用的激活函數(shù)是ReLU,所以只需要將結(jié)果鉗位到[0,255]。
本系統(tǒng)采用CPU+FPGA的架構(gòu),包括AHB互聯(lián)矩陣、Cortex-M3處理器、DMA、緊耦合存儲(chǔ)器、雙端口緩存、AHB2APB橋和CNN加速器,如圖1所示。
圖1 系統(tǒng)框圖
存儲(chǔ)器部分包含ITCM,DTCM和雙端口RAM。ITCM存放程序鏡像文件;DTCM作為堆棧區(qū);Dual RAM作為權(quán)重?cái)?shù)據(jù),輸入特征圖,以及中間、最終結(jié)果緩存區(qū),一端連接L1級(jí)總線,CPU和DMA均可以訪問(wèn),另一端連接CNN加速器。
CNN加速器設(shè)計(jì)的整體結(jié)構(gòu)如圖2所示,并行方案采用輸出通道和權(quán)重卷積核內(nèi)部并行,同時(shí)計(jì)算6個(gè)輸出通道,以及卷積核25個(gè)乘法器同時(shí)計(jì)算。
圖2 CNN加速器整體結(jié)構(gòu)
特征圖行緩沖的窗口尺寸為5x5,可以通過(guò)數(shù)據(jù)選擇器選擇輸入特征圖的寬度。權(quán)重特征圖的行緩沖設(shè)計(jì)同理,由于卷積核均為5x5,所以不需要數(shù)據(jù)選擇器。
乘累加陣列輸入為25個(gè)8位特征圖和25個(gè)8位權(quán)重,對(duì)應(yīng)相乘后采用加法樹(shù)方式累加,最后得到1個(gè)位寬為21的有符號(hào)數(shù)。
偏置加法器用于累加偏置或者中間結(jié)果。選擇哪一個(gè)是由數(shù)據(jù)選擇器控制,輸出一個(gè)32位結(jié)果。
量化激活模塊包含一個(gè)32x32位的乘法器,用于將累加結(jié)果和乘法系數(shù)相乘,再經(jīng)過(guò)右移,鉗位到[0,255],經(jīng)過(guò)四舍五入得到量化的結(jié)果。
池化模塊設(shè)計(jì)思路同卷積模塊,采用最大池化。包含3個(gè)比較器和一個(gè)行緩沖,針對(duì)不同層可以選擇不同長(zhǎng)度的特征圖,窗口尺寸為2x2。
本文采用的FPGA是Xilinx公司的Artix-7XC7A200T芯片,開(kāi)發(fā)環(huán)境為Vivado 2018.3。卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練和推理采用Pytorch 1.7.1。實(shí)驗(yàn)的數(shù)據(jù)集是MNIST數(shù),CNN模型采用LeNet-5。
本文的SoC工作的頻率為100MHz,識(shí)別一張MNIST圖片的時(shí)間為5.3ms,F(xiàn)PGA的功耗由Vivado的Report Power工具獲得,僅為0.448W。本文處理單幀的時(shí)間比較長(zhǎng),但是功耗是其他文獻(xiàn)的四分之一。由于采用感知量化,識(shí)別正確率FPGA實(shí)現(xiàn)和軟件實(shí)現(xiàn)一致,達(dá)到98.2%。實(shí)驗(yàn)結(jié)果對(duì)比如表1所示。
表1 實(shí)驗(yàn)結(jié)果對(duì)比
結(jié)論:為了解決嵌入式設(shè)備上實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)速度慢和功耗大的問(wèn)題,本文提出了一種卷積神經(jīng)網(wǎng)絡(luò)加速系統(tǒng)。首先對(duì)卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行感知量化,得到8比特的權(quán)重、特征值和量化參數(shù)。采用Cortex-M3作為處理器設(shè)計(jì)片上系統(tǒng),大大降低了功耗。本設(shè)計(jì)在Artix-7 Xc7a200T上實(shí)現(xiàn)了LeNet-5。通過(guò)MNIST數(shù)據(jù)集,實(shí)驗(yàn)結(jié)果表明本設(shè)計(jì)保持了準(zhǔn)確性,降低了功耗。