黃沛昱 趙 強 李煜龍
(重慶郵電大學光電工程學院 重慶 400065)
近年來,隨著人工智能的快速發展,其理論研究日益成熟。機器視覺是人工智能的一個重要研究方向,卷積神經網絡(Convolutional Neural Network,CNN)已經被廣泛應用于機器視覺完成特征提取[1-4]。
深度學習主要分為兩個步驟:訓練和推理。采用通用處理器實現卷積神經網絡的推理,其運算效率非常低。因為通用處理器采用馮諾依曼結構是串行執行,難以滿足卷積神經網絡需要大量的并行計算。因此,針對卷積神經網絡的結構出現了三種主流的硬件加速方式:專用集成電路(Application Specific Integrated Circuit,ASIC)、圖形處理器(Graphics Processing Unit,GPU)、現場可編程門陣列(Field Programmable Gate Array,FPGA)。其中,基于ASIC的硬件實現研發周期長,無法適應復雜多變的CNN結構,并且專用集成電路研發成本高昂。基于GPU的硬件實現雖然可以獲得很好的性能,但是較高的功耗也會降低其性能,同時,如果將其部署到移動設備會嚴重縮短續航時間。基于FPGA的硬件加速器能克服ASIC和GPU的缺點,同時,FPGA支持并行計算,具有動態可重構、低功耗、低延時、高性能的優勢[5-7]。
因此,目前基于FPGA對卷積神經網絡進行硬件加速設計已經被廣泛研究。文獻[8]采用8 bit位寬量化卷積神經網絡,在損失一定準確度的情況下,減少網絡的體積,并且節約了FPGA的存儲資源,同時也提高了計算性能。文獻[9]提出一種卷積循環二維展開的加速器設計,其核心思想是把每一層卷積計算的輸入和輸出特征圖循環展開進行并行計算,從而提高計算的吞吐量。但是,由于該設計把權重和輸入輸出特征圖緩存在FPGA片上,導致FPGA消耗過多的資源,不利于部署在中小規模FPGA上。
在進行FPGA硬件電路設計時,傳統的方法采用Verilog或者VHDL語言進行設計,這種方式開發效率低。目前,隨著高層次綜合工具的日益成熟,Xilinx公司推出的HLS工具已經支持C/C++語言對FPGA完成算法開發,從而提高開發效率[10]。
為了提高卷積神經網絡的推理速度,本文設計一種基于FPGA的硬件加速電路。首先,網絡結構采用工業界廣泛用于目標檢測的YOLOv2網絡。為了減少網絡模型的體積,同時為了保證網絡預測結果的準確率,本設計采用16位定點化權重參數,偏置項參數以及輸入輸出特征圖的像素。然后設計卷積運算模塊的硬件電路,為了提高計算的吞吐量,采用輸入輸出二維循環展開的方法,為了降低從內存中讀取數據的延時,采用雙緩存設計。最后,將本設計的YOLOv2網絡加速器部署在Xilinx公司的Pynq-z1嵌入式開發板上性能超過i5- 4440處理器。同時,與已有的CNN模型的硬件加速器性能進行對比。
2012年,Hinton教授帶領學生在Imagenet數據集上,將AlexNet網絡用于圖像分類獲得的準確率遠高于傳統算法。從此,卷積神經網絡廣泛用于圖像分類、目標檢測和跟蹤等一系列的計算機視覺領域[11-12]。
卷積神經網絡主要包括輸入層、卷積層、池化層、全連接層、輸出層等。VGG- 16網絡如圖1所示,其網絡包含13個卷積層、5個池化層、3個全連接層。卷積神經網絡中不同卷積層有不同數目的卷積核,卷積核的大小主要以3×3和1×1為主,卷積層通過卷積核提取圖像特征。卷積的結果需要通過相應的激活函數計算后再進行池化,激活函數是為使網絡的輸入輸出之間滿足非線性的關系,增強神經網絡的表達能力。常見的激活函數有ReLU、Leaky ReLU、Tanh和Sigmoid函數。池化層也被稱為降采樣,作用是減少特征圖的尺寸。常用的池化方法有最大池化和平均池化,而池化的大小以2×2為主。網絡中的全連接層一般位于網絡最后幾層,其作用是將提取的特征完成分類,由于全連接層的參數占整個網絡的90%以上,參數的冗余降低模型的表達能力。因此,現在大量性能優異的網絡采用全局平均池化代替全連接層,使用Softmax函數來完成分類任務,例如ResNet網絡和GoogLeNet網絡[13-15]。
YOLOv2網絡模型是目標檢測領域的One-Stage典型算法,其速度要快過Two-Stage算法中的Fast-RCNN和Faster-RCNN網絡模型。同時,YOLOv2網絡模型可以速度和準確率之間進行權衡,適應不同場景的需求[16-17]。比如,在不需要速度的時候,適當地提高模型的準確率;而在一些場景對速度有嚴格的要求,可以適當地提高速度。因此,YOLOv2適合部署于中小規模設備。
YOLOv2網絡結構中使用Darknet- 19網絡作為基礎分類網絡,Darknet- 19網絡如表1所示,Darknet- 19網絡結合GoogLeNet網絡和VGG- 19網絡的優勢,在Darknet- 19網絡中使用1×1和3×3的卷積核進行卷積計算,同時,使用全局平均池化代替全連接層。Darknet- 19網絡不僅能降低模型的參數量和計算的復雜度,而且能提高網絡的泛化能力,避免模型的過擬合。

表1 Darknet- 19網絡結構
因為卷積層的計算量占據整個網絡模型的90%以上[18],所以為了加速卷積神經網絡的推理過程,本文采取循環展開和分塊的策略,針對網絡模型中的卷積層運算進行優化。
1.3.1循環展開
循環展開是針對卷積計算常用的硬件加速策略,主要是提高硬件乘法單元的并行度。循環展開可以分為兩類:一類是輸入特征圖的循環展開,另外一類是輸出特征圖的循環展開。
輸入特征圖的循環展開通過每個時鐘周期并行的讀取Tn幅輸入特征圖的像素點,然后與對應的權重參數進行乘累加操作。如圖2所示(Tn=4),每個時鐘周期讀取的特征圖的個數Tn需要合理設置,特征圖的個數Tn決定輸入并行乘法器的個數。如果Tn值太大,雖然可以獲得較高的性能,但是會消耗FPGA芯片內部大量的DSP資源,如果Tn值太小,則無法發揮FPGA并行計算的優勢。

圖2 輸入特征圖循環展開示意圖
輸出特征圖的循環展開是通過每個時鐘周期并行讀取Tm個卷積核權重參數值與讀取的一幅輸入特征圖的像素值進行乘累加操作,如圖3所示(Tm=2)。

圖3 輸出特征圖循環展開示意圖
1.3.2循環分塊
因為FPGA芯片內部存儲資源有限,所以將CNN網絡部署到FPGA上,需要將輸入輸出特征圖和權重參數存儲到片外存儲器中。
本設計采用循環分塊的思想,每個時鐘周期從片外讀取Tn個Tix×Tiy大小的像素塊,并且讀取Tm個卷積核,卷積核大小為Tn×Tkx×Tky,卷積核的大小是由網絡結構所決定。同時,把中間計算結果緩存在片上存儲中,當計算完成得到最終結果,再向片外存儲器寫入Tm個Tox×Toy大小的像素塊,如圖4所示。采用循環分塊的思想可以有效地減少片外存儲訪問次數,降低訪存時延,從而提高加速性能。

圖4 循環分塊示意圖
在卷積神經網絡的推理階段,網絡的層與層之間是串行結構,每一個網絡層的輸出作為下一個網絡層的輸入,而每一個網絡層內存在大量的并行計算。本設計的硬件加速器充分利用卷積神經網絡的層間流水,層內并行計算特點。為了減少讀取或寫入數據傳輸時延,本設計使用雙緩存結構,如圖5所示。

圖5 硬件加速器架構
本設計在zynq- 7020芯片完成加速器的設計,首先把待測試的數據集、16位定點量化權重參數和偏置參數存放在SD卡中,然后從SD卡讀入片外DDR3存儲器中。在進行計算之前,需要對圖片進行預處理,大小為416×416,同時,把RGB圖片的像素值量化為0到1之間的小數。接著在DDR3存儲器和片上緩存之間,通過4個AXI總線的HP端口,使用DMA(Direct Memory Access)把片外存儲器的數據讀取到片上緩存中。其中,AXI總線的HP端口通過雙緩存的設計,使得讀取數據、計算和寫入數據三者同時進行,能夠有效提高因為數據傳輸時延而影響加速器的性能。
在片上計算單元中,時鐘頻率為150 MHz,通過設計并行計算陣列加速YOLOv2網絡中卷積和池化運算。其中,本設計的卷積并行計算陣列大小32行4列,每次從輸入讀取4幅特征圖部分像素塊,像素塊大小為Tix×Tiy。
Tix=(Tox-1)×s+k
(1)
Tiy=(Toy-1)×s+k
(2)
式中:Tox和Toy為輸出特征圖的像素塊的大小,Tox=Toy=13;s為卷積計算的步長;k為卷積核的大小。
整個硬件加速器依次從DDR3內存中讀取數據,然后在片上完成計算,實現層間流水,層內并行的硬件加速器。最后將加速器的計算結果寫回DDR3內存中,通過Softmax函數完成目標檢測的分類,使用非極大值抑制算法得到目標的邊框,以及在圖片上完成標記。
在YOLOv2網絡模型中,卷積層包括卷積計算,批歸一化(Batch Normalization,BN)和激活函數(Leaky ReLU)三部分。批歸一化是針對卷積運算的輸出特征圖的每個像素點進行線性運算,因此,在進行卷積計算之前,本設計將批歸一化運算與權重參數和偏置參數進行融合,然后在FPGA片上進行卷積計算,有利于減少FPGA片上的計算量,從而提高加速器的性能。
因為卷積運算占據大多數CNN網絡中90%以上運算量,所以目前針對CNN硬件加速器設計主要集中在卷積層的硬件設計。本設計針對卷積計算硬件加速單元的設計采用循環展開和循環分塊的策略,對輸入輸出特征圖進行二維展開,在合理考慮硬件資源和YOLOv2網絡結構的情況下,本設計采用128個并行乘法器實現卷積層的硬件加速,如圖6所示。每輸入一張特征圖與一組權重參數相乘為1個PE單元,因為本設計輸出特征圖采用32維展開,所以一幅Tix×Tiy大小的特征圖需要與32組權重參數進行并行乘法計算,總共為32個PE單元。同時,輸入特征圖采用4維展開,在每個時鐘周期同時讀取4幅Tix×Tiy大小的特征圖,再結合輸出特征圖展開維度為32,總共為128個PE單元,構成32行4列卷積并行計算單元。

圖6 卷積層硬件加速結構圖
卷積計算單元輸入輸出端口包括特征圖輸入端口、權重參數輸入端口和特征圖輸出端口三部分。因為卷積計算的偏置參數量較少,所以預先存儲在FPGA芯片內部。在進行卷積計算時,輸入輸出端口均采用乒乓操作,在同一時鐘下,使得讀取和寫入數據同時進行,能夠有效降低讀取和寫入數據的傳輸時延,提高每個PE單元計算速度,從而提高整個硬件加速器的計算性能。
在YOLOv2網絡模型中,每一層的計算需要頻繁地對片外DRAM讀取和寫入數據,將會導致因為數據傳輸延遲而帶來的硬件加速器計算性能的下降。因此,雙緩存設計是為了降低從片外DRAM內存中的數據讀取到片上的傳輸時間和降低從片上的計算結果寫回片外DRAM內存中的傳輸時間。
雙緩存設計具體的結構如圖7所示。首先,第一個時鐘周期,將輸入數據通過輸入數據選擇器存入緩存1中。然后,第二時鐘周期,將輸入數據通過輸入數據選擇器存入緩存2中,同時,將緩存1中的數據通過輸出數據選擇器輸出到卷積運算單元中。第三個時鐘周期,將輸入數據存放在緩存1中,依次重復之前的操作,實現數據流水處理,降低從片外到片內數據傳輸的時間。雙緩存設計通過FPGA的片上BRAM邏輯資源實現,輸入緩存區N1和輸出緩存區N2的大小通過式(3)和式(4)計算得到。
式中:Datawidth表示輸入輸出特征圖中數據位寬大小;MBRAM表示一塊BRAM能夠存儲數據的大小。

圖7 雙緩存設計結構圖
當不采用雙緩存設計時,完成一次卷積運算總延遲時間為:
T1=Tread+Tcompute+Twrite
(5)
式中:Tread表示從片外DRAM內存中讀取數據到片上的時間;Tcompute表示片上卷積層計算的時間;Twrite表示片上的計算結果寫回到片外DRAM內存中。
當采用雙緩存設計后,完成一次卷積運算總延遲時間為:
T2=max(Tread,Tcompute,Twrite)
(6)
因此,一次卷積運算總延遲時間T2 在YOLOv2模型中每層網絡的特征圖像素值,權值參數和偏置參數均采用32位浮點數,為了降低YOLOv2網絡模型的復雜度,提高模型的推理速度,同時節約FPGA內部的硬件資源,本設計采用16位定點數量化模型。由實際測試可知不同精度消耗FPGA內部乘法器和加法器的硬件資源如表2所示。 表2 不同精度資源消耗 由表可知,采用16位定點數相比32位浮點數將節省一半以上的硬件資源。同時,實際測試發現16位定點數量化YOLOv2網絡模型準確率幾乎不變。 本設計采用Xilinx公司的pynq-z1異構平臺,主控芯片為zynq- 7020。該芯片采用雙核ARM A9處理器和FPGA架構,其中,ARM處理器端時鐘頻率為667 MHz,DDR3內存大小為512 MB,FPGA端內部硬件資源DSP48E、BRAM_36K、LUT和FF分別為220、140、53 200、106 400。本設計采用HLS軟件完成YOLOv2網絡模型硬件加速器的設計,然后將加速器IP導入Vivado軟件中完成綜合和實現后,得到硬件資源消耗如表3所示。 表3 zynq- 7020硬件資源消耗 同時,本設計對比CPU平臺的YOLOv2網絡模型實現,CPU平臺硬件參數為Intel 4核酷睿i5- 4440處理器,主頻為3.1 GHz,DDR3內存大小為8 GB。 本設計在驗證YOLOv2網絡加速器的結果正確性時,從COCO數據集的測試集中選取100幅交通工具圖片作為驗證,交通工具圖片主要包括人、自行車、汽車、摩托車、飛機、公共汽車、火車、貨車以及紅綠燈交通標志等類別。實驗在Pynq-z1開發板上的測試結果如圖8所示。 圖8 SecureCRT串口終端測試結果 首先,通過Xilinx公司的Petalinux工具定制嵌入式Linux系統,包括鏡像文件、uboot文件和根文件系統。將以上3個文件燒錄SD卡中,通過UART串口將PC與Pynq-z1開發板連接,在PC上通過串口終端SecureCRT軟件顯示檢測結果,并與PC端下測試結果進行對比。 通過測試結果表4發現,本文設計的硬件加速器在保證準確率幾乎不變的情況下,分辨率為416×416的單幅圖片計算時間縮短為1.02 s,極大提高網絡推理速度。 表4 不同硬件測試結果對比 同時,本設計與之前已有工作的硬件加速器進行對比,如表5所示。本設計的硬件加速器使用Xilinx公司的HLS軟件,采用C/C++語言進行編程,并使用優化指令對算法中的數組和For循環進行資源和性能的優化。本設計在輸入輸出接口部分充分使用雙緩存設計,通過乒乓操作,使讀取和寫入數據與計算同時進行,有效節省傳輸時延。本文為了降低模型在硬件部署上的難度,提前將YOLOv2網絡中的Bn層與權重和偏置參數進行融合。在FPGA硬件部署上針對卷積模塊采用輸入輸出二維循環展開和分塊的思想,合理設計并行乘法器的個數,提高硬件加速器的吞吐量。 表5 與已有的硬件加速器性能對比 本文設計的硬件加速器的計算性能通過GOPS(Giga Operation Per Second)指標來衡量。其中,使用GOP(十億次操作)來衡量CNN模型的復雜度。本文采用CNN模型與文獻[19]和文獻[20]對比,模型復雜度最大,同時,本文設計的硬件加速器的計算性能高于文獻[19]和文獻[20]。 本文針對目標檢測模型YOLOv2,設計一種基于FPGA的硬件加速器。該硬件加速器針對YOLOv2網絡模型中的卷積層,采用輸入輸出二維循環展開和循環分塊的方法。通過對卷積層硬件單元的設計,使用128個乘法單元并行計算,提高整個網絡的計算性能。本文在硬件加速器的輸入輸出接口部分采用雙緩存設計,通過乒乓操作使讀取,寫入和片上計算單元能夠并行操作,降低傳輸時延帶來的計算性能損失。同時,為了降低網絡模型的準確率損失和減少硬件資源的消耗,本文采用16位定點數對權重參數,偏置項參數以及輸入輸出特征圖的像素值進行量化。實驗結果顯示,本文設計的硬件加速器與通用CPU酷睿i5- 4440處理器相比,計算性能提高5.77倍,同時,在COCO數據集上保持準確率幾乎不變。除此之外,本文設計的硬件加速器在時鐘頻率為150 MHz,計算性能達到28.88 GOPS。2.4 計算精度量化

3 結果分析與討論
3.1 實驗軟硬件環境

3.2 結果驗證和性能測試對比



4 結 語