趙小強,姜晶菲,許金偉,竇 勇
(國防科技大學計算機學院,湖南 長沙 410073)
卷積神經網絡是一類包含卷積計算且具有深度結構的前饋神經網絡,通過權值共享減少網絡參數,通過卷積和降采樣獲得表征學習的能力。由于其優異的表征學習能力被廣泛應用于人工智能算法的特征提取。卷積神經網絡成為人工智能算法的主流,其在圖像分類[1,2]、目標識別[3 - 5]和視頻分析[6 - 8]等計算機視覺應用中均展現出了優良的效果。
隨著卷積神經網絡的廣泛應用,卷積神經網絡硬件加速器成為新的研究熱點。FPGA高性能、低功耗和可重構等優點使其成為實現卷積神經網絡加速器的高效平臺。目前基于FPGA實現的卷積神經網絡加速器,根據加速方法主要分為以下4類:第1類是通用矩陣乘法卷積神經網絡加速器[9 - 11],如Liu等[9]設計的2D/3D通用的可重構卷積神經網絡加速器;Ma等[10]設計的最大化資源利用率卷積神經網絡加速器。第2類是FFT卷積神經網絡加速器[12 - 14],如Zhang等[12]設計的采用FFT和OaA來減少卷積冗余計算,將頻域算法映射到基于OaA的高度并行的2D FFT卷積神經網絡加速器;Lin等[13]設計的嵌入式FFT的深度卷積神經網絡加速器。第3類是Winograd卷積神經網絡加速器[15 - 17],Winograd快速算法將特征映射到特定域來降低算法復雜度,如Lu等[15]設計的稀疏有效Winograd卷積神經網絡加速器;Wu等[16]設計的適應大步長卷積的Winograd卷積神經網絡加速器。第4類是算子定制卷積神經網絡加速器[18 - 20],如Liu等[18]設計的層間流水優化卷積神經網絡加速器;Kim等[19]設計的零值感知卷積神經網絡加速器。相比之下,通用矩陣乘法加速器將卷積轉化為矩陣乘直接進行計算,具有較好的通用性;FFT加速方法將空間域做卷積轉化為頻域做乘法,降低了算法復雜度,比較適用于卷積核尺寸較大的情況;Winograd加速方法通過線性映射使用加法運算替代乘法運算,降低了算法復雜度,主要適用于卷積核較小的情況;定制算子加速器根據算法特性優化體系架構充分挖掘算法并行性,具有很高的性能。這4類卷積神經網絡加速器體現了不同的設計思想,各有優勢,互為補充。整體來看,面向卷積神經網絡的加速器設計還有很大的探索空間,不同的設計理念使設計者采用不同的加速方法。本文采用將卷積計算轉化為通用矩陣乘法的加速方法,在不使用FFT和Winograd等快速卷積算法的情況下,對如何提高矩陣乘法計算性能進行探究。
基于FPGA實現的通用矩陣乘法卷積神經網絡加速器研究的重點和難點一方面在于提高乘累加計算陣列的利用率,以提高性能和資源利用率;另一方面在于增加通用矩陣乘法的靈活性,以擴展加速器的通用性。在卷積計算過程中,卷積的輸出通道數通常不是乘累加計算陣列行數的整數倍,因此產生的余數無法充分利用乘累加計算陣列,導致很大部分的乘累加計算資源處于空閑狀態。本文通過對不同卷積計算特點進行分析,得出可根據卷積輸出通道數除以乘累加計算陣列行數的余數,動態調整將卷積轉化為矩陣乘法的方法,充分提高乘累加計算陣列的利用率。
將卷積計算轉化為矩陣乘法是FPGA上一種高效實現。如圖1所示,卷積層權值W的大小為m×c×k×k,輸入特征圖X的大小為c×h×w,W與X進行卷積運算得到輸出特征圖Y,Y的大小為m×h×w。其中,m為卷積層卷積核的輸出通道數,c為輸入特征圖通道數,k為卷積核大小,h為輸入與輸出特征圖高,w為輸入與輸出特征圖寬,卷積運算的矩陣乘法方法將權值W壓縮為權值矩陣,將特征圖X壓縮并重組為特征圖矩陣,將權值矩陣與特征圖矩陣進行矩陣乘法,得到輸出特征圖Y的展開形式即輸出特征圖矩陣,完成卷積運算。為了詳細展示映射過程,如圖1所示,大小為3×3的64×3卷積核被映射到大小為64×(3×3×3)的重排權值矩陣。將屬于同一輸出通道的3個卷積核水平地展開以形成一行權重矩陣。同時,尺寸為32×32的所有3個輸入通道都映射到尺寸為(3×3×3)×(32×32)的重排特征值矩陣。每個通道中由第1卷積窗口覆蓋的所有特征值都在垂直方向上拉伸展開,以形成特征矩陣的第1列。可以通過沿列和行方向在特征上滑動卷積窗口來生成整個特征矩陣。重新排列后,將卷積轉換為通用矩陣乘法。矩陣乘法的結果是尺寸為64×(32×32)的輸出矩陣,這是輸出特征值矩陣。請注意,特征值矩陣中特征值的數量是輸入特征中特征值數量的k×k倍,因為在將卷積窗口跨特征值滑動時,每個特征值都被卷積窗口覆蓋了k×k次,因此復制了k×k次。

Figure 1 Mapping convolutions to matrix multiplication operations圖1 將卷積映射到矩陣乘法運算
將卷積轉化為矩陣乘法計算后,從圖1可以看出,權值矩陣的高為卷積層卷積核的輸出通道數,在乘累加計算陣列充足的情況下,輸出通道數決定了矩陣乘法的并行度。在卷積神經網絡中,不同卷積層輸出通道數變化很大,如典型的AlexNet卷積神經網絡5層卷積層的輸出通道數分別是96,256,384,384,256,VGG16中13層卷積層中輸出通道數分別為64,64,128,128,256,256,256,512,512,512,512,512,512。當為這2種卷積神經網絡設計的乘累加計算陣列行×高為256×32時,由于輸出通道和乘累加計算陣列之間余數的存在,AlexNet和VGG16分別會有3層與4層卷積計算無法充分利用乘累加計算單元陣列。為了解決這個問題,本文將根據卷積計算的特點,提出一種動態余數處理映射模型,以提高乘累加陣列的利用率。
由于卷積計算輸出通道數和乘累加計算陣列的行數之間余數的存在,往往導致無法充分利用乘累加計算單元陣列,造成了計算資源的浪費。下面將分析卷積計算的特點,充分挖掘滑動窗口的復用性,提出動態余數處理映射模型來提高產生余數情況下矩陣乘法的并行度。
卷積計算是一個包含7層循環和復雜數據復用的過程。數據復用包括特征值復用、滑動窗口數據復用、權值復用和輸出特征值復用,其中滑動窗口復用指的是滑動窗口覆蓋的特征值復用。如圖2所示,指的是一個輸入特征為5×5,卷積核為3×3,步長為1,填充為0的卷積計算過程。圖2a為滑動窗口在第1行的初始狀態,陰影部分為此時滑動窗口覆蓋的特征值;圖2b為滑動窗口滑動到第2行的初始狀態,陰影部分為此時滑動窗口覆蓋的特征值;圖2c為滑動窗口滑動到第3行的初始狀態,陰影部分為此時滑動窗口覆蓋的特征值。從前3個子圖觀察到3個滑動窗口覆蓋的特征值有重疊部分,即在滑動窗口行方向上存在特征值的復用,圖2d表示的是滑動窗口滑完整個輸入特征值時在行方向上的特征值復用。白色方塊部分的復用性為1,表明此行數據在滑動窗口行方向上僅使用1次,灰色方塊部分復用性為2,表明此行數據在滑動窗口行方向上使用2次;黑色方塊部分復用性為3,表明此行數據在滑動窗口行方向上使用3次。滑動窗口行方向的最多復用次數是由卷積核大小決定的,每行的復用次數是由該行在特征值中的位置決定的,比如當圖2中輸入特征值大小為224×224時,第1行與第224行的行復用性為1,第2行與第223行的行復用性為2,剩下的從第3行到第222行的行復用性均為3。

Figure 2 Sliding window reuse in convolution calculation圖2 卷積計算中的滑動窗口復用
在分析完滑動窗口復用性后發現,可以對卷積轉化為矩陣乘法的映射方法進行優化,在輸出通道數和乘累加計算陣列之間產生余數時,利用滑動窗口行方向的復用性,提高矩陣乘法的并行度。為此本文設計了定制的動態余數處理映射模型,圖3為帶有動態余數處理映射模型的加速器邏輯結構。

Figure 3 Accelerator logic structure with dynamic remainder processing mapping model圖3 帶有動態余數處理映射模型加速器邏輯結構
加速器由控制模塊、特征值緩沖、權值緩沖、特征矩陣先入先出FIFO(First Input First Output)緩沖、權值矩陣FIFO緩沖、乘累加計算MAC(Multiply ACcumulate) 陣列、輸出緩沖和特征值映射模型組成。控制模塊根據功能信號的變化控制整個加速器的數據流動;特征值緩沖用于緩存特征值;特征值映射模型用于將特征值緩沖中的特征值映射到特征矩陣FIFO緩沖中;權值映射模型與權值緩沖、權值矩陣FIFO緩沖相連,用于將權值由權值緩沖映射到權值矩陣FIFO緩沖中;權值緩沖用于緩存權值;特征矩陣FIFO緩沖用于緩存經過特征值映射模型處理后的特征值;權值矩陣FIFO緩沖用于緩存從權值緩沖傳輸的權值;乘累加計算陣列用于接收從特征矩陣FIFO緩沖和權值矩陣FIFO緩沖傳來的特征值和權值,完成卷積運算;輸出映射模型與MAC陣列、輸出緩沖相連,用于控制MAC陣列計算的卷積結果映射到輸出緩沖的方式;輸出緩沖用于存儲從乘累加計算陣列輸出的卷積計算結果。圖3中MAC陣列的規模為mr×mc,mr與mc分別為行寬和列高,下標r,c代表行和列方向,對應的特征值緩沖大小為mc+2*pody,2*pody為在列方向的填充數量。
卷積滑動窗口存在復用性,當輸出通道數和乘累加陣列行數產生余數時,可通過復用卷積滑動窗口行方向的數據復用,提高矩陣乘法的并行度。設卷積核行寬和列高相同時都用k表示,不同時用kx表示行寬,ky表示列高。卷積層輸出通道數和乘累加陣列行數產生的余數為R,通過動態余數處理映射模型可提高矩陣乘法的并行度n,則并行度可由式(1)得出:
(1)
如圖3所示,特征值映射模型與特征值緩沖、特征矩陣FIFO緩沖相連,用于將2*pady+mc個特征值緩沖中的特征值映射到mc個特征矩陣FIFO中。
特征值映射模型根據滑動窗口的復用性,動態生成特征值矩陣,具體步驟如算法1所示。
算法1動態生成特征值矩陣Xm
輸入:X。
輸出:Xm(Xm為X的矩陣形式)。
1.按照〈列-輸入通道-行〉的順序加載特征值,存儲到2*pady+mc個特征值緩沖中;
2.fori<特征值的行數Ix,i++
3.forj<輸入通道數Ic,j++
4.fort< 特征值的列數Iy,t++
5.do分塊存儲到2*pady+mc個特征值緩沖中
6.endfor
7.endfor
8.endfor
9. 將特征值緩中的特征值映射到特征值FIFO中;
10.fori< 卷積核kx+卷積步長s,i++
11.forj< 卷積核ky,j++
12.fort 13.do存儲到第t個FIFO中; 14.endfor 15.endfor 16. 得到特征值矩陣Xm; 17.endfor 18. 特征值按照余數執行并行度進入乘累加計算陣列計算; 19.ifn= = 1 20.并行進入mr行乘累加計算陣列 21.elseifn> 1 22.間隔ky×Ic拍,按照流水方式進入n×R行乘累加計算陣列 23.endif 如圖3所示,權值映射模型與權值緩沖、權值矩陣FIFO緩沖相連,用于將權值由權值緩沖映射到權值矩陣FIFO緩沖中。 權值映射模型根據滑動窗口的復用性,動態生成權值矩陣,具體步驟如算法2所示。 算法2動態生成權值矩陣Wm 輸入:W。 輸出:Wm(Wm是W的矩陣形式)。 1.按照〈列-輸入通道-行-輸出通道〉的順序加載權值,存儲到mr個特征值緩沖中; 2.fori< 輸出通道數Oc,i++ 3.forj< 卷積核行寬kx,j++ 4.fort<輸入通道數Ic,t++ 5.forq< 卷積核列寬ky,q++ 6.do存儲到第Oc%mr個權值緩沖中 7.endfor 8.endfor 9.endfor 10.endfor 11.將權值緩中的權值映射到權值FIFO中; 12.ifn= = 1 13.fori 14.do存儲到第Oc%mr個權值FIFO中 15.endfor 16.elseifn> 1 17.forj 18.fort 19.do存儲到第(Oc+t)%mr個權值FIFO中 20.endfor 21.endfor 22. 得到權值矩陣Wm; 23.endif 24.權值按照余數執行并行度n進入乘累加計算陣列計算; 25.ifn==1 26.并行進入mr行乘累加計算陣列 27.elseifn> 1 28.間隔ky×Ic拍,按照流水方式進入n×R行乘累加計算陣列 29.endif 如圖3所示,輸出映射模型與乘累加計算陣列、mc個輸出緩沖相連,用于控制乘累加陣列計算的卷積結果映射到輸出緩沖的方式。輸出緩沖采用了Ping-Pong設置,一個緩沖矩陣乘積的同時另外一個緩沖將緩沖的數據寫回到片外存儲。 輸出映射模型根據并行度n決定卷積結果輸出方式,具體步驟如算法3所示。 算法3動態余數輸出映射算法 輸入:Yi,mc列的第i個卷積結果。 輸出:Y。 1.ifn= = 1 2.fori 3.do將第i個Yi并行存入第i個輸出緩沖中; 4.endfor 5.elseifn> 1 6.間隔ky×Ic拍,按照流水方式寫入第i個輸出緩沖中 7.endif Figure 4 Heterogeneous processor architecture design圖4 異構處理器架構 本文在XILINX VC709 FPGA開發板上實現了一個異構處理系統來評估動態余數處理映射模型。VC709芯片具有的資源為3 600個DSP Slice,1 470個BRAM和433 200個LUT。如圖4所示,該異構系統包含一個RISC-V CPU和一個基于動態余數處理映射模型的推理加速器。RISC-V CPU和卷積神經網絡加速器通過指令總線連接。RISC-V CPU面向通用性,主要處理神經網絡中一些非線性激活、調整大小、計算殘差等,加速器主要加速計算復雜度占比高的卷積層。CPU和加速器以串行方式工作,為了在CPU和加速器之間交換數據,內存控制器DDR SDRAM通過分離的數據總線連接CPU和加速器。 實驗設計的加速器乘累加計算陣列大小是128×16,卷積計算的數據格式采用16位浮點數。權值緩沖為128個深度為2 048的片上BRAM,權值矩陣FIFO緩沖也為128個深度為2 048的片上BRAM,特征值緩沖為20個深度為2 048的片上BRAM,特征值矩陣FIFO緩沖為16個深度為2 048的片上BRAM,輸出緩沖采用Ping-Pong機制,為32個深度為512的片上BRAM。片上緩沖大小的設置可根據FPGA提供的片上存儲資源進行調整,為了使加速器能夠支持參數量巨大的網絡模型,本文借鑒了Liu等[9]的卷積層分割策略,在卷積層的輸入通道數過多或者卷積核比較大的情況下,將卷積層的輸入通道分為若干個較小的輸入通道,以滿足權值對存儲空間的需求。在完成所有較小卷積層計算后,通過逐元素累加獲得較大卷積層的結果。雖然卷積層分割后會使加速器的計算性能下降,但是保證了加速器的通用性,能夠更好地適應人工智能算法的變化。 表1列出了加速器的硬件資源利用率,加速器消耗的DSP Slice數量為2 048,使用了將近57%的可用DSP Slice。加速器使用了542個BRAM,而這些BRAM不到可用BRAM的37%,RISC-V CPU使用了290個BRAM,這是由于RISC-V CPU中采用了大容量數據高速緩存和指令高速緩存,即使如此總共才使用了不到57%的BRAM。結果表明,本文設計的異構結構可以充分利用計算資源,而僅占用了很少的內存資源。 Table 1 Accelerator resource utilization表1 加速器資源利用 實驗選擇VGG16卷積神經網絡模型進行測試,VGG16 包含的13層卷積層輸出通道分別為64,64,128,128,256,256,256,512,512,512,512,512,512。實驗將不使用動態余數處理映射模型和采用動態余數處理模型情況下卷積層的結果進行了對比,由于后面11層余數全為0,計算效果一樣,實驗選擇第3層作為代表,對比結果如表2所示。采用動態余數處理映射模型在余數為64的情況下,最大能夠100%利用乘累加陣列,而未采用動態余數處理映射模型時最大僅能使用50%的乘累加計算陣列,在余數為0的情況下,是否采用動態余數處理映射模型乘累加計算陣列最大利用率均為100%。由此可得出采用動態余數處理模型能夠更好地適應不同的卷積計算特點。 Table 2 Multiply-and-accumulate array utilization表2 乘累加計算陣列利用率 表3中列出了VGG16網絡模型在CPU和FPGA上的運行結果對比。從吞吐率性能上看,本文設計的加速器比CPU稍低,比CPU低的主要原因是頻率比較低,另外加速器的數據緩沖容量較小也降低了吞吐量。相對于XILINX VC709[21]中的吞吐量有了4倍多的性能提升,雖然計算資源使用的DSP Slice數量是XILINX VC709[21]中的2倍多,但計算效率還是有很大的提升。主要是更加靈活的矩陣乘法使得乘累加計算陣列的利用率更高了,而且隨著乘累加計算陣列規模的擴大,本文的加速器計算效率優勢會更加明顯。從性能功耗比看,本文中的加速器達到了最優的4.08,分別是CPU和XILINX VC709[21]的5.6倍和3倍。 Table 3 Performance comparison表3 性能對比 本文從體系結構角度出發,通過FPGA實現了一個異構系統為人工智能算法提供高性能計算。加速器采用一種動態余數處理映射模型來處理輸出通道和乘累加計算陣列之間產生的余數問題,并通過實驗驗證了該映射模型的效率。實驗結果表明,該動態映射模型能夠極大地提高產生余數時乘累加資源利用率,達到了更高的吞吐率和能量效率。3.5 權值映射模型
3.6 輸出映射模型

4 實驗評估
4.1 硬件資源利用率

4.2 乘累加計算陣列利用率

4.3 與其他平臺性能對比

5 結束語