劉天洋,楊雨薇,殷世杰,孫越強(qiáng),趙永輝
(東北林業(yè)大學(xué)信息與計算機(jī)工程學(xué)院,黑龍江哈爾濱,150040)
在人工智能技術(shù)的迅猛發(fā)展下,神經(jīng)網(wǎng)絡(luò)算法在諸多方面得到廣泛應(yīng)用。受困于神經(jīng)網(wǎng)絡(luò)中巨大的乘累加計算,在CPU 上運(yùn)行處理神經(jīng)網(wǎng)絡(luò)算法的計算效率低、運(yùn)行時間長,當(dāng)前已不是主流的算力執(zhí)行器。目前,常見的神經(jīng)網(wǎng)絡(luò)硬件加速實(shí)驗平臺有GPU、FPGA、ASIC。對比GPU 擁有成熟的加速方案但價格相對略高以及ASIC 平臺的低功耗高性能但研發(fā)周期較長的特點(diǎn),利用FPGA 加速是一個折中的方案,其具有可配置、低功耗、高性能的優(yōu)點(diǎn),適合進(jìn)行硬件加速的研究。但目前絕大多數(shù)的神經(jīng)網(wǎng)絡(luò)算法都是自上而下進(jìn)行設(shè)計,網(wǎng)絡(luò)架構(gòu)一般十分緊湊,其架構(gòu)也因此而很難移植到FPGA 等硬件設(shè)備上,故本文以SkyNet 為代表的自下而上的網(wǎng)絡(luò)架構(gòu)進(jìn)行優(yōu)化研究,該網(wǎng)絡(luò)架構(gòu)具有可移植性好、硬件親和度高等優(yōu)點(diǎn),適合移動端深度神將網(wǎng)絡(luò)硬件加速[1]。
深度神將網(wǎng)絡(luò)由于其網(wǎng)絡(luò)體積的龐大,因而難以被部署到極其有限的計算和內(nèi)存資源的嵌入式系統(tǒng)中,為滿足計算實(shí)時性的需求以及資源利用最大化,本文提出以下加速器的整體架構(gòu),如圖1 所示。其中,異構(gòu)集成芯片中的ARM 處理器命名為PS 端,主要負(fù)責(zé)計算任務(wù)的調(diào)度與控制,包括圖像的預(yù)處理、計算邊界框、輸入輸出圖像等操作;FPGA 部分命名為PL 端,主要負(fù)責(zé)計算數(shù)據(jù),包括計算模塊間的數(shù)據(jù)傳輸,存儲特征圖、權(quán)重等數(shù)據(jù),數(shù)據(jù)量化等操作。
圖1 軟硬件協(xié)同加速框架
一般的浮點(diǎn)型神經(jīng)網(wǎng)絡(luò)模型在進(jìn)行計算推理時往往需要占用大量的計算資源,所以如果直接使用此類神經(jīng)網(wǎng)絡(luò)模型在硬件平臺上進(jìn)行推理計算,往往并不能得到預(yù)期的加速效果,因此本文采用將浮點(diǎn)數(shù)量化為定點(diǎn)數(shù)的方法對模型進(jìn)行數(shù)據(jù)量化。在保證精度的前提下,使用8 位整型量化可大幅縮減數(shù)據(jù)量,從而有效解決硬件平臺資源受限所導(dǎo)致的算力不足的問題。以浮點(diǎn)數(shù)W 和A 進(jìn)行卷積計算為例說明數(shù)據(jù)量化的主要原理:
由線性量化公式:
其中,SW,SA為縮放系數(shù),ZW,ZA為偏置項,round()為按照指定的小數(shù)位數(shù)進(jìn)行四舍五入運(yùn)算,進(jìn)而有:
其中,QW,QA均為整型變量,W,A,SW,SA均為浮點(diǎn)型變量,對其進(jìn)行卷積計算有:
通過上式的結(jié)果可以觀察到Z 項在計算過程中多次出現(xiàn),而由于在硬件計算中,類似Z 項的變量需要到寄存器中反復(fù)讀取數(shù)據(jù)從而進(jìn)行計算,因而對于降低整個計算流程的延時性而言十分不友好,故可令Z=0,因而有:
進(jìn)一步將變量M 轉(zhuǎn)化為2 的冪指數(shù)形式以方便硬件進(jìn)行移位計算:
值得注意的是,我們看到由于 SWSA乘積結(jié)果或者說是QM一個常數(shù),因此我們可以將其放到CPU 中進(jìn)行計算以減少FPGA 計算資源負(fù)擔(dān),并且最終得到量化后的結(jié)果有:
其中,QW,QA,QM,QB均為整型變量,W,A,B,M均為浮點(diǎn)型變量。
從算法角度講,卷積層的向前計算過程為一個6 層嵌套循環(huán),只在循環(huán)的最內(nèi)層進(jìn)行乘累加運(yùn)算。這六層循環(huán)之間沒有依賴,其順序可以任意調(diào)換。而硬件加速卷積層計算的基本原理就是,將某些循環(huán)部分展開后移至最內(nèi)層,用多套乘累加電路進(jìn)行并行計算,而剩余的循環(huán)依然在外層保持緊湊的嵌套結(jié)構(gòu),分時復(fù)用內(nèi)層的計算電路。因此,并行度類型和大小的選擇,將很大程度決定加速器的峰值算力、硬件利用率、邏輯復(fù)雜度、片上緩存設(shè)計以及最終性能。
假設(shè)Fin 數(shù)組存儲在一個BRAM 中,BRAM 有兩個讀端口和一個寫端口,因此,可以在一個循環(huán)中執(zhí)行兩個讀操作,但只能在兩個周期內(nèi)順序進(jìn)行寫操作,有一些方法可以在一個循環(huán)中執(zhí)行這兩個語句,例如,可以將所有的Fin 數(shù)組的值存儲在獨(dú)立寄存器中,每個周期都可以對每個寄存器進(jìn)行讀寫。這個循環(huán)每次迭代執(zhí)行一次乘法和一次加法操作,每次迭代執(zhí)行一次從數(shù)組Fin[][][]和數(shù)組W[][][][]進(jìn)行讀操作,并將這兩個值相乘的結(jié)果累加到變量Fout 中。加、乘操作在for 循環(huán)中是獨(dú)立的,加法操作取決于它是如何實(shí)現(xiàn)的,可能取決于前一次迭代運(yùn)算的結(jié)果,但是,可以展開這個循環(huán)并刪除此迭代運(yùn)算的依賴關(guān)系,如代碼1 所示。
在代碼1 中每一次乘累加運(yùn)算都存在以下四個操作:1)Fin[][][]中加載指定數(shù)據(jù);2)W[][][]中加載指定數(shù)據(jù);3)上述兩個數(shù)組相乘;4)將相乘的結(jié)果累加到Fout[][][]中。其中讀操作需要兩個時鐘周期,這是因為第一個時鐘周期提供內(nèi)存地址,第二個時鐘周期完成數(shù)據(jù)傳遞,由于這兩個操作之間沒有依賴關(guān)系,所以可以并行執(zhí)行。乘法操作可以從第2 個周期開始;假設(shè)它花費(fèi)三個周期才能完成,即完成時是第4 個時鐘周期,在第4 個周期,加法操作開始并且能夠完成,因此一次循環(huán)需要4 個時鐘周期才能完成[2]。
最后,可以通過拆分輸入、輸出的特征圖以及卷積核等行為,將所有放在數(shù)組中的每個元素分解到它自己的寄存器中,最終形成觸發(fā)器內(nèi)存,但這需要根據(jù)數(shù)組的實(shí)際大小合理拆分,避免消耗過多硬件資源。
為了驗證算法結(jié)構(gòu)以及DNN 加速器架構(gòu)的設(shè)計合理性,采用Xilinx 的XC7Z020 芯片進(jìn)行實(shí)驗驗證,片上資源雖然不是特別豐富,但仍可基本滿足實(shí)驗要求。仿真環(huán)境為Xilinx 公司提供的集成開發(fā)環(huán)境Vivado 2018.3 及Vivado HLS 2018.3。
在100MHz 的時鐘頻率下,PL 端的資源利用率如表1所示。從設(shè)計結(jié)果的各個資源利用率來看,DSP 的資源利用率為100%,觸發(fā)器的資源利用率接近50%,但LUT 資源接近90%,該資源利用率表明此深度神經(jīng)網(wǎng)絡(luò)加速器雖然充分利用了計算資源,但設(shè)計還需改進(jìn)以降低LUT 的資源利用率,以期不需要過多的邏輯資源實(shí)現(xiàn)加速器的完整功能,為片上部署其他加速算法和實(shí)現(xiàn)用戶自定義接口保留充足的邏輯資源和片上存儲資源。上述設(shè)計的硬件加速器模塊通過Vivado綜合后實(shí)現(xiàn)后,功耗為2.955W,其中動態(tài)功耗為2.75W,靜態(tài)功耗為0.205W。整個計算過程中,CPU 同步調(diào)動DNN 加速器,處理1000 張320*160 的RGB 圖像平均需要303.06s。
表1 PL 端的資源利用率
本文深入分析卷積運(yùn)算的原理以及在FPGA 中部署神經(jīng)網(wǎng)絡(luò)需要進(jìn)行的代碼修繕,在較高的硬件資源利用率的情況下,實(shí)現(xiàn)了一種深度神經(jīng)網(wǎng)絡(luò)加速器,同時對并行度流水化以及數(shù)據(jù)類型方面進(jìn)行了優(yōu)化,在一定程度上滿足了低時延、低功耗的要求,可以滿足受限平臺的目標(biāo)檢測任務(wù),同時Xilinx 的XC7Z020 芯片較其他現(xiàn)今的絕大多數(shù)硬件加速平臺具有較為實(shí)惠的價格,更適合嵌入式部署。下一步將進(jìn)一步優(yōu)化硬件資源的利用,調(diào)整神經(jīng)網(wǎng)絡(luò)架構(gòu),提高資源利用率,從而進(jìn)一步提升性能。