劉建梁,袁賢珍
(1.天津天瞳威勢電子科技有限公司,天津300384;2.中車株洲電力機(jī)車研究所,株洲412005)
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neutral Network,CNN)作為人工神經(jīng)網(wǎng)絡(luò)的延伸,是第一個真正成功訓(xùn)練多層網(wǎng)絡(luò)結(jié)構(gòu)的學(xué)習(xí)算法,被廣泛用于機(jī)器視覺、人工智能等領(lǐng)域[1]。
在卷積神經(jīng)網(wǎng)絡(luò)推理運算中,卷積運算為計算密集型運算[2]。由于卷積計算量龐大,需要設(shè)計與計算量相匹配的加速器。圖形處理器(Graphic Processing Units,GPU)、現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)、專用集成電路(Application Specific Integrated Circuit,ASIC)是常用的神經(jīng)網(wǎng)絡(luò)加速器。在這些加速器中,F(xiàn)PGA 憑借它的高度并行計算、低功耗、可重復(fù)編程的特點而被廣泛采用[3]。
本文受全并行轉(zhuǎn)置型FIR 濾波器結(jié)構(gòu)的啟發(fā),將這種結(jié)構(gòu)應(yīng)用在加速卷積神經(jīng)網(wǎng)絡(luò)卷積運算的FPGA設(shè)計中。在此結(jié)構(gòu)基礎(chǔ)上,使用Xilinx DSP Slice 的INT8 優(yōu)化技術(shù),最終使設(shè)計在運算速度和電路面積上都得到了優(yōu)化。
卷積神經(jīng)網(wǎng)絡(luò)卷積層由若干卷積單元組成,完成對圖像特征的提取,卷積運算也是該網(wǎng)絡(luò)中計算量最大的部分。典型的卷積運算示意圖如圖1 所示。
圖1 卷積運算示意圖
卷積層中的每個神經(jīng)元與上一層的局部感受感受野相連進(jìn)行像素的加權(quán)求和,其計算公式如式(1)。
式中,Xjl表示第l 層中的第j 個特征圖;Xil-1為上一層的特征圖的輸入;Wlij為卷積核的權(quán)值。卷積核窗口按照一定的步長在特征圖上滑動,每滑動一次產(chǎn)生一個卷積運算結(jié)果。當(dāng)卷積核窗口滑動至行尾時,會向下移動一行并從左側(cè)行始開始新的一行卷積,直到完成整幅圖像像素的卷積運算。可以發(fā)現(xiàn),參與卷積運算的像素之間是獨立進(jìn)行計算的,并沒有前后依賴關(guān)系,這就為FPGA 流水線并行結(jié)構(gòu)設(shè)計帶來了可能[4]。
DSP48E1 Slice 是Xilinx 7 系列FPGA 中的運算單元,乘法、乘加和乘累加是其最顯著的功能,DSP48E1結(jié)構(gòu)示意圖如圖2 所示。
圖2 DSP48E1結(jié)構(gòu)示意圖
從圖2 可知,DSP48E1 內(nèi)部集成1 個25 位的預(yù)加器和1 個25×18 的乘法器,A 和D 是預(yù)加器的輸入,B是乘法器的輸入,INT8 優(yōu)化技術(shù)就是利用預(yù)加器和乘法器,同時處理兩個并行的INT8 乘法。
為了能并行計算A*B 和D*B,A 和D 之間要進(jìn)行特殊的編碼,既要保證高位不影響低位的計算,也要做到低位計算對高位的任何影響必須可檢測、可恢復(fù)[5]。具體編碼方法是把D 左移16 位后與A 相加,如圖3所示。參考文獻(xiàn)[6]提出了將(D<<16+A)*B 的結(jié)果分離出A*B 和D*B 方法,這里不再贅述。
圖3 預(yù)加器輸入A和D的編碼方式
有限長單位沖激響應(yīng)濾波器(Finite Impulse Response 濾波器,F(xiàn)IR 濾波器)是數(shù)字信號處理系統(tǒng)中的基本元件,在通信、圖像處理、模式識別等領(lǐng)域有著廣泛的應(yīng)用。全并行轉(zhuǎn)置型FIR 濾波器本質(zhì)上也是FIR濾波器,只是從FPGA 硬件實現(xiàn)的角度,具有全并行和轉(zhuǎn)置的特點。全并行是指依據(jù)輸入信號的并行數(shù)據(jù)流而設(shè)計,每個時鐘會得的一個輸出響應(yīng);轉(zhuǎn)置是相對于全并行直接型FIR 濾波器而說的,采用流水線技術(shù)和重定時技術(shù),在直接型結(jié)構(gòu)的基礎(chǔ)上進(jìn)行了轉(zhuǎn)置[7]。以抽頭數(shù)為3 的全并行轉(zhuǎn)置型FIR 濾波器為例,系統(tǒng)轉(zhuǎn)移函數(shù)如式(2):
濾波器結(jié)構(gòu)框圖如圖4 所示,從圖4 可以看出該結(jié)構(gòu)的兩個特點:①所有濾波運算的乘法同時執(zhí)行;②所有抽頭系數(shù)共享輸入信號。如果輸入信號和抽頭系數(shù)都是8bit,這個結(jié)構(gòu)恰好可以使用INT8 優(yōu)化技術(shù)減少DSP的使用,用1 個DSP48E1 打包兩個相鄰的乘法器。
圖4 抽頭為3的全并行轉(zhuǎn)置型FIR濾波器結(jié)構(gòu)框圖
對于一個卷積核尺寸為3×3 的卷積運算,可以看作是3 個抽頭數(shù)為3 的FIR 濾波器分別濾波后再并行求和。這樣做的好處是可以充分發(fā)揮FPGA 的并行計算特點,每個時鐘周期完成一次卷積運算,同時能夠減少DSP 的使用,本設(shè)計硬件實現(xiàn)框圖如圖5 所示。
圖5 3×3卷積運算模塊設(shè)計
輸入特征圖是以逐行的方式進(jìn)入預(yù)緩存LineBuffer。由于LineBuffer 是由真雙端口RAM 構(gòu)成,在SAME 填充方式下,只需要預(yù)緩存特征圖的第一行,隨后生成列對齊的3 行特征圖像素,以數(shù)據(jù)流的方式流入乘法器,完成卷積運算。需要注意的是,由于對特征圖進(jìn)行了填充,當(dāng)卷積核移動到行首或者行尾時,需要額外的邏輯對乘法器的輸出進(jìn)行控制,保證卷積運算結(jié)果的正確。
在Zynq7000 平臺上對本設(shè)計進(jìn)行了驗證,實際使用6 個DSP48E1 Slice,結(jié)果符合預(yù)期。
本文基于全并行轉(zhuǎn)置型FIR 結(jié)構(gòu)和Xilinx DSP Slice INT8 優(yōu)化技術(shù),對量化精度為8 比特的卷積神經(jīng)網(wǎng)絡(luò)卷積運算模塊進(jìn)行了優(yōu)化設(shè)計,兼顧了卷積運算的速度和面積。對于k*k 的卷積核,需要占用DSP Slice 數(shù)量為ceil(k/2)*ceil(k/2),對卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計,具有很高的參考價值。