張 萌 張 雨 張經緯 曹新野 李 鶴
(東南大學電子科學與工程學院 南京 210096)
隨著物聯網(Internet of Things, IoT)和人工智能行業的發展,神經網絡在許多應用場景中的性能已超越傳統算法[1,2]。FPGA具有高度可編程性,可以滿足應用場景中的延遲、功耗等要求,因此FPGA已成為部署神經網絡的流行平臺之一[3–5]。目前只有豐富設計經驗的硬件研究人員才能在目標平臺上部署滿足性能目標的神經網絡加速器,這阻礙了神經網絡的進一步發展。于是各種神經網絡前向推理框架不斷涌現[6–9],可以解析神經網絡算法的高級描述,捕獲網絡的結構等關鍵信息,然后自動映射為目標平臺的硬件描述。
但是目前主流的神經網絡推理框架還沒有充分考慮到在邊緣端FPGA計算資源有限的情況下,高效地探索設計空間,平衡好資源占用和性能表現,主要還存在下列不足:(1) 很少考慮在邊緣端設備計算資源十分有限的情況下,為神經網絡定制高效的硬件加速算子,提高資源利用率和性能表現。(2) 忽略了對設計空間探索(Design Space Exploration, DSE)算法的優化,常規的啟發式算法對超參數的設置十分敏感,需要多次的實驗嘗試不同的初始參數。
為了應對上述的挑戰,本文設計能夠在邊緣端FPGA上高效部署神經網絡的推理框架NN-Edge-Builder,主要貢獻如下:
(1) 設計一個基于數據流結構的神經網絡推理框架NN-EdgeBuilder,讓神經網絡算法領域內的研究人員不需要掌握深厚的硬件加速器設計經驗,也可以快速地驗證自己設計的網絡模塊的硬件性能,提高FPGA在神經網絡生態中的適用性。
(2) 設計了高效的量化模塊,既支持量化感知訓練,又支持訓練后量化,能夠最大限度地保證神經網絡的精度。
(3) 開發了通用且高性能的硬件加速算子庫,將網絡中計算量最大的Conv和FC層映射到Conv/FC層通用計算單元來適應不同的量化位寬和資源限制。
(4) 設計了一個基于多目標貝葉斯優化的設計空間探索算法,使用具有混合核函數的高斯過程作為代理模型可以有效地提取混合設計空間的信息,使用帶約束的多目標采集函數來處理邊緣端FPGA的資源限制,可以高效地搜索出滿足要求的設計點。
本文其余安排如下:第2節介紹推理框架NNEdgeBuilder的總體架構和Conv/FC層通用計算單元;第3節介紹專為NN-EdgeBuilder定制的設計空間探索算法;第4節將討論我們使用NN-Edge-Builder部署神經網絡模型的實驗結果;第5節給出結論。
本文設計的神經網絡推理框架NN-EdgeBuilder能夠在邊緣端FPGA平臺上自動部署神經網絡模型,實現檢測精度,推理速度和關鍵資源占用等性能指標的平衡。圖1虛線框中的部分展示了NN-Edge-Builder的部署網絡模型的完整流程,主要包含網絡模型解析,設計空間探索和調用硬件加速算子這3個階段,具體流程如下:首先網絡模型解析模塊會解析已經訓練好的模型,提取推理階段網絡每層所需的信息,刪除冗余信息,接著會進一步配置網絡的通用信息,如每層的量化位寬和并行度因子等信息,最后會配置每層的專用信息,如確定每層使用的硬件加速算子等,解析完網絡模型之后會輸出完整的計算圖。

圖1 推理框架NN-EdgeBuilder部署網絡模型的流程
設計空間探索階段使用了第3節設計的基于多目標貝葉斯優化的設計空間探索算法,可以探索網絡任意層的輸出位寬和并行度因子,每次迭代并通過采集函數確定下一個采樣點,然后調用EDA工具流得到準確的目標函數值,并以此更新數據集和代理模型,直到滿足停止條件,輸出帕累托前沿設計點。
硬件加速算子庫為推理框架支持的所有網絡模塊都設計了對應的加速算子,通過計算圖連接成一個完整的加速器。針對邊緣端FPGA資源有限的現狀,本文設計了低推理延遲和低資源占用的FC/Conv層通用計算單元。NN-EdgeBuilder有兩種格式的輸出:第1種是可以導出加速器的IP并將其集成到更大的設計中。第2種則是生成加速器的比特流,可以直接部署到硬件平臺上。
為了能夠最大限度地保持推理框架部署加速器的精度,NN-EdgeBuilder的量化模塊包含兩個子模塊,分別支持量化感知訓練(Quantization-Aware Training, QAT)[8]和訓練后量化(Post-Training Quantization, PTQ)[10]。量化感知訓練子模塊可以解析經過量化感知訓練的網絡層,保留其量化配置并固定到計算圖中,在設計空間探索階段這些網絡層的權重位寬保持不變,以此利用量化感知訓練精度高的特點。訓練后量化子模塊主要針對推理過程中網絡每層的輸出位寬量化,由于在保持精度的情況下網絡的某些層能夠進行更低比特的量化,所以訓練后量化子模塊采用異構量化,能夠在低硬件資源占用的情況下實現高精度。網絡每層的輸出量化位寬由設計空間探索模塊給出,可以細粒度地探索網絡每層的輸出量化位寬,來達到加速器的最優性能表現。
NN-EdgeBuilder生成的是數據流結構的加速器,會為網絡的每一層都例化單獨的硬件模塊,每一層都會例化單獨的緩存器(Buffer)以及基本運算單元(Multiply ACcumulate, MAC),所以每個部分的量化位寬會不一樣,對于后續硬件生成的緩存器以及MAC沒有影響。圖2為推理框架NN-EdgeBuilder部署加速器時的量化流程,其中 IW為輸入數據的量化位寬,QW和QB是量化感知訓練階段網絡權重和偏置的量化位寬,O W是訓練后量化階段計算層的輸出位寬,QA是量化感知訓練階段激活層的輸出位寬。量化的整體流程如下:首先量化位寬為IW的輸入數據進入計算模塊,與位寬為QW和QB的權重和偏置進行計算,得到輸出位寬為O W1的中間結果,接著將其送入激活層,得到輸出位寬為QA的中間結果,然后就可以進行下一層的運算。

圖2 量化模塊運行流程
為了能夠更好地在資源有限的邊緣端FPGA上部署神經網絡,本文設計了低延遲,低資源占用的硬件加速算子庫。由于Conv層和FC層占據了網絡的絕大部分參數量和計算量,接下來重點介紹本文設計的FC層和Conv層通用計算單元,可以利用通用計算單元(GEneral Matrix Multiplication,GEMM)來加速FC層和Conv層。如圖3所示,由于本文實現了全片上推理,所以可以直接從Block RAM(BRAM)中加載卷積權重和偏置,只需要從外部存儲器讀取輸入數據,數據流格式的中間計算結果不需要傳輸到片外存儲器中暫存,可以直接傳遞給下一層。將網絡權重加載到Weight Buffer之后,就可以送入通用計算單元。可以考慮對網絡進行更低比特的量化來降低存儲空間需求,或者設計更加輕量化的網絡來完成任務。

圖3 FC/Conv通用計算單元
在開始計算之前,需要根據運算類型對Input的數據進行調整,因為FC層的輸入尺寸較小,所以只需要根據輸入輸出尺寸進行分塊并存入到FC_Input Buffer中即可。而Conv層輸入尺寸較大且有復雜的數據復用,所以需要將Input中的數據先緩存到Line Buffer中,調整數據排列方式,再傳輸到SW (Sliding Window) Buffer中,以此來實現流水線運算和輸入數據復用。接著將準備好的數據送入到通用計算單元進行運算,接著將計算結果按FC運算和Conv運算分別處理,將計算得到的部分結果對應相加并暫存到Accum Buffer中,最終將完整的輸出結果傳輸到Output Buffer中,然后直接送到下一層網絡模塊中繼續進行計算。以FC運算為例,假設輸入的尺寸為 2CI ,當FC層例化了C I個MAC運算單元時,流水線計算過程如下:首先在T=1時 , C I 個通道的輸入x1~xCI和神經元參數w1~wCI并行計算得到C I 個部分結果mi~mCI,并且還將偏置b1加載到Accun Buffer中。同理在T=2 時,再次得到部分計算結果mCI+1~m2CI,并將T=1時 刻計算得到的m1~mCI累加到A cc1中。
通用計算單元由MAC陣列組成,通過3.1節中介紹的并行度因子控制實例化的MAC數量[11],來決定每一層運算中MAC使用的次數。如果對輸入和權重都進行了量化,推理框架NN-EdgeBuilder可以使用查找表(LUT)來實現部分的低位寬乘法來節約DSP資源。NN-EdgeBuilder生成的是數據流結構的加速器,加速器的延遲取決于計算延遲最大的層,所以需要探索每一層的并行度,根據每層的計算量來分配計算資源,實現每一層延遲的均衡。
算法1為全連接運算循環嵌套流程,通常在計算全連接層時會將輸入展平為1維向量,即輸入向量維度為 CI ,輸出向量維度為C O,所以得到一個全連接層輸出像素點需要兩層循環。本文將FC層的輸出維度Loop2展開,實現了輸入數據復用,即在一個周期內輸入像素點固定,同時和所有輸出維度對應的神經元相乘。本文針對輸入較小的FC層,使用數組分割指令將FC層的輸入數組完全分割到獨立的寄存器中,以此實現在一個時鐘周期內訪問所有的輸入。理想狀態下經過C I個周期就可得到完整的輸出結果。
卷積運算的循環嵌套流程算法2所示,得到一個卷積層輸出像素點需要6層循環,針對輸入特征圖尺寸較大的Conv層,如果將特征圖和權重參數全部展開并堆疊成矩陣形式,會占用邊緣端FPGA大量的硬件資源。
為了獲得最快的卷積運算速度,本文將Loop3~Loop6展開,即實現了卷積核維度的展開,輸入通道維度的展開和輸出通道維度的展開,整體的并行度為 CO×CI×HF×WF ,在每個周期內輸出CO個像素點,對應著輸出特征圖的同一位置。與FC層一樣,Conv層也復用了輸入特征圖的像素點,這樣就可以實現和FC層共用相同的矩陣向量運算單元。

算法1 全連接運算循環嵌套
為了提高輸入數據處理速度并節省硬件資源,本文設計了Line Buffer和SW Buffer來緩存輸入特征圖[12],假設輸入特征圖的尺寸為 H I×WI×CI,卷積核尺寸為 HF×WF×CI×CO,則Line Buffer的尺寸為 (HF-1)×WI×CI,SW Buffer尺寸為HF×WF×CI。
由于對輸入特征圖每個通道的處理是相同的,所以為了簡潔地說明,圖4展示了 CI=1的情況,如圖4(a)所示,輸入特征圖尺寸為HI×WI=5×5 ,卷積核尺寸H F×WF=3×3,所以Line Buffer的尺寸為( HF-1)×WI=2×5,SW Buffer尺寸為 H F×WF=3×3。如圖4(b)和圖4(c)所示,在T時刻,新的輸入像素點x3被壓入Line Buffer和SW Buffer的第1行,Line Buffer第1行最先壓入的像素點x2被移動到Line Buffer和SW Buffer的第2行,最后是Line Buffer第2行最先壓入的像素點x1被 彈出,并壓入到SW Buffer的第3行。所以T時刻同一列的3個像素點x1,x2,x3被傳入到SW Buffer中,此時SW Buffer是被填滿的,所以會將整個SW Buffer的像素點送入運算單元進行一組并行的卷積運算。同理,如圖4(d)、圖4(e)和圖4(f)所示,T+1 時 刻同一列的3個像素點x4,x5,x6被傳入SW Buffer中,并再次進行卷積運算。綜上分析可得x1,x2,x3一共被復用了3次。從圖4(a)和圖4(d)可以看出,Line Buffer相當于是在輸入特征圖上滑動,每次滑動Line Buffer的每行都會壓入新的像素點,且將Line Buffer最后一個像素點彈出,這樣Line Buffer每次滑動時彈出和壓入的像素點正好就是卷積運算所需的一列數據。

圖4 Line_buffer工作流程
不同推理框架能夠提供不同程度的設計自由度,這些自由度構成了推理框架的參數空間,提供了靈活部署神經網絡的能力。NN-EdgeBuilder是基于數據流結構的神經網絡推理框架,將網絡每一層的關鍵信息映射成計算圖上的節點,通過并行度因子(Parallelism Factor, PF)控制每一層網絡例化的基本計算單元的數量,以此來調節并行度。

算法2 卷積運算循環嵌套
并行度因子 PF通 過控制MAC實例化的數量來決定計算層中單個MAC單元使用的次數。如圖5所示,輸入向量的維度為 1 ×M,神經元參數矩陣維度為M×N,當并行度因子P F=1時會針對每一個乘法實例化相應的MAC單元,則共有M×N個MAC單元,實現了完全并行計算。當并行度因子PF=α時,需要實例化 c eil(M×N/α)個MAC單元。在推理框架NN-EdgeBuilder中量化能夠在保持精度的情況下更顯著地降低DSP資源利用率,并且支持任意定點數精度。

圖5 并行度因子控制MAC數量
綜上所述,本文選擇將網絡每一層的并行度因子和輸出位寬作為推理框架的設計空間,參數空間的細粒度是可調節的,可以先固定任意層的并行度和量化位寬,然后探索剩余網絡層的參數空間,以此來加快探索速度并降低計算資源占用,在滿足硬件資源的限制下實現精度和推理速度等指標的平衡。
貝葉斯優化使用概率模型來擬合目標函數,因為高斯過程的計算代價相對較小,還可以計算每個設計點的不確定度,所以高斯過程是應用最廣泛的代理模型之一[13]。假設已經獲得的數據集共有J個神經網絡推理框架得到的樣本,記為D=(X,Y),其中X=[x1,x2,...,xJ]T是J個已經采樣過的設計點,Y=[y1,y2,...,yJ]T是對應的目標性能輸出,其中y表示待優化的黑盒函數,記為y=φ(x)。假設φ(x)服 從高斯過程,則可以表示為式(1),其中u(x)代表均值函數,K(x,x)代表核函數。
高斯過程利用核函數來提取不同設計點之間的相似性,所以核函數是決定高斯過程代理模型性能的關鍵,NN-EdgeBuilder的參數空間為網絡每一層的并行度因子和輸出位寬,其中并行度因子為整數,而輸出位寬表示為
本文針對組合空間構建了具有混合核函數的高斯過程G PM,可以充分地提取組合空間中采樣點的相似性。首先使用Matáern核函數來度量并行度因子這樣的數值變量,如式(2)所示,其中Kυ第2類修正貝塞爾函數,Γ是伽馬函數,l是長度范圍,可以通過調整υ來控制核函數的平滑程度,本文取值為2.5,來更好地逼近真實目標值
因為Hamming距離可以有效地度量類別參數之間的距離,所以本文使用基于Hamming距離的加權核函數來提取不同輸出位寬之間的相似性[14],如式(3)所示,其中αj為權重超參數,本文取值為1。 當x1,j=x2,j時 ,δ(x1,j,x2,j)=1 ,當x1,j ?=x2,j時,δ(x1,j,x2,j)=0
綜上,針對由并行度因子和輸出位寬構成的組合設計空間,本文使用了如式(4)所示混合核函數KMixed(x1,x2)來提升高斯過程擬合目標函數的效率,其中Kcons(x1,x2) 為常量核函數, L為常量,KN(x1,x2)為白噪聲
在貝葉斯優化算法中采集函數負責確定下一個采樣點的位置,來高效逼近最優的目標函數值,目前流行的采集函數之一是期望改進(Expected Improvement, EI)及其多種變體[15],可以結合已經探測得到高確信度的區域和還沒有充分開發的區域的信息,實現了搜索和利用兩者之間的平衡。
對于帶約束的多目標優化問題,假設共有M個目標函數φ(x)={φ1(x),φ2(x),...,φM(x)}和N個約束 條 件C(x)={c1(x),c2(x),...,cN(x)},且φi(x)和ci(x)都滿足高斯過程,則多目標優化問題可以表示為式(5)所示。
超體積(HyperVolume,HV)是衡量多目標優化常用的指標[16],以參考點yref為界,超體積是由非支配解集組成的目標空間的體積,記P(V)為帕累托前沿。可以通過帕累托邊界上的點P(V)將目標空間分塊,使用分段積分來計算期望的超體積改進量(Expected HyperVolume Improvement, EHVI),期望的超體積改進積分是非支配采樣點集合的超體積改進分段積分之和。如式(6)所示,其中非支配解集Pn內的設計點不被任何帕累托前沿上的點P(V)支 配,Pn={p ∈Pn:?y ∈p,y′∈P(V),y′y},P
φx(y)是目標函數預測分布的概率密度函數。
NN-EdgeBuilder需要在滿足邊緣端FPGA硬件資源限制的條件下自動部署網絡模型,常規的EHVI沒有考慮有約束多目標優化問題,所以本文使用改進后的EHVI函數,只有在采樣點滿足約束時才會計算EHVI,改進后的采集函數命名為EHVIC[17]。目標函數和約束條件都是計算代價不菲的黑盒函數,優化后的采集函數由兩部分組成,第1部分是針對目標函數的超體積改進量,第2部分則是滿足約束的期望C S(p),如式(7)所示
由于是C S(p)是在每個單元格內定義的,所以邊界為輸入x,記為x={x ∈F:y ∈p},考慮到約束滿足高斯過程,可以使用目標函數后驗分布的采樣點來擬合 Pr(c(x)≤0) 。選擇滿足(x|y ∈p) 標準的后驗采樣點,并使用Monte-Carlo采樣方法來求解 C S(p),所以EHVIC采集函數的計算如式(8)所示
為了能更快地找到可行解,讓高斯過程更專注于利用可行域的信息,不滿足要求的點不會用于帕累托集的計算。在多目標貝葉斯優化每次迭代過程中,都是通過最大化EHVIC函數在設計空間F中確定下一次采樣點,如式(9)所示
神經網絡加速器的核心指標包含檢測精度和推理速度、資源占用等,這些指標往往相互沖突,很難同時達到最優。其中邊緣端FPGA的硬件資源既可以作為約束條件又可以作為優化目標,例如可以將資源緊張的DSP和LUT作為優化目標,而將其他資源作為約束條件,這樣可以探索性能表現的平衡點。
本文提出了基于多目標貝葉斯優化的推理框架設計空間探索算法,具體流程如算法3所示,首先在設計空間內采樣,運行EDA工具流得到初始的性能表現樣本集Dφ=(X,Y)和硬件資源約束條件集DC={C(x)}。接著在每一次迭代過程中,首先根據樣本集Dφ和約束集DC更新代理模型G PM。接著算出非支配域內的期望超體積改進量E HVI(x)和滿足約束的期望C S(p),進一步算出帶約束的采集函數 E HVIC(x), 然后通過最大化E HVIC(x),選擇下一個參數配置點xJ+1。得到新的配置點之后繼續運行EDA工具得到真實的性能表現函數值φ(xJ+1)和硬件約束C(xJ+1)。最后更新數據集和約束集并進行下一次迭代。迭代的停止條件可以根據實際場景的需要來選擇,如設計空間探索的最大時間,參考帕累托前沿的ADRS等,最終輸出加速器精度和推理速度平衡的帕累托前沿設計點。

算法3 貝葉斯優化算法流程
為了驗證NN-EdgeBuilder自動部署的加速器的性能,針對大疆(DJI)無人機小目標檢測數據集,本文使用NN-EdgeBuilder部署UltraNet網絡。為了提高生成的UltraNet網絡加速器的性能,本文使用量化感知訓練,位寬設置為4 bit,并通過數據增強,重參數化等優化策略,在不改變UltraNet推理階段參數量和計算量的情況下將精度提升到了0.703。網絡訓練完成之后,就可以使用NN-Edge-Builder將其自動部署在邊緣端Ultra96-V2 FPGA上,工作頻率為250 MHz。NN-EdgeBuilder通過設計空間探索給出2個帕累托設計點,分別記為P1和P2點,然后可以部署到Ultra96-V2開發板上來測試結果。
本文將NN-EdgeBuilder經過設計空間探索得到的UltraNet-P1和UltraNet-P2加速器與專用加速器SEUer和ultrateam進行對比,表1為4個加速器分別處理5.25×104張圖片的性能表現,對每一個加速器,循環測試5次取各個指標的均值。

表1 UltraNet加速器性能對比
UltraNet-P1加速器每秒處理圖片的數量比ultrateam加速器少159幀,但是UltraNet-P1使用了高性能的硬件加速算子,處理5.25×104張圖片的功耗僅為30.2 J,功耗比ultrateam降低了25.06%。UltraNet-P1擁有最高的能效比,其每瓦特每秒的運行數達3.199×1011次,比ultrateam提升了33.46%。
UltraNet-P2加速器實現了檢測精度和推理速度的平衡,UltraNet-P2的IOU和SEUer相同,都是0.703,其余性能指標均優于SEUer,其中推理速度提升了70FPS,功耗表現提升了10.08%,能效比提升了11.25%。
UltraNet-P1和UltraNet-P2優秀的性能表現證明了推理框架NN-EdgeBuilder能夠有效地將網絡模型映射為高性能的硬件加速算子,再通過充分的設計空間探索,生成性能優異的神經網絡加速器。
從表2可以看出目前主流推理框架支持的深度學習框架數量有限,如DNNBuilder只支持Caffe框架,而NN-EdgeBuilder 的擴展性更強,能夠高效地解析主流深度學習框架設計的網絡模型,如PyTorch和TensorFlow。表2還對比了NN-Edge-Builder和其他推理框架部署VGG網絡的性能表現,目前主流的推理框架支持的量化精度通常在8 bit及以上,對低比特量化沒有很好的支持,而NN-EdgeBuilder支持量化感知訓練,所以可以進行4 bit量化并保持網絡精度。NN-EdgeBuilder的硬件加速算子庫提供了低延遲低功耗的算子和高性能的DSE算法,所以針對相同的FPGA平臺,NNEdgeBuilder 生成的VGG加速器計算性能是Deep-Burning-SEG的兩倍。由于DNNBuilder在硬件資源更豐富的平臺上部署,并且對VGG進行了剪枝,所以生成的加速器計算性能超過了NN-EdgeBuilder。但是NN-EdgeBuilder主要針對邊緣端FPGA進行優化,考慮了低功耗和低資源占用,所以生成的加速器能效比是DNNBuilder的4.4倍,DSP的計算效率提升了50.65%。所以與目前主流的推理框架相比,NN-EdgeBuilder針對邊緣端FPGA生成的加速器解決方案實現了明顯的性能提升。

表2 NN-EdgeBuilder和其他推理框架部署VGG網絡的性能對比
目前將神經網絡部署在FPGA平臺還面臨開發時間長、性能優化難等問題,本文設計了神經網絡推理框架NN-EdgeBuilder,提供了高性能的基于多目標貝葉斯優化的設計空間探索算法和低延遲低功耗的硬件加速算子,能夠加速開發對邊緣端FPGA友好的神經網絡硬件加速器,生成的加速器比目前主流的推理框架有顯著的性能提升。