黃 瑞,金光浩,李 磊,姜文超,宋慶增
(1.天津工業大學 計算機科學與技術學院,天津 300387;2.廣東工業大學 計算機學院,廣州 510006)
隨著深度學習技術的快速發展,諸如智慧城市、智能醫療、無人駕駛、軍事安防等場景,都在大量部署各種基于深度學習技術的設備。這些應用場景、對設備的功耗、延遲、資源利用、實時性等方面有嚴格的要求。利用通用的CPU 和GPU 設備實現這些應用往往不是最佳選擇。與通用的CPU 和GPU 設備相比,專用的神經網絡加速器,尤其是基于現場可編程門陣列(Field Programmable Gate Array,FPGA)平臺設計的神經網絡加速器,在性能、實時性、價格等方面具有優勢。
對于卷積神經網絡算法的研究,多數研究者的關注點在于提高模型的準確率。在此趨勢下,卷積神經網絡的層數和寬度不斷加深,這導致參數和計算量越來越大,從而無法在各種功耗和性能受限的平臺上運行。為解決這一問題,研究者提出了各種輕量化神經網絡模型。輕量化神經網絡模型是專門針對功耗和性能受限平臺設計的輕量且高效的神經網絡模型。相較于傳統卷積神經網絡,輕量化神經網絡計算復雜度更低且參數規模大幅縮減,具有結構簡單、運行速度快等顯著優點。
目前大部分神經網絡加速器僅支持實現低效率的卷積神經網絡(如Alex Net 和VGG16),并不支持以MobileNet 為代表的輕量化神經網絡。本文設計并實現面向輕量化網絡MobileNet 可配置的神經網絡加速器。針對MobileNetV3 的輕量化模塊,加入優化的PW 模塊和DW 模塊,同時利用可配置化(指令)設計,實現通過修改上位機的程序支持各種不同的網絡結構的功能。此外,通過8 bit 定點、流水和并行化等優化技術,使加速器在資源利用、性能、功耗等方面更具優勢。
基于FPGA 的神經網絡加速器設計是一個備受關注的課題。文獻[1]設計了一個用于大規模圖像分類的FPGA 神經網絡加速器;文獻[2]通過重復輸入特征圖提高帶寬利用率,改善了神經網絡加速器;文獻[3]提出以ping-pang 方式調整緩存數據量,在一定程度上提升了卷積加速器的性能;文獻[4]則提出軟硬件協同設計方法;文獻[5]考慮了DSP 資源優化和卷積神經網絡分類準確率的問題。
神經網絡結構的輕量化也是目前備受關注的研究主題,輕量化網絡結構在保證準確率的同時使得模型體積更小,速度更快。SqueezeNet[6]模型使用分解卷積核技術使得模型體積更小,速度更快;ShuffleNet模型[7]采用殘差網絡思想;而Xception 模型[8]采用更改卷積運算流程降低計算量;MobileNet 模型[9]采用逐通道卷積減少計算量。
輕量化網絡移植到資源受限的平臺上具有巨大的優勢,但為了滿足實時性要求和資源利用最大化,本文針對輕量化網絡模型設計軟硬協同加速框架,如圖1 所示,其中TJPU 架構如圖2 所示。

圖1 軟硬協同加速框架Fig.1 Software and hardware coacceleration framework

圖2 TJPU 架構Fig.2 Architecture of TJPU
在根據相互關系設計出軟硬件協同加速框架中,軟件部分負責計算任務的調度和控制,硬件部分負責計算數據。由于加速器的存儲資源和計算資源有限,因此本文通過軟件將輕量化神經網絡模型中一層計算所需的參數經由PCIE 存儲到DDR 中,圖片數據通過上位機直接寫入到計算單元TJPU 中,計算出來的結果保存到DDR 中。通過以一層計算為單位,減少模型對于硬件存儲資源的需求。
MobileNet 的基本單元是深度可分離卷積(Depthwise Separable Convolution,DSC),其可以分解為2 個更小的操作,即Depthwise Convolution(DW)和Pointwise Convolution(PW)。DW 負責通道卷積,PW 負責串聯feature map。這種方法比傳統卷積減少8~9 倍的計算量。
為支持MobileNet 結構,本文設計的卷積算子分為Conv2d、PW、DW、Reshape 4 個基本模塊。通過軟件不同的調度順序,以實現不同輕量化神經網絡模型的計算。當然,除了支持MobileNet 結構外,其他由Conv2d、PW、DW 和Reshape 模塊構成的網絡結構都可以在該加速器中實現。
FPGA 存儲資源受限且不適合浮點運算,而正常訓練的浮點神經網絡模型進行推斷,需要占用大量的計算資源,這對于AI 處理器來說是難以適用的。因此,直接使用網絡模型參數進行計算,不能在算力上發揮優勢,加快模型推斷速度。本文采用8 bit 定點數,需要對浮點模型進行量化。量化方法主要用于壓縮參數量和減少參數資源的占用量。在保證精度的前提下,使用INT8 量化大幅縮減參數量,解決硬件平臺存儲資源受限問題。
線性量化公式如式(1)和式(2)所示。

其中:round(·)表示四舍五入處理;S表示縮放的系數;Z代表的是零點;Clamp 代表截斷操作;Nlevels由量化的位數決定,如8 位則為28=256。線性量化公式的反量化公式為:

在進行卷積運算操作時,原卷積公式變為如下公式:

文獻[10]中的實驗結果表明,多數神經網絡模型使用此方法進行8 bit 數據量化造成的精度損失在3%以內。
并行度優化和流水優化是常用的硬件優化策略,并行度優化是指將數據切分為多個部分進行并行化計算從而達到提高計算效率的目的。本文針對卷積的6 個循環進行并行度的優化:1)同時計算4 張圖片;2)卷積展開,3×3 卷積核直接用9 個乘法器進行計算;3)輸入通道和輸出通道分塊,按照8 入通道8 出通道進行并行,進一步增加其并行度。
在流水優化方面,采用ping-pang 操作流水優化通過降低傳播時延,提高系統頻率和吞吐量,優化運行速度。ping-pang 操作是利用數據緩存,將ping 路數據處理完保存在pang 路的緩存`中,ping 路可以繼續處理上一級的數據,pang 路無需等待,直接從緩存中讀取數據進行處理。
Conv2d 模塊的功能是實現通常的3×3 卷積,如圖3 所示,該模塊由Switch、Block RAM、Weight RAM、控制單元、乘加樹模塊、截斷、Data_generate、Stride、Pool 等組成。在上位機指令的控制下,控制單元首先發出讀數據操作,從DDR 中將權重數據讀入到Block RAM 中;然后啟動卷積計算,特征圖的數據經過Data_generate 模塊,生成特定格式的數據,這些數據與已經讀入的權重數據進行乘加操作;最后計算結果經過截斷后,經過Stride 和Pool 后,輸出到DDR中。這里需要注意的是,Stride 和Pool 可以通過上位機指令進行開關。當需要計算的卷積沒有Stride 或者Pool 時,只需要在上位機配置即可。

圖3 Conv2d 模塊框圖Fig.3 Block diagram of Conv2d module
PW 實現1×1 卷積功能,采用通用框架設計。如圖4 所示,該模塊由Switch、Block RAM、Weight RAM、控制單元、乘加樹、截斷等組成。Switch 模塊是一個數據通路選擇模塊,控制數據流通,Bolck RAM模塊存放計算參數,乘加樹進行卷積乘法通道相加操作,截斷模塊進行量化操作。整個PW 模塊由不同功能模塊進行靈活組合,提高復用率。整個模塊通過上位機發送指令,由指令解析模塊進行解析配置,PW 控制單位完成數據通路選擇和計算啟動的控制。

圖4 PW 模塊框圖Fig.4 Block diagram of PW module
DW 模塊完成深度卷積操作,與Cond2d 類似,在MobileNet 網絡結構中DW 模塊無需進行Stride 和Pool。根據上述分析,本文設計如圖5 所示的DW 模塊。DW 模塊主要由Data_generate、Switch、Block RAM、Weight RAM、控制單元、乘加樹模塊、截斷模塊等結構組成。Data_generate 模塊將數據轉換成可卷積的3 行數據,其他模塊由PW 模塊中的功能模塊組成,完成DW 模塊所需的功能。

圖5 DW 模塊框圖Fig.5 Block diagram of DW module
Reshape模塊主要完成數據的重排操作,MobileNet結構需要完成Contact 和Upsample 2 種數據重排操作。因此,如圖6所示,Reshape 模塊由2個Switch、Block RAM模塊、Weight RAM、Contact、Upsample等結構組成。數據通過Switch 進行選擇,如果配置為Upsample 功能,數據將會流入到Upsample 模塊中,進行Upsample 操作后,數據通過Switch 寫入DDR。如果配置為contact 功能,那么數據就會分成兩路通過Switch 分別進入到Contact 和BlockRam,進行Contact 操作后,寫入DDR。

圖6 Reshape 模塊框圖Fig.6 Block diagram of Reshape module
AI 處理器指令集[11-13]在設計上滿足輕量化網絡模型通用配置。因為要考慮輕量化網絡模型的兼容性,所以指令集的設計采用精簡指令集。指令集包含參數配置指令、計算配置指令等。
上位機通過配置指令集,調度AI 處理器內部卷積算子的運算[14-16]。由于片上資源有限,為解決計算量龐大問題,上位機調度采用一層計算為一個單元進行調度,從而減少參數占用資源,降低計算量,同時使得輕量化網絡模型更加通用化配置。
指令集設計采用精簡指令設計方法,頂層指令控制模塊類似一個仲裁器,其不進行復雜的控制。由于計算流程的控制上移到軟件,各個模塊的控制主要在自己模塊內部,因此頂層控制模塊只是控制數據的通路[17],上位機啟動功能模塊的運行,根據結束后功能模塊的返回信號,啟動DMA 的讀寫。邏輯的正確性保證完全來自于上位機如圖7 和圖8 所示,頂層指令控制模塊包含Padding、Stride、Row_num、Channel_num等參數,配置卷積模塊所需的計算參數和啟動信號,同時配置參數指令和配置計算指令共享reg4 和reg5 寄存器,由此優化寄存器空間,降低資源使用率。

圖7 頂層配置指令Fig.7 Top-level configuration instruction

圖8 計算配置指令Fig.8 Calculation configuration instruction
上位機采用C++語言編寫,主要實現圖片的預處理、Yolo 層的檢測(主要計算為非極大值抑制)、檢測結果、輸出和FPGA 的任務調度[18-19]等功能。圖片預處理部分的任務有圖像的讀取/視頻抽幀、圖像縮放等。這部分需要借助OpenCV 等圖像/視頻處理庫實現,其操作的類型繁多。Yolo 算法檢測部分主要為特征向量的提取、非極大值抑制等,這些操作都是串行的操作,在主機上能夠非常高效地完成。檢測結果的輸出(包括畫框等)也是串行計算。除了上述任務之外,上位機還負責FPGA 任務的調度,即FPGA 完成的計算任務都是在上位機的控制下完成的。
上位機流程如圖9 所示。FPGA 調度由硬件模塊精簡控制,按照輕量化網絡計算的一層一層完成,每一層的計算主要按照配置參數啟動計算、完成計算。FPGA 調度流程如圖10 所示。

圖9 上位機流程Fig.9 Procedure of host computer

圖10 FPGA 調度流程Fig.10 Procedure of FPGA scheduling
FPGA 選擇690T 和VU9P 2 種芯片作為實現芯片,其中690T 是目前國產芯片能夠達到最大容量的FPGA 芯片,VU9P 則具有更高的容量。本文選擇2 種嵌入式GPU作為參照,其中Jetson Xavier 是英偉達最新的嵌入式GPU。
數據集采用sar 圖像數據集,網絡結構選擇輕量化網絡結構Yolo tiny 和MobileNetV3 & YoloV3。
表1 給出了本文設計的處理器在兩種芯片上的時鐘頻率和資源利用情況。由于本文采用參數化設計技術,設計的神經網絡處理器可以根據FPGA 的容量進行伸縮。在容量較少的芯片(690T)上,可以使用較少的硬件資源,速度也較慢。在容量加大的芯片(VU9P)上,使用較多的資源,從而達到更高的速度。

表1 主頻與資源利用情況Table 1 Main frequency and resource utilization
通過修改上位機程序,首先完成了Yolo Tiny 網絡在FPGA 上的實現,Yolo Tiny 結構沒有使用DW和PW 模塊。表2 給出了Yolo Tiny 在不同設備上的精度和性能,其中FPGA 指的是VU9P。可以看出:盡管FPGA 使用INT8 格式,但其精度與嵌入式GPU相當;在速度上,FPGA 能達到85 frame/s,超過了Jetson nano 和Jetson Xavier;當然,FPGA 開發板的功耗也是最高的,達到35 W。

表2 Yolo Tiny 在不同設備上的性能對比Table 2 Yolo Tiny performance comparison in different devices
與Yolo Tiny結構不同,YoloV3 & MobileNetV3[20-21]是一種輕量化的網絡結構,其中大量使用輕量化模塊(DW 和PW)。表3 給出了YoloV3 & MobileNetV3在不同設備上的精度和性能。可以看出:在精度上,FPGA 實現精度下降約4%,這也是可以接受的精度損失;在速度上,FPGA 實現能達到62 frame/s,同樣超過Jetson nano 和Jetson Xavier 實現;相對于Yolo Tiny 實現,YoloV3 & MobileNetV3 的功耗從35 W 提 高到了38 W,這也是因為YoloV3 & MobileNetV3 使用了DW 和PW 模塊導致的。

表3 YoloV3 & MobileNetV3 在不同設備上的性能對比Table 3 Performance comparison of YoloV3 & MobileNetV3 in different devices
當FPGA 加速器不包含輕量化模塊時,實現YoloV3 & MobileNetV3 模型的方法有2 種,一種是使用Conv2d 模塊替代DW 和PW(通過填零來實現),另一種是將中間結果傳回主機,由主機的CPU 實現DW 模塊和PW 模 塊。
表4 給出了這2 種實現方法與本文設計的對比,通過實驗數據可知,使用輕量化模塊的推斷速度遠比其他2 種方法速度快。

表4 輕量化模型性能對比Table 4 Performance comparison of lightweight models (frame·s-1)
為提高嵌入式GPU 的運行速度和性能,本文設計并實現一種輕量化的神經網絡加速器,通過優化實現PW、DW 模塊,在一定程度上滿足低時延、低功耗的要求。同時該加速器支持指令執行,可以應用于不同的網絡結構。實驗結果表明,本文設計的神經網絡加速器在VU9P FPGA 芯片上可達到較快速度,并且功耗較低,可以完成受限平臺中的目標檢測任務。下一步將實現本文設計對4 bit、2 bit 等更低比特精度量化的支持,并提高資源利用率,從而進一步優化加速器性能。