王帥帥, 陳 強, 郭劍博, 肖 昊
(合肥工業大學 微電子學院,安徽 合肥 230601)
卷積神經網絡(convolutional neural networks,CNN)具有良好的圖像特征提取功能,廣泛應用于圖像分類[1]、船舶識別檢測[2]和井下視覺識別[3]。 傳統卷積運算包含大量乘累加計算,使神經網絡模型部署至資源有限的現場可編程邏輯門陣列(field programmable gate array,FPGA)設備存在困難。 因此減少卷積計算中乘法次數和降低乘法計算位寬,將CNN高效部署至FPGA成為近年研究熱點。
在算法層面,Winograd[4]和快速傅里葉變換(fast Fourier transform,FFT)卷積算法[5]可減少卷積乘法次數,廣泛應用于CNN加速器設計。 目前網絡模型卷積朝卷積核尺寸小、數量多的方向發展,相比FFT算法,Winograd算法在縮減小尺寸卷積乘法次數方面更加高效[6]。 Winograd算法通過矩陣變換將卷積數據映射至Winograd域,使用加減法代替乘法,其點乘步驟為2個二維矩陣點乘,可高效映射至FPGA加速器的二維運算陣列,進行并行化處理,提升運算速度。
文獻[4]首次將Winograd算法應用于CNN模型,經實驗得小尺寸Winograd卷積算子的誤差更低,但文獻[4]的設計僅適用于步長1的卷積類型;文獻[7]設計適配Winograd算法和傳統卷積算法的數據流,提出統一架構進行FPGA實現,擴展加速器適用范圍,但轉置步驟需線下運算,轉置后數據需進行片上存儲,導致FPGA片內存儲器資源占用率高達90%;為擴展加速器適用范圍的同時減少片上存儲資源占用,文獻[6,8]使用卷積分解方法,使Winograd算法適用于不同類型卷積,且設計線上轉置模塊,減少片上卷積核存儲量。
文獻[9]設計統一計算單元,處理不同類型卷積并使用數據復用策略減少數據搬運次數;文獻[10]提出多模式可重構計算單元,提高計算資源利用率;文獻[11]將Winograd算法應用于航空目標檢測,進一步擴展算法的應用領域。 但上述設計存在量化后定點數據位寬與數字信號處理單元(digital signal processing,DSP)位寬失配的問題,使得FPGA的DSP利用率降低。
針對高效Winograd卷積加速器設計,為降低片上存儲資源占用率,本文采用線上轉置模塊,數據轉置后輸入運算單元處理,實現輸入數據復用且減少內存占用。
針對數據位寬失配問題,本文利用部分積切割方法,運算電路由DSP與查找表(look-up table,LUT)構成,緩解數據位寬失配,提高架構運算單元利用率。
低比特數據量化方法[10-14]將神經網絡模型浮點數轉為定點數,減少模型參數存儲量。 本文使用TensorFlow Lite[12]量化方法將神經網絡推斷過程浮點數運算轉為定點整數運算,并保證量化前后兩數值的相關性。 此方法為嵌入式設備和FPGA高效部署神經網絡提供便利。
CNN量化基本思路是將卷積浮點數運算轉為定點整數運算。 卷積運算中定點整數q與浮點數r的仿射變換關系為:
r=S(q-Z)
(1)
其中,S、Z為統計得出的常量。S的計算公式為:
S=(rmax-rmin)/(qmax-qmin)
(2)
正值參數S由模型訓練過程浮點數范圍與量化后定點數范圍比值得出,代表數值量化前后的比例,也稱比例因子。Z的計算公式為:
Z=qmax-(rmax/S)
(3)
若Z為定點小數,則四舍五入轉為定點整數。Z為浮點數零值對應量化后數值,也稱零點。 CNN模型每個激活層對應一組量化參數,每個卷積核輸出通道對應一組量化參數。
確定浮點數與定點數量化參數后,將卷積運算過程中運算步驟轉為定點數運算。 浮點數卷積運算為:
(4)
其中:r1為卷積核元素;r2為輸入特征圖元素;r3為卷積輸出特征圖。 將浮點數利用TensorFlow Lite量化方法,仿射變換為定點整數,即
(5)
M=S1S2/S3
(6)
由式(6)可得,除M外其余為定點整數。 將M統一為式(7),使CNN推理過程為整數運算,即
M=2- nM0
(7)
其中,n為量化后定點整數位寬。 硬件實現時,式(5)中定點小數由左移n位以及與定點整數M0相乘2個步驟運算。
CNN模型訓練結束后,統計得出卷積激活層和卷積核浮點數值范圍。 量化參數線下計算,神經網絡部署過程中量化參數由存儲器存儲。 CNN推斷過程為定點整數運算,簡化CNN模型卷積計算過程,利于嵌入式和FPGA設備部署工作。
TensorFlow Lite[12]方法量化后模型識別準確率符合網絡模型精度要求,見表1所列,將VGG16、MobileNetV1、MobileNetV2網絡模型量化[15]為8 bit定點整數后,模型精度僅下降3%。
CNN應用Winograd算法中二維卷積算子,二維算子由一維算子嵌套得出[4]。 本文采用二維Winograd卷積算子,即
U=GFGT
V=BTIinB
Oout=AT[U⊙V]A
(8)
其中:F、Iin分別為神經網絡卷積核與輸入特征圖;B、A、G分別為Winograd算法輸入轉置矩陣、輸出轉置矩陣、卷積核轉置矩陣。 輸出特征矩陣由中間結果矩陣U、V點乘并轉置得出。
轉置過程會產生誤差,本文選擇轉置矩陣由0、1、-1、1/2、-1/2構成的算子,文獻[4]實驗表明此類算子誤差數量級在10-5內,符合神經網絡識別精度要求。 本文選取3×3卷積核、4×4輸入塊及2×2輸出規模的Winograd卷積算子適配VGG16網絡模型,記為F(2×2,3×3),其轉置矩陣為:
(9)
F(2×2,3×3)卷積算子可用移位和加法操作實現,簡化硬件實現復雜度。 CNN輸入特征圖是大規模特征矩陣,Winograd卷積算子無法直接匹配運算。 因此采用切片方式[7,16]將輸入特征圖(input feature map,IFMAP)劃分為適配Winograd卷積算子的矩陣劃塊,最終將部分結果組合為輸出特征圖(output feature map,OFMAP),此結果與傳統卷積輸出等價。 卷積算子數據流如圖1所示。

圖1 Winograd卷積算子數據流
1) 本文采用F(2×2,3×3)卷積算子,輸入劃塊大小為4×4。 VGG16模型卷積步長為1且卷積核尺寸為3×3,3×3卷積窗口在4×4輸入劃塊進行2次水平滑動和2次垂直滑動,F(2×2,3×3)卷積算子每次輸出4個傳統卷積等價結果。 卷積核滑動步長為1,2個輸入劃塊間存在重疊部分,重疊長度為卷積核長度與滑動步長差值,本文設計為2。 按上述規則取輸入塊,先橫向提取首個輸入通道IC,再縱向提取。 劃塊占滿總寬度W和高度H,第1個輸入通道劃塊提取完成,其余通道按相同規則劃塊。
2) 單通道卷積核K尺寸為3×3,卷積核通道總量與對應特征圖輸入通道數相等,卷積核個數與輸出通道OC數量相同。 卷積核大小可適配本文所選F(2×2,3×3)卷積算子,無需預處理操作,與輸入特征圖劃塊匹配傳入Winograd卷積算子運算。
3) 輸入特征圖劃塊和卷積核進行輸入轉置、卷積核轉置、點乘和輸出轉置步驟。
4) 輸入特征圖與對應卷積核運算結果累加得到首個輸出通道特征圖。 每個輸出通道特征圖由F(2×2,3×3)卷積算子輸出的2×2特征矩陣構成,數量為(W/2)2。 輸出通道數量與卷積核個數相等。 卷積核與對應輸入特征圖運算結果聚集為輸出特征圖矩陣(如圖1)。 VGG16模型卷積步長為1,卷積核為3×3,單個傳統卷積計算需9次乘法,F(2×2,3×3)卷積算子運算包含4次傳統卷積,乘法總量為36。 使用Winograd算法計算F(2×2,3×3)卷積算子時,4×4輸入和3×3卷積核轉置后都為尺寸4×4的矩陣,然后兩矩陣對應點乘,需16次乘法計算,最后經輸出轉置過程得到與傳統卷積等價的2×2輸出。 本文使用Winograd算法運算F(2×2,3×3)卷積算子需16次乘法,相比傳統卷積的36次乘法,節約率達55.56%。
基于Winograd算法的神經網絡加速器系統架構如圖2所示,CNN模型處理部分由FPGA片上完成,數據存儲至片外動態隨機存取內存(dynamic random access memory,DRAM),兩者通過高級可擴展接口協議(advanced extensible interface,AXI)通信。 加速器由系統控制模塊、輸入緩存模塊、權重緩存模塊、維度轉換模塊、輸入轉置模塊、權重轉置模塊、運算處理單元(process element,PE)、輸出轉置模塊、最大池化模塊、量化模塊和輸出緩存模塊構成。 開發板上電啟動時,模型參數和圖片數據從安全數碼卡加載至DRAM中,數據準備完成后,CNN加速器開始工作。 每輪計算將部分輸入特征圖和權重數據通過AXI4總線接口傳入片上緩存單元,加速器循環處理剩余數據。

圖2 CNN加速器整體架構
硬件加速器工作步驟如下:
1) 輸入特征圖緩存用雙緩沖區策略[17],部分行數據預存至輸入緩存模塊,經維度轉換模塊后,二維輸入數據塊傳入轉置模塊線上轉置,輸入轉置模塊由加法器和移位寄存器構成,所用系數與輸入轉置矩陣中元素一致。
2) 權重緩存由256個片上隨機存儲器塊(block random access memory,BRAM)構成。 每周期提供256組輸入通道權重,每個運行周期可處理16個卷積輸入通道和16個輸出通道,與處理單元陣列規模對應,存儲塊可提供處理單元每個周期計算所需權重參數。
3) 輸入轉置模塊和權重轉置模塊將數據轉置,廣播至處理單元進行點乘運算。 每個處理單元由16個DSP與LUTs組成的乘法器組成,與本文 Winograd卷積算子所需16個乘法操作匹配。 本文二維處理單元每個運算周期執行一組點乘運算,相比一維計算單元縮短了等待周期,提高了加速器運行吞吐率。
4) 處理單元運算結果以二維形式廣播至輸出轉置模塊,進行輸出轉置,該模塊轉置矩陣如式(9)所示。 轉置后結果經通道累加后緩存,直至所有輸入通道卷積循環運算完成,得出最終累加結果。 輸出結果即為傳統卷積等價結果。 后經最大池化、量化模塊處理,通過AXI4總線接口傳至外部DRAM緩存,作為后續卷積層輸入特征圖數據。
卷積核參數經Winograd算法轉置過程,存儲容量增加。 為減少片上存儲資源開銷,本文采取線上轉置模塊[8]。 因為轉置過程需二維計算,所以將緩存一維數據轉為二維數據運算。
本文設計維度轉換模塊和雙緩沖區緩存模塊實現上述功能,維度轉換模塊由移位寄存器構成,如圖3a所示。F(2×2,3×3)卷積算子輸入劃塊為4×4且兩劃塊間重疊長度為2,輸入緩存模塊用行緩存且2組相鄰行緩存間共用2個緩存單元,此模塊可同時輸出4行數據對應劃塊縱向維度4,同時實現Winograd輸入劃塊的數據復用,如圖3b、圖3c所示。

圖3 移位寄存器數據流
移位寄存器完成輸入劃塊橫向維度4,以2個相鄰輸入塊為例,移位寄存器每周期接收2個輸入緩存的特征像素,并左移2位。 按此運行規則,2個等待周期后移位寄存器高4位,每周期輸出一組有效特征塊,與后續模塊組合完成全流水線運算。 一組移位寄存器輸出4列數據,4組相同移位寄存器輸出4行劃塊,共同輸出二維4×4特征劃塊。 根據F(2×2,3×3)卷積算子輸入特征塊重疊規律,設計輸入緩存模塊對數據進行垂直維度復用,維度轉換模塊實現水平維度復用數據。 片上內存占用率減少至58%。
經F(2×2,3×3)卷積算子轉置后,輸入特征圖和權重8 bit數據增加至10 bit,即乘數為10 bit定點整數。 DSP乘法器位寬為27×18,若直接用此乘法器,則造成乘法器與數據位寬失配,導致硬件資源乘法器利用率降低。
為解決定點數位寬與DSP乘法器失配問題,本文設計部分積切割方法,硬件由DSP和LUTs組合電路實現,最大化利用乘法器位寬,提升乘法器資源利用率。
數字信號處理器支持單周期操作,計算2個8 bit定點整數乘法[18],但8 bit輸入和權重數據經轉置過程后,位寬增加至10 bit,單個DSP無法計算2次乘法。 本文利用部分積切割方法,電路由LUTs擴展模塊與DSP構成,運算單元單周期可同時計算2次乘法,實現單周期多輸出功能。 DSP部分積劃分如圖4a所示,LUTs部分積劃分如圖4b所示,完成的乘法運算為:

圖4 部分積切割映射關系
MMult0=IW0=MMult0_P1+MMult0_P2+MMult0_P3,MMult1=IW1=MMult1_P1+MMult1_P2+MMult1_P3
(10)
其中:I、W兩乘數為10 bit;式(10)結果為20 bit。 本設計將10 bit權重劃分為8、2 bit 2個部分,2個8 bit權重部分與10 bit輸入乘法由DSP完成,2個2 bit權重部分與10 bit輸入乘法由LUTs組成擴展部分完成,乘法結果由部分積相加得出。
DSP與LUTs組合電路結構如圖5所示。 2 bit權重與10 bit輸入乘法由LUTs組成擴展單元計算,擴展單元的部分積運算由與門和寄存器實現。

圖5 DSP與LUTs組合電路結構
從圖5a可以看出,第1個擴展單元輸入卷積核0低2 bit,輸出相乘的2個部分積WW0-E0和WW0-E1。 從圖5b可以看出,第2個擴展單元輸出卷積核1低2 bit,輸出相乘的2個部分積WW1_E0和WW1_E1。 卷積核0乘法結果為W0對應的3個部分積之和,卷積核1乘法結果為W1對應的3個部分積之和。
從圖5c可以看出,DSP中乘法器和預加器組合計算2個乘法,2個乘數分別為8 bit權重與10 bit輸入。 將2個8 bit權重通過預加器拼接至乘法器27 bit輸入端,10 bit輸入低位補0后傳至乘法器18 bit輸入端,結果按輸出端口P所示規則截取,DSP輸出端口第8~25位為卷積核0的高8位與輸入相乘結果,DSP輸出端口第27~44位與第26位之和為卷積核1的高8位與輸入相乘結果。
此外,本文設計部分和加法器采用華萊士樹加法器,Compress 3-2使用全加器將3個部分積壓縮為2個部分進行加法,有助于縮短關鍵路徑延遲,減小電路建立時間違例概率,使系統運行穩定。
本文神經網絡加速器與中央處理器(central processing unit,CPU)和圖形處理器(graphics processing unit,GPU)平臺速度對比見表2所列。

表2 不同平臺速度對比
CPU和GPU平臺的軟件語言使用Python 3.7,機器學習庫為Pytorch 1.12,指令集架構為CUDA 11.7。 本文所用中央處理器和圖形處理器運行VGG16模型推理速度分別為640.11、65.87 ms。 本設計使用XCKU060 FPGA部署VGG16模型,工作頻率達180 MHz,推理階段卷積計算花費時間為19.12 ms。 相比Intel i5-4590 CPU和Nvidia GTX 1070 Ti GPU,本文硬件加速器卷積運算速度分別提升33.47、3.43倍。
本文將VGG16網絡模型部署至XCKU060開發板,并評估加速器性能。 仿真驗證和硬件實現EDA軟件為Vivado 2021.1。 構建開發板評估環境,測試數據和網絡模型權重數據預存至SD卡,開發板上電后控制器初始化系統,將測試數據和模型參數搬運至DDR。 其輸入數據與權重參數為量化后8 bit定點整數。 開發板片上資源利用率見表3所列。

表3 FPGA片上資源利用率
本文設計與近年來相關工作性能的對比見表4所列。

表4 VGG16模型加速器性能對比
文獻[6]使用大規模處理單元陣列提升硬件加速器吞吐量,使用DSP數量超出本文1倍,但Winograd卷積加速器[6]的性能僅比本文設計高0.11倍。 文獻[7]將Winograd算法數據流調整與傳統卷積數據流匹配,擴展加速器應用范圍,但文獻[7]計算數據位寬與硬件匹配度低,造成乘法器資源的效率僅為0.28。
文獻[9]利用卷積核尺寸為3×3的算子,使用統一轉置矩陣節約片上硬件資源。 但CNN加速器[9]選取8 bit定點數據,而設計中DSP無法高效利用低比特數據優勢。
文獻[11]使用乒乓操作提升DSP利用率,但是運算單元乘法器[11]輸入端的位寬為27 bit,其位寬占用率僅為59%。 本文通過輸入緩存模塊和維度轉換模塊對數據復用,減少數據搬移,使加速器處理卷積層的平均吞吐率達2.358×1012OPs。 此外,采用部分積切割方法,充分利用DSP輸入端的位寬,使CNN加速器每個DSP運算效率達109OPs,相比文獻[9]、文獻[11]分別提升了54%、29%。
本文面向FPGA硬件部署神經網絡模型,提出一種基于Winograd算法高效部署CNN模型的加速器架構。 利用Winograd卷積算法代替VGG16模型中傳統卷積算法,減少55.5%的乘法運算量。 通過將FPGA片上DSP與LUTs資源結合構成處理單元運算電路,實現部分積切割方法,具備單周期多輸出特點,解決數據位寬與乘法器失配問題,提高乘法器利用率和處理單元運行效率。 實驗結果表明,加速器運行VGG16模型卷積層的平均吞吐率和每個DSP運算效率分別為2.358×1012OPs和1.15×109OPs。