劉天洋,楊雨薇,殷世杰,孫越強,趙永輝
(東北林業大學信息與計算機工程學院,黑龍江哈爾濱,150040)
在人工智能技術的迅猛發展下,神經網絡算法在諸多方面得到廣泛應用。受困于神經網絡中巨大的乘累加計算,在CPU 上運行處理神經網絡算法的計算效率低、運行時間長,當前已不是主流的算力執行器。目前,常見的神經網絡硬件加速實驗平臺有GPU、FPGA、ASIC。對比GPU 擁有成熟的加速方案但價格相對略高以及ASIC 平臺的低功耗高性能但研發周期較長的特點,利用FPGA 加速是一個折中的方案,其具有可配置、低功耗、高性能的優點,適合進行硬件加速的研究。但目前絕大多數的神經網絡算法都是自上而下進行設計,網絡架構一般十分緊湊,其架構也因此而很難移植到FPGA 等硬件設備上,故本文以SkyNet 為代表的自下而上的網絡架構進行優化研究,該網絡架構具有可移植性好、硬件親和度高等優點,適合移動端深度神將網絡硬件加速[1]。
深度神將網絡由于其網絡體積的龐大,因而難以被部署到極其有限的計算和內存資源的嵌入式系統中,為滿足計算實時性的需求以及資源利用最大化,本文提出以下加速器的整體架構,如圖1 所示。其中,異構集成芯片中的ARM 處理器命名為PS 端,主要負責計算任務的調度與控制,包括圖像的預處理、計算邊界框、輸入輸出圖像等操作;FPGA 部分命名為PL 端,主要負責計算數據,包括計算模塊間的數據傳輸,存儲特征圖、權重等數據,數據量化等操作。

圖1 軟硬件協同加速框架
一般的浮點型神經網絡模型在進行計算推理時往往需要占用大量的計算資源,所以如果直接使用此類神經網絡模型在硬件平臺上進行推理計算,往往并不能得到預期的加速效果,因此本文采用將浮點數量化為定點數的方法對模型進行數據量化。在保證精度的前提下,使用8 位整型量化可大幅縮減數據量,從而有效解決硬件平臺資源受限所導致的算力不足的問題。以浮點數W 和A 進行卷積計算為例說明數據量化的主要原理:
由線性量化公式:


其中,SW,SA為縮放系數,ZW,ZA為偏置項,round()為按照指定的小數位數進行四舍五入運算,進而有:

其中,QW,QA均為整型變量,W,A,SW,SA均為浮點型變量,對其進行卷積計算有:

通過上式的結果可以觀察到Z 項在計算過程中多次出現,而由于在硬件計算中,類似Z 項的變量需要到寄存器中反復讀取數據從而進行計算,因而對于降低整個計算流程的延時性而言十分不友好,故可令Z=0,因而有:

進一步將變量M 轉化為2 的冪指數形式以方便硬件進行移位計算:
值得注意的是,我們看到由于 SWSA乘積結果或者說是QM一個常數,因此我們可以將其放到CPU 中進行計算以減少FPGA 計算資源負擔,并且最終得到量化后的結果有:

其中,QW,QA,QM,QB均為整型變量,W,A,B,M均為浮點型變量。
從算法角度講,卷積層的向前計算過程為一個6 層嵌套循環,只在循環的最內層進行乘累加運算。這六層循環之間沒有依賴,其順序可以任意調換。而硬件加速卷積層計算的基本原理就是,將某些循環部分展開后移至最內層,用多套乘累加電路進行并行計算,而剩余的循環依然在外層保持緊湊的嵌套結構,分時復用內層的計算電路。因此,并行度類型和大小的選擇,將很大程度決定加速器的峰值算力、硬件利用率、邏輯復雜度、片上緩存設計以及最終性能。
假設Fin 數組存儲在一個BRAM 中,BRAM 有兩個讀端口和一個寫端口,因此,可以在一個循環中執行兩個讀操作,但只能在兩個周期內順序進行寫操作,有一些方法可以在一個循環中執行這兩個語句,例如,可以將所有的Fin 數組的值存儲在獨立寄存器中,每個周期都可以對每個寄存器進行讀寫。這個循環每次迭代執行一次乘法和一次加法操作,每次迭代執行一次從數組Fin[][][]和數組W[][][][]進行讀操作,并將這兩個值相乘的結果累加到變量Fout 中。加、乘操作在for 循環中是獨立的,加法操作取決于它是如何實現的,可能取決于前一次迭代運算的結果,但是,可以展開這個循環并刪除此迭代運算的依賴關系,如代碼1 所示。

在代碼1 中每一次乘累加運算都存在以下四個操作:1)Fin[][][]中加載指定數據;2)W[][][]中加載指定數據;3)上述兩個數組相乘;4)將相乘的結果累加到Fout[][][]中。其中讀操作需要兩個時鐘周期,這是因為第一個時鐘周期提供內存地址,第二個時鐘周期完成數據傳遞,由于這兩個操作之間沒有依賴關系,所以可以并行執行。乘法操作可以從第2 個周期開始;假設它花費三個周期才能完成,即完成時是第4 個時鐘周期,在第4 個周期,加法操作開始并且能夠完成,因此一次循環需要4 個時鐘周期才能完成[2]。
最后,可以通過拆分輸入、輸出的特征圖以及卷積核等行為,將所有放在數組中的每個元素分解到它自己的寄存器中,最終形成觸發器內存,但這需要根據數組的實際大小合理拆分,避免消耗過多硬件資源。
為了驗證算法結構以及DNN 加速器架構的設計合理性,采用Xilinx 的XC7Z020 芯片進行實驗驗證,片上資源雖然不是特別豐富,但仍可基本滿足實驗要求。仿真環境為Xilinx 公司提供的集成開發環境Vivado 2018.3 及Vivado HLS 2018.3。
在100MHz 的時鐘頻率下,PL 端的資源利用率如表1所示。從設計結果的各個資源利用率來看,DSP 的資源利用率為100%,觸發器的資源利用率接近50%,但LUT 資源接近90%,該資源利用率表明此深度神經網絡加速器雖然充分利用了計算資源,但設計還需改進以降低LUT 的資源利用率,以期不需要過多的邏輯資源實現加速器的完整功能,為片上部署其他加速算法和實現用戶自定義接口保留充足的邏輯資源和片上存儲資源。上述設計的硬件加速器模塊通過Vivado綜合后實現后,功耗為2.955W,其中動態功耗為2.75W,靜態功耗為0.205W。整個計算過程中,CPU 同步調動DNN 加速器,處理1000 張320*160 的RGB 圖像平均需要303.06s。

表1 PL 端的資源利用率
本文深入分析卷積運算的原理以及在FPGA 中部署神經網絡需要進行的代碼修繕,在較高的硬件資源利用率的情況下,實現了一種深度神經網絡加速器,同時對并行度流水化以及數據類型方面進行了優化,在一定程度上滿足了低時延、低功耗的要求,可以滿足受限平臺的目標檢測任務,同時Xilinx 的XC7Z020 芯片較其他現今的絕大多數硬件加速平臺具有較為實惠的價格,更適合嵌入式部署。下一步將進一步優化硬件資源的利用,調整神經網絡架構,提高資源利用率,從而進一步提升性能。