蕭嘉樂,梁東寶,陳弟虎,粟 濤
(中山大學電子與信息工程學院,廣東 廣州 510275)
近些年來,深度卷積神經網絡DCNN(Deep Convolutional Neural Network)模型在分類和識別任務上具有遠超傳統算法的正確率,被廣泛應用于機器視覺領域。而FPGA由于可定制的并行邏輯和相對較高的能耗效率,在加速DCNN任務方面具有一定優勢。在大多數基于FPGA的DCNN實現中,有2個主要研究方向:一是實現的FPGA盡可能地去適配不同網絡架構。文獻[1]嘗試通過參數化設計來為所有可能的網絡實現一個通用的計算結構。二是針對某一個網絡結構進行深度優化,文獻[2,3]探索了適用于具有殘差模塊網絡的新的映射策略,例如ResNet和Xception。
本文針對的是嵌入式領域的硬件加速器應用,MobileNet網絡以其低計算量和參數量被廣泛用于嵌入式領域,但MobileNet網絡的計算特點使其對現有的加速器(文獻[4,5])利用率不高,具體表現在比較難達到硬件所具有的理論峰值性能,而嵌入式領域硬件資源往往有限,這個問題急需解決。還有一點,嵌入式領域的硬件資源差異較大,針對MobileNet網絡的加速器還需要具備一定的可伸縮性,即針對不同的資源限制,都能獲得較高的利用率。
本文的主要貢獻有:
(1)設計了一個具有一定可伸縮性的MobileNet硬件加速器結構,對于0~4 000的乘法器開銷都能保持70%以上的計算效率。
(2)在加速器結構上實現了基于MobileNet的Hourglass網絡,最終的計算效率高于其他MobileNet網絡加速器的。
本文的組織如下所示,首先介紹了深度可分離卷積和MobileNet網絡的背景知識;接著描述加速器結構,主要包括計算陣列和片上緩存器;再接著探索了該加速器架構的設計空間;然后給出了加速器性能的實驗分析與對比;最后是總結。
深度可分離卷積首先是在文獻[6]中提出的。在這種卷積中,標準的卷積操作被拆分為2個步驟:逐層卷積和逐點卷積。逐層卷積首先在不同通道的輸入特征圖上分別提取特征,然后進行逐點卷積,以1×1卷積的方式組合不同通道中的結果。標準卷積、逐層卷積和逐點卷積之間的差異如圖1所示。其卷積輸入的特征值的行數為H、列數為W、輸入通道數為IC,經過卷積窗口為K×K的卷積后,輸出通道為OC。

Figure 1 Comparison of three kinds of convolution圖1 3種卷積方式的對比圖
文獻[7]證明,深度可分離卷積具有較少的權值和卷積運算,同時可獲得與標準DCNN網絡相當的精度。考慮到一般使用的標準卷積核為3×3,那么深度可分離卷積的權值量和計算開銷均會是標準卷積的1/9~1/8。
本文主要研究MobileNetV2網絡,該網絡以其低權值存儲和計算開銷同時還能保持高識別準確度被應用于嵌入式領域。其計算過程可抽象為表1所示的步驟。其中,CONV為標準卷積,IRB(Inverted Residual Bottleneck)為倒殘差瓶頸;模塊avgpool為平均池化操作,t為縮放系數,c為輸出通道數,n為重復次數,s為步進。

Table 1 The structure of MobileNetV2
MobileNetV2網絡的主要組成部分是倒殘差瓶頸模塊,其是由深度可分離卷積衍生而來的,具體操作過程如圖2所示。

Figure 2 Procedure of two kinds of inverted residual bottlenecks圖2 2種倒殘差瓶頸模塊操作過程圖
以通道數c為32,縮放系數t為4為例,對于s=1的模塊,需要進行1次擴張層計算(逐點卷積),再通過1次特征提取計算(逐層卷積)和1次壓縮層計算(逐點卷積)。這個過程中特征值通道會先擴張至32×4再壓縮至32,最后將原始輸入旁路與計算結果相加得到一個倒殘差瓶頸模塊的計算結果。而s=2的模塊只是少了旁路相加這一部分。
圖3顯示了高效可伸縮MobileNet加速器的結構,在加速器中,控制模塊通過AXILite總線從嵌入式處理器接收控制指令,并將其轉換為加速器中其他模塊的內部控制信號。并行計算陣列負責堆疊式沙漏網絡的所有計算。緩存器模塊負責外部存儲器和片上緩存器之間輸入特征值和權值以及輸出結果的傳遞。數據聚集-發散模塊作為特征值、權值緩存與外部存儲之間的橋梁,充當著類似直接內存訪問的工作。

Figure 3 Block diagram of the accelerator system圖3 硬件加速器結構圖
特征值數據具有3個維度,分別是行、列和通道??紤]一個維度為x×x×x的特征值塊,傳統的行優先數據排列(這意味著數據首先沿行方向排列,然后依次沿列和通道方向排列,如圖4a所示,其中序號表示其在特征值緩存中的排布順序)適用于通道分離的逐層卷積,而在MobileNet網絡中,逐點卷積在整個計算中占據了很大一部分。逐點卷積對來自不同通道的特征圖進行卷積,并一次生成一幅特征圖。此時若仍使用行優先數據排列則會由于輸入不連續,給逐點卷積帶來數據獲取上的困難,降低計算效率。為了解決這些問題,本文使用通道優先的排布方式(這意味著數據首先沿通道方向排列,然后依次沿行和列方向排列,如圖4b所示)。在本文設計的硬件加速器中片上緩存器和片外存儲所儲存的權值、特征值數據均以通道有限的排布方式存在,而行優先的數據排列只會存在于并行計算陣列的計算過程中,這會在第3.3節中詳細介紹。

Figure 4 Two kinds of data arrangement圖4 2種數據排布方式示意圖
針對MobileNet網絡基本結構為1次逐點卷積、1次逐層卷積和再一次逐層卷積的特點,本文使用的計算陣列結構如圖5所示,其中CVA(ConVolution model A)計算陣列適用于第1層的逐點卷積;CVB(ConVolution model B)計算陣列適用于第2層的逐層卷積;CVC(ConVolution model C)計算陣列適用于第3層的逐點卷積。

Figure 5 Structure of the convolution-layer parallel computing array圖5 卷積層級并行計算陣列結構圖
(1)CVA計算陣列。
該模塊用于加速計算倒殘差瓶頸模塊中的膨脹層。如圖5所示,該計算陣列的并行計算有3個維度:同時滿足Ccalca個計算通道的并行計算;每個計算通道內滿足La行特征值的并行計算;而每個計算行中滿足Nmulta個輸入通道的同時計算(這是由于逐點卷積計算過程中是優先進行通道間的卷積的)。所以,CVA的最小堆疊單元為并行的Nmulta個乘法器與1個Nmulta輸入1輸出的加法樹。還需要注意的是,該計算陣列的輸入數據格式是通道優先的數據排布,而輸出格式是行優先的數據排布,以保證后續逐層卷積的數據讀入的連續性。
(2)CVB計算陣列。
該模塊用于計算倒殘差瓶頸模塊中的逐層卷積模塊(通道分離的3×3卷積)。與CVA計算陣列類似,CVB計算陣列也可以分為計算通道Ccalcb、計算行數Lb和并行乘法數Nmultb3個維度。不同的是,在該模塊中,最小堆疊單元被固定為并行的3個乘法器與3輸入1輸出的加法樹,這是由于每個時鐘周期CVB模塊都能從CVA模塊的輸出獲取3行1列的特征值,因此CVB模塊若要完成1次3×3卷積則需要3個周期。此外,最小單元還需要添加行緩存模塊,這是由于3×3卷積計算帶來的行相關性,需要將本行計算需要的1或2行特征值緩存以用于下一行計算。而在數據排布方面,CVB模塊輸入的數據是按照行優先的方式排布,而輸出的數據是按照通道優先的方式排布。
(3)CVC計算陣列。
該模塊用于加速倒殘差瓶頸模塊中的最后一層逐點卷積,整體結構上與CVA模塊相似,其區別是該層的數據輸入是按照通道優先的方式排布,輸出也是按照通道優先的方式排布。
(4)ADD累加陣列。
ADD累加陣列用于處理倒殘差瓶頸模塊中的支路殘差求和部分。該陣列只有2個并行維度:并行計算通道數Ccalc和并行計算的行數LADD。ADD陣列的最小單元是1個二輸入的加法器。該陣列的計算不改變數據排布方式,均為通道優先的排布方式。
(1)標準卷積。
如圖1所示,標準卷積的操作實際上可拆分為1次逐層卷積和1次逐點卷積,其中需要考慮這2層卷積的權值。逐層卷積可直接沿用標準卷積中的權值,而對于逐點卷積權值,則需要生成對應的0-1矩陣來代表不同計算通道之間的累加。標準卷積的過程則可以映射到以上計算陣列中的CVB和CVC模塊。
(2)ReLU激活操作。
ReLU操作使用的是f(x)=max(0,x)函數,在網絡中是可選的,該過程僅在計算單元輸出階段將負數結果替換為零。
(1)乒乓權值緩存器。
權值緩存器使用乒乓緩存機制處理,即將權值緩存器分為等大的2個部分:權值緩存器0和權值緩存器1,如圖6所示。當其中一個從外部存儲讀取權值時,另一個緩存器可作為計算陣列的輸入,以此將從片外讀取權值的時間隱藏在計算時間內,提高計算效率。
(2)分時復用的特征值緩存器。
特征值緩存器同樣被分割為2個大小相同的可分時復用的緩存器。每個緩存器均可作為計算陣列的輸入、輸出緩存。例如,在計算第n個倒殘差瓶頸模塊的任務時,緩存器0作為計算陣列的特征值輸入緩存,緩存器1則作為輸出緩存;而在計算第n+1個倒殘差瓶頸模塊的任務時,則相反。這樣在完成一幅圖像處理時可減少特征值緩存器與外部存儲的數據交換,節約帶寬。

Figure 6 Structures of the weight and feature buffers圖6 權值和特征值緩存器示意圖
數據的分塊處理是指將一層卷積分割為若干層卷積進行計算,因為片上緩存器大小是固定的,為適應不同分辨率的特征圖像,數據需要分塊處理。如圖1所示,逐層卷積前后特征值通道不變,而逐點卷積由于涉及到通道之間的累加,所以卷積前后通道數會改變,因此數據的分割會發生在逐點卷積的輸出部分,即CVA與CVC計算陣列的輸出部分。若用Cfst_o表示倒殘差瓶頸模塊中第1層逐點卷積的輸出通道數,Ctrd_o表示第3層逐點卷積的輸出通道數,則可以得到分塊的次數DA和DC:
(1)
(2)
其中ceil表示向上取整函數。
得到分塊的次數后,可以將一幅圖像的加速處理操作抽象成如圖7所示的循環操作。其中需要考慮DA與DC循環的計算次序問題。圖7列出的2種計算次序分別是DA循環優先和DC循環優先,其中Layer_MAX表示MobileNet網絡的最大計算層數:Hlayer和Wlayer分別表示第layer層的特征值的行數和列數,則可以看出采取DC循環優先的方式可以減少CVA與CVB陣列中的重復計算。

Figure 7 Two computing orders
為了驗證本文設計的硬件加速器在不同硬件資源約束下的可伸縮性,定義了一個表征參數計算效率:

(3)
由于不同卷積神經網絡加速器的實現會因資源占用以及使用的工藝不同導致工作頻率有差異,而計算效率這一參數可以拋開這2個差異,對加速器結構的效率做出一個正確的評價。通過修改3.3節中提到的并行度參數(并行度直接反映出所用乘法器的數量),可以得到如圖8所示的乘法器數量與計算效率之間的關系圖??梢钥闯觯敵朔ㄆ髻Y源從0~4 000變化時,本文設計的計算架構可以保持70%以上的計算效率,在這個范圍內具有一定的可伸縮性。同時還可以發現,隨著硬件資源的增加其計算效率的最高值在下降,這是由于隨著并行度的增大而網絡的尺寸不變,那么在進行小尺寸計算時(并行尺寸大于特征圖尺寸時)則會出現部分資源閑置,從而使計算效率下降。

Figure 8 Relationship between multiplier occupation and calculation efficiency of hardware accelerator圖8 硬件加速器的乘法器占用與計算效率的關系
采用XILINX Zynq-7000 ZC706開發板作為實驗平臺,實現了上述加速器。該開發板擁有218 600個LUT、545個Block RAM和900個DSP。下面將討論實現結果和性能比較。
本文采用的數據精度為16位定點,根據以上討論,并行計算陣列參數如表2所示,其中x在不同的模塊中分別可表示為a、b、c和add,而所占用的資源如表3所示,其中特征值緩存器的大小為12 Mb,而權值緩存器的大小為3.25 Mb。在該硬件加速器上完成了基于MobileNetV2的Hourglass網絡處理,該網絡被廣泛應用于人體姿態識別。硬件加速器可工作在150 MHz的工作頻率下,且實現了6.11 ms處理一幅圖像的工作效率,而該網絡的計算量約為0.953 Gop,通過計算得到本文設計的硬件加速器的性能約為156 Gop/s,計算效率約為61%。計算效率略低于3.7節設計空間探索中所得到的70%,這是由于隨著網絡的層數加深,卷積的尺寸變小,通道數增加,數據分割后的單次計算時間小于單次計算所需要的權值的傳輸時間,因此即使使用乒乓緩存機制也無法隱藏傳輸時間,對計算效率造成了一定的影響。
表4給出了本文設計的硬件加速器與其他MobileNet加速器實現的對比結果,可以看出本文設計的硬件加速器在計算效率上優于其他實現的。

Table 2 Parameters of parallel computing array

Table 3 Resource utilization

Table 4 Comparison of experimental results
本文提出了一個適用于MobileNet神經網絡的硬件加速器結構,其具有一定的可伸縮性,在不同的硬件資源開銷下能保持70%以上的計算效率,并用Hourglass-MobileNet網絡給予了驗證。但是,該結構仍存在著一些問題,例如在卷積尺寸較小時無法隱藏權值讀取時間,這是以后的工作中需要解決的問題。