謝思璞,魏榕山
(福州大學 物理與信息工程學院,福建 福州 350108)
近年來,神經網絡受到了廣泛熱議,成為了學術界和工業界的熱門議題,Google、Microsoft 和Facebook 等科技公司都建立了相關的研究小組,以探索CNN 的新架構[1-3]。通過對CNN 架構上的創新改善CNN 性能,利用空間和通道信息,結構的深度和寬度以及多路徑信息處理等方法引起了廣泛的討論。
在眾多新型CNN 架構中,基于寬度擴展的多支并行的CNN 得到了國內外學術屆的重視。KAWAGUCHI K等人提出網絡的寬度是影響網絡精度與準確度的一個重要指標[4]。通過在層中并行使用多個處理單元,可以得到比感知器更為復雜的映射。GoogLeNet 中的Inception模塊是一種典型的多支網絡架構,并使用了不同尺寸的卷積核[5]。2017 年,DEL COCO M 等人[6]利用多分支結構引入了并行的多尺度分析,減小了神經網絡的深度,克服了過擬合問題。拓寬網絡寬度的多支并行卷積神經網絡在圖像分割以及識別等任務中,提高了網絡在不同尺度上的特征提取能力,受到了國內外研究機構的重視[7-9]。
如今,基于FPGA 的卷積神經網絡加速器獲得越來越多的關注[10-13],目前大多數都以切片的方式,映射至加速器中逐一計算。如果使用相同配置的加速器對多分支網絡進行加速,傳統映射多分支網絡計算會造成硬件資源的浪費。沒有針對各分支網絡進行差異化資源分配,多分支卷積神經網絡在進行時的并行效率也無法得到保證,這對整體網絡模型計算將造成影響。本文分析和探討了多分支卷積神經網絡的性質和特點,并基于屋頂模型進行設計空間的探索[14],設計出一種多分支卷積神經網絡加速器。
本文將以應用于HEVC 視頻編碼的幀內劃分的多分支卷積神經網絡ETH-CNN 為例,分析與探究多支卷積神經網絡在參數差異影響下的硬件資源優化問題[15]。如圖1 所示,該網絡由三支卷積神經網絡協同工作,各分支的卷積神經網絡經過降采樣層、卷積層和全連接層后輸出。

圖1 ETH-CNN 圖示
由于各分支卷積層的輸入特征圖尺寸不同,那么各分支網絡卷積層的計算量也不同。以ETH-CNN 的各分支網絡參數(如表1 所示)進行比較,經計算后的結果可以看出各分支的操作數相差甚大,各分支網絡在進行并行計算所需的I/O 帶寬以及硬件資源的分配需求不一樣。使用相同的加速器對多分支網絡進行加速,各卷積層將依次調用加速器進行計算,由于支與支之間卷積存在數據依賴,這將對整體網絡模型計算造成影響。為了提升整體算力,為多分支并行卷積神經網絡專門定制一種加速平臺提供高性能計算是非常有必要的。
本文將選擇在卷積核的輸入輸出尺度上進行循環拆分,拆分的因子為Tm、Tn。外部的循環則負責調度,主要的作用是控制數據從外部DDR 加載至FPGA 的BRAM 緩沖區,將BRAM 數據寫入外部DDR,同時控制數據的復用。內部的循環則負責生成FPGA 卷積計算單元。設計的卷積計算單元的并行度為Tm×Tn,并行Tm計算單元,每個計算單元中進行Tn輸入數據與權重的乘累加操作,累加操作中采用加法樹結構進行累加。在本設計中利用卷積計算在輸入通道和輸出通道之間的獨立性,采用流水線操作,進一步加大系統的吞吐量。
為了實現高并行度,神經網絡加速器通常在大量計算單元之間重用數據。在本設計中,將數據路由到不同的計算單元,從而降低系統計算延遲,為此采取了“前-后-前”的調度模式,從而使輸入數據可以獲得更大的數據復用機會。原先輸入數據讀取遵循切分先后,調整后的訪問的次數將比原先少(Tn-1)次,從而可以減小數據的冗余訪問。在輸出復用的調度中,由于輸出的結果數組與輸入通道循環沒有相互依賴性,因此可以將寫入外部DDR 的輸出結果操作置于輸入通道循環外。此時,計算單元無需先從外部DDR 讀取上次的輸出結果。輸出結果的中間值直接存儲在片上的BRAM 上,本次計算無需上一次的計算結果,直接從BRAM 上讀取數據進行累加,從而可以將輸出數據的訪問次數減少。
在本設計中,還將采用雙緩沖機制,兩塊片上的緩存以乒乓機制進行數據的讀取,從而可以讓數據的傳輸時間被計算單元的計算時間所覆蓋,使計算單元一直處在工作狀態,提高系統的吞吐率。

圖2 加速器計算單元

圖3 雙緩沖機制
由于多支卷積神經網絡計算是同時進行的,計算和存儲訪問行為將變得更加復雜。在加速器的設計中,可以利用屋頂模型來解決多支網絡模型和硬件平臺相關的優化問題。為了并行化循環的執行,將循環展開,在硬件上并行化計算單元。硬件上并行化的參數稱為unroll參數。展開參數選擇不當可能會導致嚴重的硬件未充分利用。以單循環為例,假設循環的循環邊界為M,并行度為m。硬件的利用率受的限制。
多支卷積結構已在先前給出。本文為三支CNN 都設計了并行度不同的計算單元。在進行一層計算時,三個計算單元同時并行執行,而對層與層之間的計算,則共用同一加速器,即加速器中含有三個并行的加速單元,分別對應三支的CNN,而這個加速器是層與層之間的共用模塊。根據上文設計的卷積計算單元,分別對應三支CNN 輸入輸出通道的拆分因子〈Tm,Tn〉進行討論。從整個系統層面上來看,每次卷積的執行周期與分支網絡中執行周期最大的一支密切相關。
加速器的峰值性能的計算公式如式(1)所示。其中total operations 為多分支卷積神經網絡計算總操作數,execution cycles 為加速器的執行周期,而在多分支CNN加速器中,卷積層的總執行周期與分支網絡中執行周期最大的一支密切相關。CTC Ratio 是單位內存訪問可以執行的操作數,total data access 為片上計算的外部數據訪問量。在多分支CNN 加速器中,可以通過之前介紹的數據復用設計,降低對片外訪存的次數,從而提高系統的CTC Ratio。

確定了多分支網絡的并行策略后,要針對各項因素設立約束條件。由于加速器的計算峰值受到FPGA 片上DSP48E 計算資源的限制,因此其設計空間的限制條件為式(3)。此外,加速器的CTC Ratio 受到FPGA 片上BRAM的限制,所以其存儲空間的限制條件為式(4)。

此外,也需要對循環展開的利用率進行約束,避免系統運行時出現過多的硬件資源處于空閑狀態導致了硬件平臺的資源浪費,對系統執行效率造成負面影響。為此,對各分支網絡的循環展開利用率進行閾值約束,設α 為循環展開利用率,為其設定循環展開利用率閾值,舍去利用率值低的循環展開因子。

而在多分支卷積神經網絡執行過程中,雖然整體系統的執行周期以各分支中執行周期最長的卷積神經網絡為基準。但是,為了協調各分支卷積神經網絡層與層之間的計算與數據的交換,對分支網絡各卷積層的執行時間進行約束。根據式(6)可知,可以通過各分支計算操作數與展開因子作為評估條件,控制各分支網絡中最快執行周期與最慢執行周期的卷積神經網絡差值,保證整體執行效率處于最優效果。

通過以上提出的峰值和CTC 率的計算方法,可以在屋頂模型中對不同的拆分因子〈Tm,Tn〉對系統造成的影響進行量化以及比較,采用枚舉算法可以直觀地在屋頂模型中看到設計的性能優劣。圖4 中的每一個點都代表三組拆分因子〈Tm,Tn〉,在FPGA 有限的資源和設計空間限制下對所有的合法的設計進行了枚舉,從圖中可以直觀地看到每個設計所能達到的計算峰值、CTC 率以及當前系統各分支并行度,每個點代表的是各分支網絡潛在展開因子。所有的設計被FPGA 平臺所能提供的計算峰值和帶寬所限制,即圖中的計算屋頂和帶寬邊界。

圖4 枚舉模型
由于本次設計的卷積計算單元是各卷積層之間通用的,即各分支的卷積層重復調用其特定的計算單元,因此需要統一的拆分因子。根據以上提出的方法,表1中列出了對于每個層來說最優的解。根據執行的周期數,在本設計中對所有的有效設計進行了枚舉以找到優化的全局拆分因子。

表1 每層最優解及統一拆分因子
圖5 是所設計的基于FPGA 的多支卷積神經網絡加速器系統。由于FPGA 芯片的片上SRAM 不足以存儲所有權重及輸入輸出數據,因此采用DDR 和片上存儲器的兩級存儲器層次結構,DDR4 DRAM 作為外部存儲器,用來存儲CNN 的輸入輸出數據及權重。

圖5 加速器整體架構
通用CPU 用于初始化基于FPGA 的加速器和執行時間的測量,通過AXI4Lite 總線配置FPGA 邏輯中的DMA,從而調度加速器的運行,控制數據傳輸的大小與格式。FPGA 中的DMA 則通過AXI4 總線讀取外部存儲DDR中的數據。為了提高數據的傳輸速率,DMA 與加速器之間的接口為FIFO,進行數據的順序訪問,無需地址的判斷。由于是三支網絡同時進行計算,因此并行了三個計算單元,UART模塊將加速器返回的結果傳送到主機。
為了評估本文的優化策略,通過前面介紹的ETH-CNN模型在FPGA 平臺上構建多分支CNN 加速器,并在FPGA上實現。系統設計使用Xilinx 公司的ZCU102 開發板進行驗證,芯片型號為XCZU9EG-2FFVB1156,FPGA 的工作頻率為200 MHz。作為對比,PC 平臺使用的是Intel i5-8300H CPU,主頻為2.3 GHz,并采用相同的網絡結構及測試數據進行仿真驗證。實驗結果如表2 所示。

表2 計算時間對比
最終的多分支CNN 加速器包含3 個加速單元,各單元并行計算不同分支的卷積輸出。輸入數據、輸出數據以及權重數據的接口綜合為使用基于AXI 總線的HP 高性能接口,采用的是Scatter-gather模式的DMA。當三支并行加速時,總的資源利用率如表3 所示。

表3 多分支卷積神經網絡加速器FPGA 資源利用率
此外,由于ETH-CNN模型較小,運算量約為0.56 MOP,因此在FPGA 上實現的吞吐量有限。因此,也通過GoogLe-Net 的Inception3a 結構來評估本文提出的多分支加速器映射方式,并與先前工作進行了比較。LCP[18]通過模型參數和數據位置差異將其按層簇的方式進行劃分,并行于FPGA 的不同分區實現加速。本文方法以支為界限劃分,將不同分支的卷積神經網絡映射至FPGA 上并行執行,通過資源互補,采取不同的展開因子來配比各分支網絡。從表4 中可以看出,在32 bit 的測試基準下,本文的工作取得了更有效的優化,取得了257.01 GOPS 的性能表現,性能為先前方法的1.31 倍。

表4 性能評估
本文提出了一種基于FPGA 的多分支CNN 加速器的綜合設計及優化方法。在給定多分支CNN模型和FPGA 平臺下,鑒于加寬CNN 的結構導致的計算量增大,數據流更為復雜,針對并行網絡進行更仔細的優化以及調度。利用屋頂模型進行了設計空間的探索,充分運用FPGA 中的資源,進行并行性設計和流水線設計。實驗結果表明,本文的工作相比先前方法進一步提升了31%,取得了更有效的優化。