梁洪衛(wèi) 白鵬程 陳建玲 孫勤江 陳明虎 薛祥凱
(1.東北石油大學 電氣信息工程學院,黑龍江 大慶 163318;2.中海石油(中國)有限公司 天津分公司,天津 300459)
卷積神經(jīng)網(wǎng)絡(CNN:Convolutional Neural Network)能在大量數(shù)據(jù)中進行特征學習,進而實現(xiàn)相同類型數(shù)據(jù)的識別,在語音識別、圖像處理、圖像分割以及自然語言處理等領(lǐng)域有著廣泛應用[1-3]。當前的卷積神經(jīng)網(wǎng)絡目標檢測算法主要有兩種方式:一階段檢測(one-stage)[4]方式和兩階段檢測(two-stage)方式。Two-stage 檢測方式由分類器演變進化,優(yōu)化比較困難。One-stage 方式將目標檢測重新構(gòu)造成一個回歸問題,直接對整張圖像中每個像素邊界框的坐標以及其所屬類別進行預測,不需要產(chǎn)生候選區(qū)域(region proposals),運行速度較快,YOLOv2 就是基于這種方式工作[5]。
由于CNN 特定的計算模式,當前CNN的設計及實現(xiàn)大部分是基于圖形處理器(GPU:Graphics Processing Unit)或依賴于大型服務器等硬件的支持,不適合移動平臺的應用[6]。然而,目前嵌入式系統(tǒng)已經(jīng)有了一個不可忽視的市場,它需要高精度和實時的圖像識別能力,但存在有限的電池和資源的嚴重限制性問題[7]。為解決這個問題,許多研究人員從計算或內(nèi)存訪問方面提出了各種CNN 加速技術(shù),FPGA 不僅具有豐富的片上硬件邏輯資源,還具有靈活的線路連接特性和良好的內(nèi)存帶寬,以及靈活的設計和較短的開發(fā)周期等優(yōu)點,廣泛地應用于深度學習領(lǐng)域,利用FPGA 加速神經(jīng)網(wǎng)絡已成為目前的研究熱點之一[8]。
筆者著重研究基于FPGA的YOLOv2 網(wǎng)絡的加速器設計,使用Xilinx 公司提供的Vivado 工具對各個設計模塊進行仿真驗證,然后用PYNQ-Z2 開發(fā)板搭建相應的硬件加速平臺進行功能驗證,硬件平臺包含可編程邏輯端(PL:Programmable Logic)和處理系統(tǒng)(PS:Process System)兩部分,通過軟、硬件協(xié)同的方式,分配合理的軟、硬件任務,將卷積神經(jīng)網(wǎng)絡的卷積層、池化層等參數(shù)數(shù)量較少而計算量大的部分,安排到FPGA 中進行加速,將全連接層等參數(shù)數(shù)量多而計算量較少的部分安排到ARM 中進行處理,充分考慮FPGA 中邏輯資源的使用問題,實現(xiàn)良好的加速效果。
YOLOv2 致力于實現(xiàn)一個端到端的網(wǎng)絡,以達到快速檢測并保持較高的準確度的目的。首先將輸入的圖像劃分成13×13 大小的網(wǎng)格,若其中一個對象的中心落在某一個網(wǎng)格單元內(nèi),則就由這個網(wǎng)格單元負責該圖像的檢測,算法設定每個網(wǎng)格單元預測5 個邊界框,每個邊界框包含85 維特征,這85 維特征由3 部分組成:80 類物體;預測框的中心點坐標(x,y);邊框?qū)抴、高h以及1 維可信度,可信度是每個框中包含可能的目標和準確度。
YOLOv2 網(wǎng)絡的設計主要是通過卷積層對圖像特征進行提取,同時使用全連接層預測邊界框的類與坐標。YOLOv2 網(wǎng)絡包含23 個卷積層,5 個池化層,1 個重排序?qū)右约邦A處理層、路由層和后處理層。卷積層主要采用3×3 大小的卷積核,最大池化層使用2×2 大小的池化核,經(jīng)過一層卷積核池化后特征圖的維度降低了2 倍,為降低模型計算量和參數(shù),在3×3 卷積之間使用了1×1 卷積壓縮特征圖通道數(shù)。YOLOv2 采用416×416 大小的圖片作為輸入,下采樣總步長為32,最終得到13×13 大小的特征圖,這種特征圖恰好只有一個中心點位置,YOLOv2 使用了先驗框處理,每個位置的各個先驗框都單獨預測一套分類概率值。
對YOLOv2 網(wǎng)絡模型進行深入分析,理解了模型算法的原理和數(shù)據(jù)流,根據(jù)模型在不同階段的運算,合理分配計算任務。
FPGA 是一種集成電路芯片,可以在成片后針對不同的算法進行定制硬件加速邏輯設計,并通過對邏輯單元的配置實現(xiàn)多種軟件算法。FPGA的基本結(jié)構(gòu)主要由查找表(LUT:Look Up Table)、觸發(fā)器(FF:Filp Flop)、導線和輸入輸出(I/O:IN/OUT)端口組成,有的還包含計算模塊(DSP:Digital Singnal Processor)和存儲模塊(BRAM:Block RAM)。
在FPGA 設計中優(yōu)化是必不可少的過程,采用合理的優(yōu)化策略不僅可以增強FPGA 計算性能,還可以提高數(shù)據(jù)交換的能力以及片上資源的利用率[9]。優(yōu)化策略主要分為計算優(yōu)化和內(nèi)存優(yōu)化,其中計算優(yōu)化包括計算并行、循環(huán)塊、循環(huán)展開和流水循環(huán)等優(yōu)化技術(shù),內(nèi)存優(yōu)化有減小數(shù)據(jù)精度、合理利用本地存儲、基于雙緩沖的“乒-乓”數(shù)據(jù)傳輸機制以及層間數(shù)據(jù)復用[10]。加速器基本結(jié)構(gòu)如圖1 所示。加速器設計采用常規(guī)的3 層存儲架構(gòu):片外存儲、片上緩存和處理單元的局部寄存[11]。由于芯片上塊隨機存取存儲器(BRAM)容量有限,內(nèi)核權(quán)重和中間像素結(jié)果都存儲在外部內(nèi)存中,即動態(tài)隨機存儲器(DRAM:Dynamic RAM)中,芯片上BRAM 作為動態(tài)隨機存儲器(DRAM)和PE(Processing Engine)之間的緩沖器。在加速前將預先訓練好的核權(quán)值和輸入圖像加載到DRAM 中。在連續(xù)DRAM 地址中,所有中間輸出像素都按照每個特征行、特征圖到其網(wǎng)絡層的形式逐步存儲。
由于YOLOv2 算法包含大量的參數(shù)和權(quán)重,如果僅依靠片上存儲不足以存儲所有數(shù)據(jù),所以需要借助外部存儲器。基本流程如圖1 所示。加速器從片外存儲中讀取卷積核權(quán)重參數(shù)與輸入特征圖像素到FPGA的片上緩存,通過多次復用片上緩存中的數(shù)據(jù)減少訪存次數(shù)和數(shù)據(jù)量[12-13],然后經(jīng)過處理單元陣列得到最終結(jié)果,再寫回片外。
圖1 加速器架構(gòu)Fig.1 Accelerator architecture
卷積計算如人們的大腦在識別圖片的過程中,并不能馬上識別一整張圖片,而是先對圖片中的每個特征進行局部感知,然后再對局部感知進行高層次的綜合,進而得到全局信息。對一個彩色圖片(RGB 3 通道),經(jīng)過4 層卷積核卷積運算,每層卷積核都有自己的權(quán)值,且其先對R、G、B 通道分別進行計算,然后再累加計算得到R、G、B 通道的值,對應位置處合并為最終一層的卷積層。
一個內(nèi)核窗口的寬度和高度由Nkx 和Nky 描述。輸入特征映射的寬度、高度由Nix、Niy 描述,輸出特征映射的寬度、高度由Nox、Noy 描述,輸入和輸出特征映射的數(shù)目用Nif 和Nof 表示。為了快速有效地執(zhí)行卷積循環(huán),設計使用3 種循環(huán)優(yōu)化技術(shù),即循環(huán)分塊、循環(huán)展開和循環(huán)交換,定制具有3 層存儲架構(gòu)的加速器計算和通信模式[14-15],如圖2 所示。對卷積循環(huán)進行分塊,盡可能重復利用輸出特征圖像素,將輸出特征圖的中間計算結(jié)果保留在片上緩存中或局部寄存器中,在到最終結(jié)果才會寫回片外,通過合理分配循環(huán)塊的大小,可增加數(shù)據(jù)的位置以減少DRAM 訪問次數(shù)。對卷積循環(huán)進行展開,是利用卷積循環(huán)計算的特點,因為設計不同的展開維度,會對應不同的乘法和加法單元,以達到減少計算延時,加速卷積計算。對卷積循環(huán)進行交換,目的是改變卷積循環(huán)的嵌套順序,最終改變數(shù)據(jù)復用模式。
圖2 卷積運算Fig.2 Convolution operation
池化層的作用是對輸入的特征圖進行壓縮,一方面使特征圖變小,簡化網(wǎng)絡計算的復雜度;另一方面是進行特征壓縮,減少過擬合,提取主要特征。YOLOv2 中的池化層都為K=S=2的最大池化層,對單一輸入特征圖,以2×2 大小、步長為2的窗口滑動,取其中的最大像素作為輸出,池化運算的過程如圖3所示。在1 個時鐘周期內(nèi),當數(shù)據(jù)充滿流水線后池化模塊從一個獨立的輸入特征圖緩存中,讀取相同位置的像素與當前最大值比較,同時還有其他比較器進行不同輸入特征圖的比較運算。將得到的最大值寫入輸出緩存中。
圖3 池化計算流程圖解Fig.3 Schematic diagram of pooling calculation process
在得到包含YOLOv2 網(wǎng)絡權(quán)值參數(shù)的二進制文件后,首先使用Vivado HLS 工具將卷積、池化等操作綜合成硬件IP,得到IP 后將IP 放到Vivado 工程目錄下,使用Vivado 工具調(diào)用Xilinx 官方的DMA、ARM等IP 共同組成SOC 硬件片上系統(tǒng),將FPGA 端所有的IP 核的工作頻率統(tǒng)一設置為150 MHz,然后對工程進行編譯,生成PYNQ 可識別的.bit 和.tcl 文件,把這兩個文件安排到PYNQ 鏡像目錄下,最后使用Jupyter Notebook 工具編寫驅(qū)動程序,完成設計的所有部分。
硬件加速平臺使用Xilinx 公司的PYNQ-z2 開發(fā)板,FPGA 芯片型號為ZYNQ XC7Z020CLG400-1,實驗中的PYNQ的芯片中含有一個雙核ARM,內(nèi)核為Cortex-A9,采用的加速方案是ARM+FPGA的異構(gòu)形式。圖4 中YOLO2_FPGA 是針對YOLOv2 網(wǎng)絡設計的加速器IP 核,Processing Systems 是PYNQ-z2的PS 端處理系統(tǒng),其余部分是FPGA 端自帶的IP 核,加速器有一個AXILite Slave 接口與PS 端GP0 接口連接,負責數(shù)據(jù)的讀寫、控制和狀態(tài)寄存器,AXI Master 接口分別連接PS 端的HP 接口,負責讀取特征圖的像素和權(quán)重。BRAM_18K 用于實現(xiàn)存儲量大的緩存,不僅是中間結(jié)果的緩存,AXI Master 接口也會耗費BRAM 實現(xiàn)接口緩存。DSP 主要用于卷積模塊中加法器和乘法器的設計,也有一部分會被其他模塊使用。FPGA 資源使用情況:在上述網(wǎng)絡參數(shù)的設置下,FPGA的資源中利用率最高的是DSP,利用率達到70%(見表1),可見數(shù)據(jù)的處理計算是限制網(wǎng)絡層數(shù)的一個主要因素。
表1 資源利用率Tab.1 Resource utilization
圖4 YOLOv2 加速器的SOC 設計Fig.4 SOC design of the YOLOv2 accelerator
功耗:從編譯完成后的報告中可以看出筆者設計的框架對應的功耗,如圖5 所示。靜態(tài)功耗為0.187 W,動態(tài)功耗為2.524 W,總功耗為2.711 W。
圖5 FPGA 片上功耗Fig.5 Power consumption on FPGA chip
識別結(jié)果:圖6 是對測試集中圖片的檢測結(jié)果,圖7 是對實際圖片進行檢測的結(jié)果。由FPGA 加速處理后,從返回的報告中能得到圖像識別的結(jié)果并給出判斷的準確率以及整個加速器各個部分處理需要的時間,可以看到FPGA 處理的平均時間為2.47 s,每張照片的浮點運算達到了29.47 GOP,該設計的處理能力為27.03 GOP/s,與CPU(E5-2620V4)相比,處理能力是CPU的6.57 倍,功耗是CPU的3%。
圖6 測試集檢測結(jié)果Fig.6 Test set detection results
圖7 實際圖像檢測結(jié)果Fig.7 Actual image detection results
筆者以YOLOv2 算法為例,以PYNQ-z2 開發(fā)板作為硬件加速器,設計對應的加速器結(jié)構(gòu),可離線處理大量數(shù)據(jù)操作。首先對YOLOv2 網(wǎng)絡結(jié)構(gòu)進行研究分析,然后對各個模塊進行合理設計,保證設計的性能和效率,最后采用VerilogHDL 語言完成算法的設計,生成IP 和其他模塊進行封裝。通過實際測試,達到了理想的設計目標。與基于通用處理器的卷積神經(jīng)網(wǎng)絡系統(tǒng)相比,如E5-2620V4 CPU 處理器,功耗低至2.711 W,是E5-2620V4 功耗的3%,處理能力是E5-2620V4的6.57 倍,卷積神經(jīng)網(wǎng)絡算法專用硬件系統(tǒng)設計,集成程度更高,設備體積更小,重構(gòu)性強,具有一定的應用價值和現(xiàn)實意義。
隨著檢測精度的不斷提高,神經(jīng)網(wǎng)絡模型的結(jié)構(gòu)變得越來越復雜,計算量也成倍增加,對在小型嵌入式設備上部署大型的神經(jīng)網(wǎng)絡變得更加困難,因此需要對結(jié)構(gòu)復雜的神經(jīng)網(wǎng)絡進行壓縮剪枝。通過PYNQ-z2 加速后YOLOv2 網(wǎng)絡未能達到實時檢測的結(jié)果,接下來針對YOLOv2 進行壓縮剪枝,在保證檢測精度變化不大的情況下,在小型嵌入式設備上實現(xiàn)快速檢測。