夏琪迪, 顏秉勇, 周家樂, 王慧鋒
(華東理工大學信息科學與工程學院,上海 200237)
近年來,卷積神經網絡(CNN)在計算機視覺領域發展迅速,且隨著應用需求的增加和應用場景的復雜性,CNN 的應用也逐漸拓展到人臉識別、目標檢測、自主駕駛和語音識別等領域[1-4]。隨著CNN 的層次越來越深,模型的體系結構復雜度逐漸增加,所需的運算量大大提高[5],如何高效地實現低功耗、低成本的CNN 運算平臺越來越受到關注。目前有許多基于CPU、GPU、FPGA 甚至ASIC 的CNN 實現被提出[6-9],其中兼具靈活性、低功耗和高效率的CPU+FPGA 的異構設計備受關注,成為主流的CNN硬件加速平臺之一。
作為目前CNN 的主要應用領域,目標檢測算法近年來出現了一些代表性的網絡,其中YOLO(You Only Look Once)[10]系列算法在檢測速度和準確性上都展現了優秀的效果,基于YOLO 模型的FPGA 加速方法成為研究熱點。先前的研究[11]通過減少外部數據訪問和精確的數據重用來加速CNN 的應用,但該方法不一定會帶來最佳的整體性能,并且需要重新配置FPGA 以適應不同的計算層。Nguyen 等[12]采用RTL 電路對YOLOv2 算法進行了加速,將網絡權值參數量化為二進制,使用更少的數字信號處理(Digital Signal Processing, DSP)完成計算。借助數據重用與動態隨機訪問,該設計的功耗降低至18.29 W,但對于邊緣計算而言,其功耗有待進一步提高。Nakahara 等[13]在輕量級YOLOv2 中結合二進制和支持向量機設計了一套優化加速平臺,通過降低計算復雜度來加快YOLO 算法的檢測速度,但該方法沒有考慮內存訪問的優化。
針對現有研究存在的加速方法不足、功耗較高、內存訪問優化不完善等問題,本文提出了一種結合內存訪問優化方法和輸入輸出通道并行加速的新型異構FPGA 高能效硬件加速器。該設計對各個模塊進行單獨設計優化,改進加速器數據訪存機制以減少繁瑣的數據訪問帶來的系統時延,同時利用CPU 的邏輯處理能力和FPGA 的并行計算資源,實現低功耗高性能的目標檢測硬件加速器。
目前基于深度學習的常用目標檢測網絡有RCNN、YOLO 系列等。基于YOLO 的優異檢測性能及其在邊緣計算方面的加速潛力,本文選擇對YOLOv2網絡進行硬件加速,其網絡結構如圖1 所示。

圖1 YOLOv2 網絡結構Fig. 1 YOLOv2 network structure
YOLOv2 目標檢測網絡包括卷積層、池化層、路由層和重排序層等。
(1) 卷積層。主要是借助卷積核對輸入特征圖進行卷積處理,經過權重和偏置獲取特征。
(2) 池化層。通常跟在卷積層后進行特征壓縮,去除冗余信息。
(3) 路由層。把需要的輸入層進行級聯,作為下一層的輸入特征圖,以實現多維度特征融合。
(4) 重排序層。對于待處理的特征圖按照給定步長在鄰域內取像素點,相同位置的像素組成新的輸出特征圖,可以更好地解釋細粒度特征,提升模型識別準確度。
(5) 批歸一化。批歸一化(Batch Normalization,BN)主要用于加快模型收斂。YOLOv2 算法在訓練時使用了批歸一化,故在網絡預測時需要先對卷積層輸出特征圖進行映射解析。

其中:x為輸入的待預測樣本;y為批歸一化的輸出結果;γ為尺度因子;β為平移因子;E[x]和Var[x]分別為訓練時每批下的均值和方差; ε 是為了避免除數為0 時所使用的微小正數。
(6) 激活函數。YOLOv2 使用Leaky ReLU 激活函數來提升模型的非線性擬合性能。Leaky ReLU 函數快速計算、收斂的特點得使它不會消耗太多的FPGA 資源,其表達式如下:

其中 α 可由方向傳播算法求得,通常取值為一個接近0 的正數。
高層次綜合(High Level Synthesis, HLS)是近年來Xilinx 公司主推的高效FPGA 電路設計開發方法,它可以在高層次進行軟件描述,之后綜合成可用的網表文件。開發人員只需要采用C、C++等語言即可實現FPGA 電路編程,開發效率高,十分適合算法的快速驗證。
YOLOv2 算法進行目標識別時主要有預處理、網絡計算和后處理3 個步驟,其中網絡部分占整個算法計算量的90%。本文將這部分作為FPGA 主要的加速目標,借助FPGA 豐富的片上資源和并行處理能力,通過合理的設計優化實現加速。預處理與后處理的計算量較小,并且涉及部分算法邏輯,故將它們放到CPU 端運行。
本文設計的FPGA 端加速器架構如圖2 所示。架構中有數個AXI 主接口和一個AXILite 從接口,因為HLS 方法生成的AXI 主接口每個通道的讀寫機制類似直接內存讀取(DMA),因此使用多個主接口來模擬DMA 并發訪問,實現并行寫入、寫回數據,包括處理的特征圖數據和需要加載的各層權重或偏置參數,控制信號、數據讀寫信號等則通過從接口傳輸。
圖2 示出的黑色連線代表控制信號線,綠色連線代表處理的圖像數據傳輸通路,紅色模塊分別為針對算法不同層進行獨立設計實現的FPGA 模塊和為了優化數據訪問設計的數據收發模塊。

圖2 加速器數據流框架Fig. 2 Accelerator data flow framework
2.2.1 粗粒度優化 卷積層是整個算法中計算量最大的部分,它占YOLO 算法90%以上的運算時間[14]。針對卷積中大量的運算操作,FPGA 內的處理引擎(Process Engine,PE)可以多次執行相同的操作來完成整個計算任務。
針對這種可優化的串行處理方式,本文提出了粗粒度優化的加速策略,即利用FPGA 內部的空閑計算資源,將計算任務分配給多個PE,通過增加FPGA 內部電路使用以實現并行處理,提高卷積的計算速度。
如圖3 所示,粗粒度優化的加速策略由M個PE 組成M-PEs 計算單元,矢量化的輸入數據被劃分成不同的部分,同時流入每個PE 進行并行計算。卷積所需的權重數據存儲在片上存儲器中,計算時輸入數據和權重數據共同流入PE,每個PE 同時執行相同的乘法和加法運算,其輸出作為下一個網絡層的輸入繼續計算,同一控制信號控制多個PE。粗粒度優化的本質是使用FPGA 內部的計算資源來增加操作并行性,通過消耗更多的FPGA 資源來提高計算性能。

圖3 粗粒度優化示意圖Fig. 3 Schematic diagram of coarse-grained optimization
2.2.2 細粒度優化 實現粗粒度優化后,雖然可以調用多個PE 進行并行數據處理,但各個PE 對不同數據所需的處理時間不同,會造成不同大小的時延問題。假設粗粒度優化選定M個PE 進行并行處理,單個周期內,當M個PE 都計算完成后得到的輸出才會進入下一層處理,造成FPGA 的資源利用不夠充分。
針對上述時延問題,本文對處理引擎中的流水線進行優化,可以有效降低時間冗余和延遲,如圖4所示。其中圖4(a)示出了優化前FPGA 中的數據處理乘加操作,圖4(b)示出了通過在FPGA 中的兩個數據處理節點之間添加寄存器實現的流水線優化框架。在數據流處理過程中,每個寄存器在每個時鐘周期內存儲上一層計算節點的數據,并將前一個時鐘周期中緩存的數據傳輸給下一個計算節點。對于有循環的計算,使用HLS 工具中的UNROLL 指令將循環計算過程轉換為同步計算過程來展開循環,充分利用FPGA 的硬件資源,消除了無效的等待時間,提高了計算效率。

圖4 優化前后FPGA 中的乘加操作對比Fig. 4 Comparison of multiplication and addition operations in FPGA before and after optimization
2.2.3 浮點數定點化 在計算卷積神經網絡時,權值和偏差參數的大小會影響整個網絡的性能[15]。大量的高精度浮點運算不僅會增加模型的功耗,而且會影響計算速度。在以往的研究[16-18]中發現,與浮點數運算相比,定點數據更適合使用FPGA 進行高效計算。在Chen 等[19]的研究中發現,16 位定點數據的功耗為32 位數據的0.136 倍,而模型的精度僅下降了0.26%。因此,本文在訓練YOLO 網絡時,使用32 位浮點數,在FPGA 中部署YOLO 模型時,特性圖像素、卷積核和權重數據被量化為16 位定點數。
假設在訓練YOLO 網絡時獲得的某個權重數據x為4.609 685 301 780 701,該32 位浮點數由1 位符號位、8 位指數位(整數部分)和23 位尾數位(小數部分)組成,則x在計算機底層的32 位浮點數表示如圖5(a)所示。
定點數在確定了各位數的長度后,小數點的位置被固定,本文設定FPGA 中的16 位定點數各部分的位數為1、3、12,則x在FPGA 底層的16 位定點數表示如圖5(b)所示。

圖5 32 位浮點數和16 位定點數表示對比Fig. 5 Comparison between 32-bit floating-point numbers and 16-bit fixed-point numbers
由于數據位數不同帶來的精度不同,該權重數據x的浮點數定點化前后誤差為0.000 066 161 155 701,數據損失率僅為0.001 4%,不影響目標檢測算法精度,可忽略不計。
YOLOv2 算法主要包括4 層。卷積層的任務是提取特征;池化層用來降維去冗余;路由層用來進行特征融合;重排序層針對特征進行抽樣打亂。在卷積層后常跟著批量歸一化和激活函數,以加快模型收斂、提高非線性性[20]。
2.3.1 卷積模塊(Conv) 與先前研究中常用的卷積計算單維度加速不同,本文提出了一種輸入、輸出通道兩維展開的新型卷積加速策略。假設在YOLOv2算法中的某次卷積模塊輸出特征圖個數為M,輸入特征圖個數為N,設Tm和Tn為這兩個維度上的并行通道個數,單次卷積操作可以實現Tm×Tn個并行乘法操作,再借助Tm個加法樹得到單次卷積輸出。這種輸出、輸入通道的同時展開允許我們對卷積操作的底層乘加運算進行流水化處理,減少電路閑置時間,進而提升整個加速器的運算速度。假設現有Tm=2、Tn=4 的兩維展開,其工作原理如圖6 所示。
圖6 示出的In[0]~In[3]為4 個輸入通道的輸入特征圖緩存區,Out[0]和Out[1]是2 個輸出通道的輸出特征圖緩存區,其他模塊設計定義如下:

圖6 卷積模塊展開示意圖Fig. 6 Schematic diagram of convolution module expansion
(1)存放Tm×Tn個大小為K×K的卷積核權重的緩存區;
(2)Tm×Tn個并行乘法單元;
(3)Tm個加法樹進行并行加法運算操作;
(4)存放偏置參數的緩存區。
每個計算周期內,特定設計的卷積模塊從存放有輸入特征圖的片上緩存中讀取Tn個像素,同時與像素相同位置的權重(W)也會加載至待計算的Tm×Tn個卷積核中,加速器復用Tn個輸入特征圖進行運算,經過Tm個加法樹累加后得到卷積結果,存放至相應的輸出緩存中。
從卷積計算原理可以看出,新型卷積模塊大部分消耗的是FPGA 中的乘法器和加法器資源,運算時使用的數據精度是消耗資源的主要影響因素,通過改變不同數據精度可以得出對應的資源耗費,見表1??梢钥闯觯捎?6 位定點數據精度的加法器和乘法器使用的DSP(Digital Signal Processing)和LUT (Look-Up Table)遠少于32 位浮點數據精度下的資源消耗,進一步驗證了浮點數定點化的可行性。

表1 不同數據精度消耗資源對比Table 1 Comparison of resource consumption with different data accuracy
對于Tm×Tn兩維展開的卷積模塊,其消耗的DSP 資源NDSP和LUT 資源NLUT計算公式如下:

其中:MDcost和ADcost分別為計算DSP 資源時的乘法器和加法器的耗費;MLcost和ALcost分別為計算LUT 資源時的乘法器和加法器的耗費;Selcost為移位電路和累加器的查找表耗費。
針對這種卷積的兩維展開優化,分析方法可類比Roofline 模型[21],得到這種優化方法中的主要影響因素。假設R、C為輸入特征圖的行和列,M、N為神經網絡輸出、輸入通道數,P為流水線深度,可得計算性能上限:

其中Osum為操作總次數;Zsum為執行周期總次數;Tr為輸入特征圖的行并行通道數;Tc為輸入特征圖的列并行通道數。可以看到,輸入維度并行通道數Tm與輸出維度并行通道數Tn越大則兩維展開優化的計算性能越高。但并行度的選擇并非只取決于Roofline 模型,在實際設計時仍需進行綜合考量,獲取最佳并行度。
2.3.2 池化模塊(Pool) YOLOv2 算法的池化步長和池化大小均為2,其余原理與卷積層類似,不同處在于運算時池化層使用比較器,并非卷積層的乘、加操作,另一不同點在于池化可以針對單一輸入特征圖抽樣。
由于卷積模塊會消耗大部分板上資源,對池化模塊的設計思路為消耗有限的硬件資源獲取更多的并行度。圖7 示出了池化模塊示意圖。假設有Tpool個輸入特征圖緩存,在單個池化周期內加速器將它們相同位置的像素輸入到Tpool個比較器,進行并行比較計算獲取最大值,存放至池化輸出緩存區中。在本文的加速器設計中各模塊共用輸入和輸出模塊,則池化時其并行度為Tpool≤min(Tnmax,Tmmax)。

圖7 池化模塊示意圖Fig. 7 Schematic diagram of pooling module
2.3.3 重排序模塊(ReOrg) 假設重排序時設置的步長為S,重排序層讀取單張輸入特征圖后會把S×S區域內的像素存放到S×S張輸出特征圖中,位置不變?;谥嘏判驅拥脑砼c特點,本設計使用1 塊存放單張輸入特征圖的輸入緩存和4 塊存放輸出特征圖的輸出緩存,以及一個4 通道選擇器,以分配不同的輸出緩存地址。
以1 張8×8 的輸入特征圖為例,排序過程如圖8所示。處理后輸出4 張4×4 的特征子圖,存放至輸出緩存中。

圖8 重排序示意圖Fig. 8 Schematic diagram of reordering
2.3.4 輸入輸出模塊(Data Gather/Scatter) FPGA 底層在執行算法時需要對大量數據進行讀寫,現有研究對內存訪問機制并沒有較好地優化。本文針對數據的輸入輸出進行了特定優化和專門的模塊設計,在單個周期內進行批量的數據讀取或寫入,存儲到FPGA 的片上緩存,該批次數據復用完成后進行下一次讀取,通過增加單次讀取的數據塊大小減少訪存操作次數,縮短大量單次訪存操作帶來的時間延遲。
硬件加速器架構底層數據傳輸使用FPGA 片內AXI 高速總線,AXI4 master 模塊接口讀寫通道相互獨立,支持并發執行數據讀寫策略。各模塊與片外RAM 進行數據傳輸時,借助特定設計的數據分發(Data Scatter)模塊,通過數個讀通道進行待處理特征圖的并行輸入,讀取至片內時再分發到不同模塊對應緩存;進行數據輸出時則借助特定設計的數據收集(Data Gather)模塊,先將待輸出數據寫回DRAM,通過數個寫通道完成輸出特征圖像素塊的并行寫入,實現更佳的數據內存訪問機制。
加速器系統結構可以分為兩部分:PS(Processing System)和PL(Programming Logic)。基于PYNQ 框架的PS 端集成了ARM 內核和Python 編譯環境,運行Linux 操作系統。
PS 端的CPU 可以控制PS 和PL 之間的所有接口,加速器使用CPU 調度將待輸入特征圖和YOLO 網絡參數輸入DDR 緩沖區,通過AXI(Advanced eXtensible Interface)總線與外圍接口電路進行交互。CPU 使用AXI 總線讀取加速電路的運算結果,執行圖像預處理的應用程序并在PS 側顯示。在PL 端,外部DDR中的數據被讀取至片上RAM,同時硬件設計比特流文件(Bit)和設計指令文件(Tcl)被傳遞到PS 端,經過識別解析,前文中對YOLO 加速器進行的各模塊設計被部署到FPGA 上,YOLO 的IP 內核被增添到PYNQ 的Overlay 庫中用于頂層調用,整個硬件加速器架構設計如圖9。

圖9 系統硬件加速器架構Fig. 9 System hardware accelerator architecture
基于上述硬件加速器框架,借助HLS 工具,本文進行了各模塊的具體實現并通過Vivado 工具搭建了基于YOLOv2 的新型低功耗目標檢測硬件加速系統,如圖10 所示。此系統包括PS 端的ARM 微處理器和PL 端的YOLO 模塊、外部存儲器和總線互聯器等,其中總線互聯器可以將多個AXI 內存映射的主設備連接到對應的多個內存映射的從設備中,同時保證AXI 總線上的高速傳輸。

圖10 YOLOv2 網絡硬件加速系統Fig. 10 YOLOv2 network hardware acceleration system
3.2.1 實驗設置 低功耗目標檢測加速器由Vivado HLS 2018.3 生成,HLS 工具可以將C/C++語言程序轉換成FPGA 所需的RTL 電路,硬件架構構建于Vivado 2018.3,加速平臺基于Xilinx PYNQ-Z2,主芯片ZYNQXC7Z0201CLG400C,板上包含一個630 KB 的塊RAM、220 個DSP 片、一個ARM 雙核Cortex-A9 處理器和一個外部512 MB DDR3。
3.2.2 結果評估 實驗基于Xilinx 平臺上實現了基于YOLOv2 目標檢測網絡的硬件加速器,使用Vivado HLS 2018.3 設計,生成加速器對應IP 核的Bit 文件和Tcl 文件,在Vivado 2018.3 中進行SOC 平臺搭建,完成加速器架構設計。PS 端調度硬件邏輯并分配加速資源,大量并行計算卸載到PL 端進行。最終加速器的功耗為2.96 W,算力達到26.98 GOPs(Giga Operations Per Second)。實驗環境及檢測結果見圖11。

圖11 實驗環境與檢測結果Fig. 11 Experimental environment and test results
(1) 資源消耗評估。使用Vivado HLS 2018.3 對加速器主要IP 核進行實現后,可得到設計中的各模塊資源消耗,見表2。其中DSP48E 主要用于細粒度優化策略和卷積模塊中的乘法器和加法器配置,耗費152 個,充分利用FPGA 的計算資源。BRAM_18K用于實現粗粒度優化策略等存儲量較大的緩存需求,除了YOLOv2 的IP 核使用BRAM_18K,加速器系統中的其他模塊的接口緩存也會消耗BRAM 資源,例如偏置參數緩存和權重行緩存各需要兩個BRAM_18K,輸入緩存需要24 個BRAM。所有額外BRAM_18K 消耗共86 個。對于較小量級的數據緩存并不適合使用BRAM 資源,本設計中使用FF 和LUTs 資源來實現少量數據與信號的傳輸,此模塊消耗35 977 個LUT 和32 049 個FF。

表2 加速器資源消耗Table 2 Accelerator resource consumption
(2) 性能評估。將該加速器與其他平臺的加速效果進行對比,比較結果見表3。由于內存資源的限制,本文的加速器數據吞吐量不大,但是其功耗僅為2.96 W,算力達到26.98 GOPs。文獻[22]設計了行緩沖模式,適用于不同大小的卷積核,但由于卷積加速模塊與全連接模塊分開設計,片上資源的重用率并不高,因此即使主頻較高但實際計算性能只能達到18.82 GOPs,僅為本文設計的69.7%。Zynq Ultrascale+[13]平臺上的加速器計算性能較好,但其消耗的FPGA 片上資源遠多于本設計,功耗是本設計的1.5 倍。文獻[23]的工作基于OpenGL 技術,其加速方法結合了通用矩陣乘法對輸入特征圖分塊、并行計算,實現加速。然而,此設計沒有考慮參數與輸入特征圖的排序問題,每次處理均需要額外的排序處理時間,限制了加速器的性能發揮,本設計的算力與其相比提升了38.71%。

表3 與其他FPGA 加速器設計的比較Table 3 Comparison with other FPGA accelerator designs
本文以典型目標檢測算法YOLOv2 為基礎,借助結合CPU 的異構FPGA 設計并實現了一種同時對卷積輸入和輸出進行展開的新型硬件加速器,同時在FPGA 上設計粗粒度和細粒度優化方法,提高硬件資源利用率,數據位寬上進行浮點數定點化,加快處理速度的同時降低系統功耗,通過對數據位寬轉換前后對比驗證了這種方法的可行性。本文另一創新在于針對容易被忽視的底層數據訪問重新設計加速器數據訪存機制,有效提高總線帶寬利用率,減少系統傳輸時延。
本文設計的加速器的功耗約為2.96 W,算力達到26.98 GOPs。經過資源消耗評估,將加速器性能與現有工作進行對比,驗證了在計算資源有限的平臺上進行低功耗目標檢測需求的可行性,為目標檢測算法在實際應用時遇到的性能不足、功耗有限等問題提供了新架構。
未來工作可從兩方面出發,底層的機制優化或算法網絡層的優化,前者可從數據復用的進一步展開,對不同大小的輸入特征圖的存取需求進行不同處理;后者可以綜合現有的一些輕量化網絡設計,譬如多層融合,或使用Winograd 快速乘法減少卷積內循環的乘操作,通過轉換乘加操作充分利用FPGA 片上資源,提高加速器性能。