?

基于異構計算平臺的卷積神經網絡加速器的設計?

2024-01-29 02:23周賢中
電子器件 2023年6期
關鍵詞:延時消耗卷積

王 帥,楊 帆,周賢中

(廣東工業大學信息工程學院,廣東 廣州 510006)

近年來深度學習發展迅速,并在圖像分類、目標檢測、語義分割、語音識別等[1-4]領域取得成功。然而,深度學習的模型檢測精度在不斷提升的同時,對計算性能和內存的要求也在不斷提升。當前云端GPU 部署復雜的深度學習模型面臨高帶寬消耗、高延遲性、網絡可靠性不足、用戶數據隱私難以保證等問題,因此在嵌入式邊緣計算平臺上推理復雜的深度學習模型已經成為當前的研究熱點[5]。

面對上述問題,部分學者從神經網絡本身的結構入手,優化算法模型,降低模型的運算量,如Mobilenet[6]、ShuffleNet[7]、Xception[8]等輕量級網絡。還有部分學者使用數據位寬為2~16 位的精度來代替全精度的浮點數[9-10],進一步壓縮模型。以上研究的關注點是網絡模型本身的優化,而在實際的網絡部署過程中,還需考慮硬件資源利用的合理性,系統的整體功耗以及數據傳輸吞吐率等問題。

FPGA 具有可編程性、可重構性、低延遲和低功耗等優點。若使用FPGA 加速神經網絡模型,可根據算法模型來設計硬件結構[11]。Nguyen 等[12]為了避免頻繁訪問片外存儲數據所造成的過多延時,設計了一種高效的Tera-OPS 流架構。這種架構下,網絡中所有模塊的權重數據存儲在芯片上,以最大限度地減少片外數據傳輸,提高數據的復用次數,這導致最后設計的系統對硬件資源要求較高。Yu 等[13]設計了一個參數化架構,建立資源消耗和系統時延模型,對加速器資源空間進行探索,以確定優化系統延遲的設計點,同時滿足資源約束,但是網絡模型的量化,沒有動態分配小數位。Adiono 等[14]用通用矩陣乘法的方式來加速卷積模塊,該方法將基于滑動窗的卷積乘法形式轉換為基于二維矩陣卷積乘法的形式,提高了訪存的連續性和計算效率。Chen等[15]設計了數據流水化的結構,與文獻[12]的流水化設計區別在于它只將卷積層和池化層數據流在FPGA 片上進行流水化計算。

針對上述研究現狀,本文以YOLO-FASTEST 輕量級的網絡結構為模型,在ZYNQ7020 平臺上進行部署加速。主要工作如下:①對加速器的數據緩存單元與計算單元進行參數化設置。②調整卷積循環嵌套的次序,實現輸出特征圖復用,對Bottleneck 模塊實現多層的片上流水運算。③使用16 位定點量化以及層融合的方法,將網絡模型進一步壓縮,降低硬件資源消耗和推理時間。

1 YOLO-FASTEST 算法模型

YOLO-FASTEST 是YOLO 系列改進的輕量級目標檢測網絡。網絡模型的設計思路借鑒了Mobilenet[6]的方法,引用了Bottlenecks 模塊對傳統卷積進行替代。同時使用SPP 模塊實現局部特征和全局特征的融合,豐富最終特征圖的表達能力,網絡模型的大小為3.5 MB,算法模型的復雜度為2.2 Bflops(billion float operations),在PSCAL VOC 2017數據集的mAP(Mean Average Precision)為69.43%。

YOLO-FASTEST 模型如圖1 所示,由主干網絡(backbone)和特征金字塔網絡(Feature Pyramid)組成。Bottlenecks 由3 個卷積層組成,當輸入特征圖與輸出特征的尺寸相等時帶有一個shortcut 層,為Res-Bottlenecks。SPP 模塊是由3 個尺寸為3×3、5×5 以及9×9 的最大池化層組成。模型共由84 個卷積層、3 個最大池化層、1 個上采樣層、18 個shortcut 層、2 個YOLO 層以及5 個路由層組成。最終輸出特征圖分辨率大小有13×13 和26×26 兩種,分別負責大目標和小目標的檢測。

圖1 YOLO-FSATEST 網絡結構

2 系統設計

系統的整體架構如圖2 所示,由PL 端FPGA 搭建的加速器與PS 端CPU 構成。PL 端加速器的架構以單指令多數據流的形式,由控制器、計算單元和數據緩存單元三部分組成。

當需要計算任務時,PS 端通過AXI-lite 將任務指令傳輸至PL 端的控制器中進行解析并以參數的形式傳輸至計算單元和數據緩沖單元。計算單元和數據緩沖單元分批次通過AXI 總線從外部存儲器中讀取數據、計算加速以及寫回數據。

Bottlenecks 模塊在PL 端上多層流水加速,最大池化層、上采樣層、shortcut 層使用PL 端單層流水加速。路由層引用前面層的特征圖,不涉及計算,通過PS 端的調度來完成。YOLO 層涉及復雜的指數計算以及sigmod 激活函數,使用PL 端計算將耗費大量資源,因此將YOLO 層的運算放入PS 端內。

PL 端內計算單元的計算能力以及數據緩存單元的數據吞吐量受FPGA 內部的資源約束,需要設計合理的優化方案,在有限的資源下,構建性能良好的加速器。

2.1 數據緩存單元

數據緩存單元的設計如圖3 所示,單元中包含行緩存、輸入數據緩存、輸出數據緩存。數據在PL端內傳輸使用雙緩存乒乓傳輸,每個緩存區在循環的周期內交替執行兩項指令:1、存儲上一個緩存或外部存儲傳來的數據。2、將存儲的數據傳輸到下個緩存或外部存儲。例如當一個周期內行緩存1 執行指令1 時,此時行緩存2 則執行指令2。同理,輸入緩存1 執行指令1 時,此時輸入緩存2 則執行指令2。這種數據傳輸模式以空間換時間,用數據傳輸的時間來掩蓋計算時間。

PL 端的片內BRAM 資源無法容下整個特征圖的數據,采取對輸入特征圖進行切割分塊送入片上緩存進行運算,權重根據輸入特征圖做對應的分割。設置Si、So、Sr、Sc 四個切割參數分別對特征圖的輸入通道、輸出通道、輸出行數、輸出列數進行切割。由上述切割參數得到的PL 端數據緩存設置及BRAM 資源消耗,如表1 所示。

表1 PL 端數據緩存配置以及BRAM 資源消耗

數據緩存配置中的S為步距,K為卷積核的寬,Nin為PL 端輸入接口的數量,Nout為PL 端輸出接口的數量。中間特征圖緩存用來存儲Bottlenecks 內DW(Depthwise Convolution)層的輸入特征圖以及shortcut 層另一個輸入特征圖。

CBRAM為單個BRAM 的存儲容量18 k,bitwidth為數據位寬。以上緩存均乘以2 表示使用雙緩存。權重緩存的數據量較少,因此使用LUT 存儲,不消耗BRAM 資源。表1 中所有緩存消耗BRAM 總和應小于等于片上BRAM 總量。

給定以上數據緩存配置,PL 端時鐘頻率f,使用雙緩存乒乓傳輸,從片外讀取數據到輸入緩存需循環((Sr-1)×S+K+1)×次,從輸出緩存到片外存儲需循環(次,輸入輸出緩存延時表達式如下:

設某層需使用PL 端循環計算N次,計算單元的時延設為Tcom,雙緩存乒乓傳輸下PL 端單層運算的總時延為:

2.2 計算單元

計算單元內部根據層類別劃分,構建類別不同的計算電路,利用時分復用的思想,在每個時鐘周期不間斷地計算來自數據緩存單元傳輸的數據。

卷積計算單元如圖4 所示,由乘法器陣列和累加器構成。對輸入通道和輸出通道的維度進行并行乘法計算,不同輸入通道上的同一坐標像素值與權重進行乘積,經累加器后將部分和暫存至寄存器中,等待與下一計算周期的部分和相加。直至權重滑動窗內的值都乘完后,將寄存器內的值通過多個輸出通道維度保存至輸出緩存中。

圖4 卷積計算單元

在實際評估中,需要考慮計算并行度與資源約束之間的關系,DSP48e1 是FPGA 內部的專用硬件資源,用DSP48e1 構建乘法器陣列應滿足式(4)的要求,其中NMul是乘法器的數量,Pi和Po分別表示輸入通道和輸出通道計算并行度參數,NDSP表示一個乘法器消耗的DSP48e1 的資源,與數據位寬bitwidth 有關。

給定時鐘頻率f、計算并行度參數Pi和Po以及片上數據緩存配置,單次卷積計算單元的處理時延Tconv為:

其他模塊的計算單元如圖5 所示,圖5(a)所示是最大池化層計算單元,將用于輸出的寄存器賦最小初始值,每個循環周期與輸入的寄存器進行比較,將最大值保存至輸出寄存器,當滑動窗內的值都比較完后,輸出寄存器內的值保存至輸出緩存中。圖5(b)所示是上采樣層,上采樣層是將特征圖的長和寬擴展,上采樣單元使用寄存器取出輸入緩存的值暫存后,根據擴展的比例大小循環存入輸出緩存中。圖5(c)所示為shortcut 層,將來自兩個不同層的特征圖進行相加。

圖5 其他模塊計算單元

這三類模塊由于輸入輸出通道的維度相等,計算單元的并行度Pi=Po。給定時鐘頻率f,三類模塊處理時延Tmax、Tshortcut、Tupsample為:

3 優化方法

3.1 卷積層輸出特征圖復用

PL 端的卷積運算由四層循環嵌套組成。傳統的權重窗口復用模式,將輸出特征圖的行和列的循環放入最內層,每輪循環復用權重數據,優先計算出完整的輸出特征圖,然后對輸出通道進行循環。這種方法適用于PL 端對單個層的計算加速。

對于PL 端上連續多層流水運算,若使用權重復用的方法,優先計算出完整的輸出特征圖,會造成較大的延時。調整循環嵌套順序,每次只計算出部分輸出特征圖就傳遞給下一層,無需等待完整的輸出特征圖。如圖6 所示,循環嵌套由內到外按照LOOP1 至LOOP4 的順序分別對輸入特征圖通道、輸出特征圖的通道、輸出特征圖行和列進行計算。每次循環的部分和暫存至輸出緩存內,待下一輪循環的時候再復用。當LOOP1 循環結束后,所有部分和累加后的最終結果從輸出緩存寫回至片外存儲或者傳遞至下一層。每層的循環間隔等于設置的4 個切割參數Si、So、Sc 和Sr。

圖6 輸出特征圖復用

使用輸出特征圖復用模式,設In 為輸入特征圖通道數,Out 為輸出特征圖通道數,則「In/Si?個循環周期后,即可將輸出緩存內的數據傳至下一層的計算單元中。

3.2 PL 端多層流水

PL 端連續多層流水相比于單層流水,可減少PL 端與外部存儲器數據交互的次數,網絡結構中的Bottleneck 由三層卷積組成,且結構固定,適合于整個模塊放入FPGA 片上緩存進行多層流水計算,模塊結構如圖7 所示。輸入特征圖緩存首先經過第一層PW(pointwise)卷積,卷積結果存儲在中間緩存內,中間緩存經過第二層DW(depthwise)卷積后,將結果覆蓋至輸入特征圖緩存,最后再經過第三層PW(pointwise)卷積后,將計算結果存入輸出緩存內。DW 卷積的卷積核無輸入通道維度,卷積單元只對輸出通道進行并行度為Po的并行運算。

使用輸出特征圖復用的模式,給定時鐘頻率f,第一層PW1 輸入輸出特征通道為In1 和Out1,使用雙緩存乒乓傳輸,輸入緩存延時Tinput與計算延時Tconv1重疊「In1/Si?次,取二者最大值。PW1 的延時表達式TPW1如下:

PW1 層的計算結果送入DW 層的進行運算,DW 計算單元延時Tconv2,DW 層的延時表達式TDW如下:

DW 層計算完后,緊接著進行PW2 層的計算。In2、Out2 為PW2 層的輸入通道數和輸出通道數,PW2 層「In2/Si?次的循環后,將結果通過輸出緩存寫回至外部存儲中,PW2 層的延時表達式TPW2如下:

使用雙緩沖乒乓傳輸后,輸出緩存延時Tout與PW2 層的延時TPW2重疊(「Out2/So?-1)次,取二者最大值。Bottleneck 輸出部分特征圖的延時TBneck的表達式如下:

3.3 模型量化

模型的量化是指權重、偏置、特征圖的數據由32 位浮點數,映射為16 位、8 位等低位寬數。使用低位寬數據在PL 端上進行存儲和計算可以節約BRAM 和DSP 的資源,但模型的精度也有所下降。

本文使用一種逐層定點16 位量化的方法[10],16 位的定點數中使用1 位符號位,Q位小數位,剩下位表示整數位。量化過程中浮點數xfloat與定點數xfixed之間相互映射的關系式如下:

L表示定點數位寬,式(13)將浮點數的小數位在定點數中使用Q位表示,Q取值越大,定點數的精度就越高。式(14)將定點數還原成浮點數。模型每層根據參數的取值范圍的不同,用不同的Q值來量化該層。

對84 層卷積的權重使用定點8 bit 和16 bit 的量化方法,利用式(15)計算總誤差和平均每層的誤差,根據表2 結果顯示,本文將使用16 bit 的量化方案。

表2 定點量化權重誤差

3.4 卷積層與批量歸一化層融合

批量歸一化層(Batch Normalization)能提高網絡的訓練速度,在模型推理階段BN 層的計算固定,可以將其融合進卷積運算之中,加速推理時間,節約硬件資源。卷積層的計算式(16)和BN 層的計算式(17)如下:

式(16)和式(17)中X與Y都表示輸入特征圖和輸出特征圖,式(16)中W和B表示卷積層的權重和偏置。式(17)中γ為尺度參數,β為偏置參數,μ為輸入樣本的均值,δ為輸入樣本的標準差,這四個參數是在訓練后已學習到的。ε通常設定為一個極小的值(如0.000 001),以防止分母為0 的情況。卷積層與BN 層的融合如式(18)所示:

化簡:

融合后的新權重值Wmerged=,新偏置,預先計算出新的權重值和新的偏置,在FPGA 中直接進行融合后卷積運算,提高推理速度。

4 實驗結果及評估

系統開發平臺使用Xilinx 的Vivado 設計套件,使用高層次綜合工具Vivado HLS 2019.1 設計YOLO-FASTEST 加速器IP 核,然后將設計好的IP核與ARM9 以及片外DDR3 在Vivado 2019.1 上進行綜合、布局布線。最后,使用Vivado SDK 2019.1對ARM CPU 進行開發。

PL 端內的硬件資源包含630 KB 的BRAM、220個DSP48E、53 200 個LUT、106 400 個FF。PS 端主要使用的是雙核ARM Cortex-A9 硬核處理器和一個存儲大小為512 MB 的DRAM。特征圖和權重數據均存儲在片外DRAM 中的。在PL 端內的AXI_DMA IP 核為四通道的AXI_HP 存儲映射接口和AXI-Stream 接口之間提供高帶寬的直接存儲訪問。PS 端發出的控制指令則由AXI_GP 接口以及PL 端內部的AXI interconnect IP 核進行傳輸。

4.1 資源消耗與時延評估

在雙緩存流水機制下,數據緩存單元中切割因子設置為Si =12、So =12、Sr =26、Sc =26,輸入輸出接口Nin=Nout=4,步距S=2,卷積核尺寸K=3,數據位寬bitwidth 為16 位定點數。以上參數確定后結合表1,預估需消耗184 個BRAM。

Bottelneck 模塊內有PW 卷積和DW 卷積,需設置不同的卷積計算單元。PW 卷積計算單元的并行度參數Pi=Po=12,DW 卷積計算單元的并行度參數Po=12。FPGA 內部兩個16 位數的乘法運算消耗NDSP=1,依據式(4),PW 和DW 卷積預估需消耗共156 個DSP48e1。

Vivado 系統綜合后消耗的實際資源如表3 所示,實際消耗BRAM 比預估多消耗19 個,可能用于PL 端輸入輸出接口緩存。實際消耗的DSP48e1 比預估多消耗16 個,可能用于其他計算單元的消耗。

表3 PL 端資源消耗

給定數據緩存單元的配置以及優化方法,PL 端的時鐘頻率為150 MHz,根據各模塊延時表達式(3)和式(12),展示部分模塊時延預估,選擇圖1 中Id =3 的Bottleneck 和shortcut 模塊、SPP 中三個Max pooling 以及Upsample,如表4 所示,實際時延與預估時延的誤差可能來自各模塊的初始化延時以及BRAM 中數據讀取和存儲的延時。

表4 PL 端加速器部分模塊時延 單位:ms

4.2 不同平臺性能對比

將本文在不同的平臺對同一目標檢測網絡YOLO-FASTEST 進行推理,對功耗、檢測精度、計算性能、能耗比和單幀延時進行評估。在服務器端的CPU(I5-8300H)以及GPU(GTX1050ti) 上使用Darknet 框架進行模型推理,數據類型為浮點數。在嵌入式端分為僅ARM-A9 推理以及ARM-A9+FPGA聯合推理,數據類型為16 位定點數。

結果如表5 所示,檢測精度方面,在PSCAL VOC 2017 的數據集上,嵌入式端數據量化后的檢測精度相比服務器端的檢測精度僅降低1.3%。在性能表現方面,嵌入式端的功耗要遠低于服務器端,但是僅ARM9 推理模型的單幀延時較高,無法滿足目標檢測實時性的需要。本文設計的ARM-A9+FPGA的推理框架,能耗比達到5.27 GFLOPS/W,約為嵌入式端ARM-A9 的48 倍,服務器端CPU 的55 倍,GPU 的20 倍。單幀延時為163 ms,滿足目標檢測的實時性。

表5 不同平臺的參數對比

將本文的設計與前人的工作進行對比,如表6 所示,文獻[12]提出的體系結構側重于最大限度地提高系統的吞吐量,因此,網絡的每一層都映射到一個專用的硬件塊。特征圖、權重、偏置都存儲在片上緩存中,以盡量減少片外的數據傳輸延時,取得了極高計算性能。但其對片上存儲資源的要求較高且可重構性較差。文獻[14]使用了通用矩陣乘法來加速卷積層,需將輸入特征圖轉換為通用矩陣的形式,此過程需消耗較多的BRAM 與DSP 資源。文獻[15]使用層間流水的方式,內部硬件控制器使卷積層的數據流直接與池化層進行連接,可降低數據與片外存儲傳輸的次數。這種方法的卷積計算使用的是滑動窗口的方式,且僅適合卷積層后緊跟池化層的情況。

表6 與文獻設計的系統對比

5 總結

本文提出一種將目標檢測網絡YOLO-FASTEST在低成本的異構計算平臺上運行推理的方法。針對網絡結構中的Bottleneck 模塊,本文使用特征圖復用的運算模式,降低多層片上流水延時。同時本文建立數據單元和計算單元與PL 端的資源約束關系式,使設計方案滿足低成本計算平臺的資源約束。設計的系統根據參數調節可移植至任意資源的FPGA 計算平臺。未來的改進工作將集中在算法加速方面,例如使用Winograd 快速矩陣乘法對3×3 大小的卷積層進行加速。

猜你喜歡
延時消耗卷積
如此消耗卡路里
玉鋼燒結降低固體燃料消耗實踐
基于3D-Winograd的快速卷積算法設計及FPGA實現
降低鋼鐵料消耗的生產實踐
基于級聯步進延時的順序等效采樣方法及實現
從濾波器理解卷積
我們消耗很多能源
基于傅里葉域卷積表示的目標跟蹤算法
Two-dimensional Eulerian-Lagrangian Modeling of Shocks on an Electronic Package Embedded in a Projectile with Ultra-high Acceleration
一種基于卷積神經網絡的性別識別方法
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合