狄新凱,楊海鋼
(1.中國科學院空天信息創新研究院,北京100094;2.中國科學院大學,北京100049)
近年來,卷積神經網絡(Convolutional Neutral Network,CNN)模型[1-2]在計算機視覺、自動駕駛、自然語言處理等任務場景中得到廣泛應用,但CNN 拓撲結構復雜、計算密集且參數規模大,這對硬件系統的計算能力造成極大的壓力。研究人員通過分析CNN 算法特性,發現算法模型的權重參數和特征圖參數均具有稀疏化特征。稀疏化特征說明算法在前向運算的過程中會出現大量“0”參與的無效運算操作。如果在計算系統中只運行非“0”元素參與的有效操作,那么算法模型的計算量就能大幅減少。然而,傳統針對CNN 的并行加速器[3-5]或數據流優化[6]通常只適用于稠密矩陣運算,并不能在實際意義上減少操作數。因此,需要針對稀疏性做優化處理,以探索稀疏神經網絡硬件加速器。
對于稀疏化的神經網絡加速問題,學術界已有部分研究。文獻[7-8]考慮權重數據的稀疏特征,所提方法的核心思想均是用特定的壓縮格式來存儲和傳輸權重,同時在電路中加入索引模塊,利用壓縮格式中的索引信息定位與非零權重相對應的特征值,進而只計算有效權重參與的運算操作。文獻[9-10]考慮特征圖數據的稀疏特征,所提方法的核心思想是在計算單元中加入判定模塊,如果遇到值為0 的特征圖點,則跳過該次運算。此外,也有相關研究同時利用特征圖稀疏性和權重稀疏性來避免無效運算,如文獻[11]利用笛卡爾乘作為基本的操作來實現卷積,然而在該計算流程中,每個計算單元都需要設計復雜的坐標索引模塊,并且中間結果較多,對緩存造成了很大壓力。文獻[12-13]基于ASIC 為特征圖和權重建立二進制掩碼索引,然后通過對兩者做“與”(AND)操作,選出有效值進行運算,但是此類方案需要額外線上動態地對特征值建立索引信息。文獻[14-15]方法則是針對因特定結構化剪枝方式而造成的有規律的稀疏特征。此外,學術界大量工作集中在基于ASIC 對稀疏化全連接層做加速,關于稀疏化的卷積層加速研究較少。
本文研究稀疏神經網絡卷積層的計算數據流,基于現場可編程門陣列(Field Programmable Gate Array,FPGA)器件設計新的加速器硬件系統。根據特征圖數據和權重數據的數據特點,設計邏輯處理模塊從兩者中篩選出有效的數據參與運算。在此基礎上,利用FPGA 器件特點研究邏輯處理模塊并行操作的整體架構,并根據器件參數和模型參數的約束探索最佳設計參數。通過在Xilinx 軟硬件平臺上實現具體的稀疏化VGG 模型,驗證本文方案的有效性和優越性。
卷積神經網絡是一種前饋網絡,包含由卷積層和子采樣層構成的特征抽取器以及由全連接層組成的分類器。在卷積層中,有多個卷積濾波器(卷積核)掃過該層的特征圖像做卷積操作得到下一級特征圖,如式(1)所示,卷積濾波器中的參數即為參與運算的權重。式(1)的基本變量和參數在表1 中做詳細說明。


表1 卷積層參數定義Table 1 Definition of parameters in convolutional layer
實際上,子采樣層和全連接層也可以看作是特殊的卷積層統一到式(1)的表述中,例如全連接層就是卷積濾波器大小等于上層特征圖大小的卷積運算,每個卷積濾波器做卷積運算的結果對應全連接層的一個神經元。
在本文中,CNN 網絡的稀疏度定義為卷積濾波器矩陣以及特征圖矩陣中零值的比例。一方面,利用特征圖和權重參數的稀疏化特性可降低參數規模,進而減小系統存儲壓力;另一方面,設計硬件電路避免稀疏矩陣中“0”參與的運算,可降低運算代價,進而提高實時性。
神經網絡中特征圖和權重的稀疏性分析如圖1所示。權重的稀疏性主要來源于剪枝優化技術,該技術被證實可以在保證神經網絡精度的前提下有效地壓縮模型。以文獻[16-18]為代表的研究發現,訓練時根據特定的規則將權重參數中不重要的值剪除(即置為0),不會損壞模型的識別精度。

圖1 權重剪枝優化及激活產生的稀疏性分析Fig.1 Analysis of sparsity by weight pruning optimization and activation
此外,特征圖的稀疏性主要來源于激活函數ReLU,因為ReLU 將卷積操作的中間結果中非正值均置為0。以VGG16 網絡為例,文獻[17]實驗結果表明,卷積層中特征圖0 值點的比例最多可以達到80%,平均比例也在50%以上。與權重稀疏性不同,特征圖的0 值點都是運行時獲取且依賴于輸入圖像數據,而前者在訓練后便成為可線下分析的靜態數據。
在本文的設計中,神經網絡卷積操作計算流程簡化示意圖如圖2所示,共有N組C×K×K的卷積核在C×W×H的特征圖上滑動(示意圖中僅展示一組)。卷積層參數有輸入特征圖(Xc,w,h)和對應的權重濾波器(Fc,w,h)以及輸出(Yn,w,h)。在每組運算中,先做C通道間向量-向量乘,得到K×K個中間結果后再進行累加,產生最終輸出特征圖點。

圖2 卷積操作簡化示意圖Fig.2 Simplified schematic diagram of convolution operation
在數據稀疏的情況下,K×K個邏輯模塊負責篩選出輸入特征圖和權重均為有效值的位置,然后傳輸給乘累加器(Multiplication Accumulator,MACC)。在基于FPGA 的設計中,通常采用片上DSP 來完成這項工作。圖3為K=3時3×3個通道間向量-向量乘計算操作,其中每個方格代表1 對有效的特征圖和權重數據,需要做1 次有效計算。在圖3 中,假設每個邏輯模塊后接了2 個DSP,則這組運算占用5 個cycle 時間。

圖3 通道間向量-向量乘計算操作示意圖Fig.3 Schematic diagram of vector-vector multiplication calculation operation among channels
對權重訓練和剪枝后,使其成為固定的數據,在此基礎上,可以在線下對權重進行分析并以壓縮格式存儲和傳輸。如圖4所示,采用二維掩碼Mask 的格式對權重進行索引,每組卷積核共有K×K個lbC位寬的權重索引數據。特征圖數據是動態數據,需要線上實時產生,因此,處理方式為線上實時判斷。

圖4 權重數據及其Mask 索引Fig.4 Weight data and its Mask index
本文基于FPGA 器件設計稀疏神經網絡加速器,其整體架構如圖5所示。

圖5 稀疏神經網絡加速器整體架構Fig.5 Overall architecture of sparse CNN accelerator
在圖5 中,特征圖和權重通過FPGA 的AXI4 接口從片外傳入片上緩存,然后片上緩存再將數據傳入處理模塊(Processing Unit,PU)。為利用FPGA的并行特性,多個PU 在輸入特征圖的橫向尺寸W、縱向尺寸H和輸出通道N方向做并行操作,因此,共有PW×PH×PN個PU 單元參與運算。每個處理模塊承擔C通道K×K尺寸的輸入特征圖與其對應的權重做卷積以及通道間累加的計算工作,從而產生某一輸出通道的輸出特征圖點。由于輸入特征圖和權重的稀疏特性,PU 會主要通過邏輯單元來提取出有效的值參與運算。PU 單元得到的結果通過輸出特征圖緩存,并且同樣通過AXI4 接口輸出到片外。
每個PU 需要進行有效數據提取和計算工作,圖6 為處理單元PU 的具體結構。

圖6 處理單元的具體結構Fig.6 Detailed structure of the processing unit
如上文所述,在本文設計的加速器中,每個PU單元實現C×K×K個乘加運算。首先,每個K×K尺寸的輸入特征與其對應權重的運算操作分到K×K個計算單元中;然后,每個計算單元做C通道乘累加操作得到中間輸出;最后,將所有中間輸出通過加法樹得到最終輸出結果。
計算單元的設計是稀疏神經網絡加速的核心,需要達到選取有效數據參與運算的目標。圖6 右半部分為計算單元的結構圖。對于特征圖向量,由于通過比較器判斷是否為有效值(非零值),因此輸出值i為0 或者為1。本文設計未采用文獻[13]為特征圖數據建立二維掩碼索引的方案,因為建立索引的工作除了必要的有效值判斷,還要對索引數據進行存儲、傳輸等操作。C通道的權重Mask 索引可以使用lbC位寬的定點數Ik,k來表示(右側圖中使用的索引為I2,2)。每判斷一個特征圖點,會有局部計數器來輸出計數count。有效地址判定器模塊獲取i、I2,2和count 值并執行邏輯運算sign3=(I2,2>>count)&i。該運算的功能是判斷權重和特征圖點是否同時為有效值。邏輯計算的結果反饋給控制單元,控制單元會提取有效的輸入值給后端的乘累加單元。在FPGA 器件中,乘累加單元采用片上DSP 資源來實現。計算單元的結果會輸出到加法樹做最后的累加。
需要注意的是,做計算單元內部的并行,計算單元后端可以占用多個DSP 模塊,假設為α 個。因此,DSP 資源的占用量DDSP可以根據以上討論做預估,如式(2)所示:

其中:PW×PH×PN是指PU 陣列中PU 的個數;K×K是指PU 內部計算單元的個數,該值是固定的且這些計算單元中的DSP 除了計算輸入通道方向最后幾個數,在多數情況下不會出現“閑置”狀態;α值與模型數據的稀疏特征有關,該值的獲取將在下文進行討論。
片上緩存采用的是FPGA 片上BRAM 資源,主要考慮存儲塊劃分和數據復用這2 點。存儲塊劃分借鑒了文獻[19],核心思想是盡量將計算過程中需要并行獲取的參數值放到不同的BRAM Bank 中。表2 是根據該思想對特征圖矩陣和權重矩陣在各個維度上的劃分情況,表中的數字是指該維度下需要并行獲取的數據個數。例如輸入特征圖緩存的寬度方向,PU 每次需要同時獲取(PW+K-1)個數參與運算,那么該維度的數據可以平均分配到(PW+K-1)個BRAM 單元中。

表2 BRAM 存儲器劃分情況Table 2 Partition of BRAM memory
數據復用主要是為了減輕片上-片外傳輸的帶寬壓力,在滿足存儲塊上述劃分規則的情況下將盡量多的數據緩存在片上。以權重參數為例,片上PU陣列每批次運算需要K×K×PN×α個BRAM 單元,當該批次運算計算完成后,依然希望這些數存儲在片上,以便于在輸入特征圖窗口滑動到下個位置時再復用這些數據。因此,添加一個與K×K×PN×α相乘的參數χweight來表征復用情況。
綜上所述,根據表2 以及數據復用的考慮預估出片上BRAM 資源的占用情況,如式(3)所示:

需要注意的是,式(3)中輸出特征圖的復用參數χout是根據χin和χweight來確定的。
本文加速器系統的設計參數有PW、PH、PN和α,這些參數都與并行操作相關。由2.2 節和2.3 節可知,加速系統共有(PW×PH×PN)×(K×K)個計算單元并行操作。α的值則與算法模型參數的稀疏化特征有關:α越大,并行操作的計算單元之間需要等待的時間會越短,但是DSP 模塊的閑置越嚴重;α越小則相反??梢酝ㄟ^小規模實驗實現不同α參數下的處理模塊來確定最佳的設計參數。假設某卷積層參數為<W=224,H=224,C=64,N=64>,本文在具有不同數量DSP 的3 個典型的Xilinx 器件上實現單個PU,可獲取的計算性能(GOPS)的計算如式(4)所示:

其中:λ表示在C方向上權重和輸入特征圖的的稀疏程度,實踐中一般為20%~50%;I和L分別表示對PU做流水線優化后的啟動間隔(Initiation Interval,III)和啟動延遲(Initiation Latency,IL),它們均通過實驗獲得;f表示頻率,設置為200 MHz。
初步實驗結果如圖7所示,可以看出,在不同的稀疏度情況下,PU 中的每個計算單元α取1 或者3 可以達到最佳的性能。需要注意的是,對于不同的器件和不同算法模型,以及同一算法模型中的不同層,均可使用該方法預估最佳性能。

圖7 不同α 參數下處理單元的計算性能Fig.7 Computational performance of processing unit under different α parameters
本文實驗在GPU 平臺訓練了VGG16[20]網絡并使用文獻[16]的方法進行剪枝和再訓練,最終采用的神經網絡卷積層參數稀疏情況如表3所示。在Xilinx 硬軟件環境下實現卷積層前向推理的加速,硬件平臺為Xilinx Zynq XC7Z045,軟件環境為Vivado HLx(v2018.3)。對于功耗,本文使用Xilinx 的Xpower工具給出評估結果。根據前文中的分析,設計參數設置為:PW=2,PH=2,PN=8,α=3,χin=2,Zweight=2。

表3 VGG16 卷積層稀疏情況Table 3 Sparsity of convolutional layer of VGG16 %
表4 統計了最終的實驗結果中FPGA 內部資源的使用情況。從中可以看出:LUT 占用量達到了93%,這是因為PU 為了處理稀疏的數據而增加了邏輯單元模塊,這些邏輯單元模塊主要都是由LUT 來實現;同時DSP 的數目達到了占比最多,這是因為硬件單元充分考慮了并行。

表4 實現VGG16 FPGA 的內部資源使用情況Table 4 Statistics of FPGA resource usage when implementing VGG16
計算性能和功耗比實驗結果如表5所示,其中,本文設計的加速器對卷積層加速的總體性能為678.2 GOPS,性能功耗比為69.45 GOPS/W。此外,表5 也展示了本文方案與其他方案的比較結果,從中可以得出以下結論:

表5 性能與功耗指標實驗結果及對比Table 5 Performance and energy efficiency experiment results and comparison
1)與稠密神經網絡的FPGA 加速器的對比:與使用相同器件的文獻[3]方案相比,本文計算性能和性能功耗比分別達到了它的2.9 倍和2.8 倍;與文獻[4,6]方案相比,本文DSP 的使用量約為它們的60%,但卻在計算性能指標上表現更優秀;與文獻[5]方案相比,按每個DSP 可以達到的GOPS,計算性能基本一致,但是本文方案的性能功耗比較文獻[5]方案低。
2)與稀疏神經網絡的FPGA 加速器的對比:文獻[7,14]均使用了ZCU102 平臺,本文DSP 使用量分別是它們的75%和64%,計算性能指標上本文與它們相比分別有2.1 和1.3 倍的提升;在性能功耗比上則分別有5.3 和2.3 倍的提升。
本文提出一種針對神經網絡模型的稀疏化卷積層FPGA 硬件加速器。設計稀疏數據處理單元避免無效計算,同時通過提高多個處理單元的并行度和探索最佳設計參數提高計算性能。在Xilinx 平臺上的實驗結果表明,本文設計能夠有效提高稀疏化卷積層的實現性能和性能功耗比。下一步將對稀疏神經網絡做軟硬件協同優化:在軟件方面,在剪枝過程就預先考慮硬件并行的需求,做面向硬件的平衡剪枝;在硬件方面,使用已有的并行、流水線等技術,將平衡剪枝后模型映射到FPGA 上。