王 肖, 鄧軍勇, 謝曉燕
(1.西安郵電大學 電子工程學院,陜西 西安 710121; 2.西安郵電大學 計算機學院,陜西 西安 710121)
目前,基于FPGA的加速器設計工作大多是以減少訪存次數(shù)或者提升計算吞吐量來優(yōu)化性能或能效,如文獻[3]中Eyeriss提出了一種行固定數(shù)據(jù)流來減少數(shù)據(jù)移動來提高能效;文獻[4]針對在計算資源和存儲帶寬受限情況下,通過提高加速器的計算并行度來提高能效;文獻[5]通過定點量化、激活函數(shù)近似、流水線并行化等方法來優(yōu)化加速器的性能。然而,由于卷積神經(jīng)網(wǎng)絡的多樣性,給加速器的高能效設計和數(shù)據(jù)復用帶來了挑戰(zhàn),通常一種處理引擎只能處理一種卷積核,卷積核種類和計算資源之間的不匹配導致資源利用率的下降。針對此類問題,一些學者提出了可重構卷積神經(jīng)網(wǎng)絡加速器的設計方法,文獻[6]提出了一種細粒度可支持多種卷積神經(jīng)網(wǎng)絡的可重構加速器,由484個PEs構成22×22矩陣的異構陣列,并且采用多級內存層次結構提供更高的計算并行度;然而該設計是將整個22×22矩陣陣列展開,導致加速器面積較大,功耗較高。文獻[7,8]提出了一種基于FPGA可重構卷積神經(jīng)網(wǎng)絡加速器,利用基本處理單元作為計算引擎的構建塊,處理單元可擴展為支持多種網(wǎng)絡體系結構,雖然可以支持多種網(wǎng)絡結構的處理,但由于重構方式不理想,導致通過基本處理單元擴展為支持多種網(wǎng)絡結構的處理單元會造成部分計算單元的浪費以及不必要的數(shù)據(jù)搬移。
針對當前卷積神經(jīng)網(wǎng)絡加速器難以在實現(xiàn)高能效的同時卷積處理引擎靈活地適應多種卷積核,本文提出一種卷積神經(jīng)網(wǎng)絡的可重構加速器設計方案。
卷積神經(jīng)網(wǎng)絡通常由卷積層、池化層和全連接層構成,如圖1所示,其中的K,S分別代表卷積核的大小和卷積步長。通常不同的卷積神經(jīng)網(wǎng)絡的卷積層通常體現(xiàn)在這些參數(shù)的差異上,如AlexNet 的k2=5,k3,k4,k5=3,LeNet-5網(wǎng)絡的k1,k2,k3=5。
圖1 卷積神經(jīng)網(wǎng)絡結構
從卷積神經(jīng)網(wǎng)絡算法層面上來看,卷積層的數(shù)據(jù)復用關系和并行處理方式[8,9]具有以下特點:
1)卷積核在圖像上移動,會存在部分重復數(shù)據(jù),可以直接用于下一次卷積運算。
2)多個卷積核和同一幅圖像做卷積運算,生成的多個卷積輸出通道可以做并行計算處理。
3)當處理多幅圖像時,同一個卷積核與多幅圖像做卷積計算,卷積核在多張圖像上實現(xiàn)共享。
通過上述分析,卷積神經(jīng)網(wǎng)絡是一種規(guī)律可循的模型,模型的計算方式是逐層計算,并且每一層卷積計算是相對獨立的,根據(jù)網(wǎng)絡當前層的處理需要分配合適的處理單元進行計算,這種計算方式適合采用可重構的設計方法。不同的重構方式,對硬件計算單元的利用率不同,因此采用合適的重構設計方式,并利用卷積層中的數(shù)據(jù)復用關系和多通道并行處理能力,通過改變PE的數(shù)據(jù)通路實現(xiàn)不同卷積的處理,不僅可以節(jié)省大量的硬件資源,同時可以加速不同的卷積神經(jīng)網(wǎng)絡模型。
3) CTV與常規(guī)油船外輸軟管連接。啟動CTV軟管收放滾筒,由艉部服務吊機協(xié)助,將外輸軟管放到輔助拖船上,拖船將軟管拖到常規(guī)油船中部,油船吊機將軟管吊至油船集管區(qū),與接油管連接好。
由于卷積層計算的密集性給加速器的設計帶來了諸多挑戰(zhàn),采用多處理器(PE)的設計方式實現(xiàn)并行處理是必要的選擇[10]。在卷積層中使用較小的卷積核可以保持網(wǎng)絡性能的同時降低計算復雜度,因此,本文設計采用3×3大小卷積核作為基礎PE,以適應卷積神經(jīng)網(wǎng)絡模型中的大多數(shù)層,考慮到FPGA有限的硬件資源和加速器的低功耗設計,設計一個由18個PE組成的處理器陣列。
根據(jù)上述對卷積神經(jīng)網(wǎng)絡可重構方案分析和文獻[4,7,10],提出本文的加速器架構,硬件的整體結構如圖2所示,主要由計算核堆、片上緩沖區(qū)、控制器組成。其中,計算核堆承擔了卷積神經(jīng)網(wǎng)絡中的主要計算任務,片上緩沖區(qū)包括輸入緩沖、權值緩存和輸出緩沖三個部分,分別用于存儲即將被計算核消耗的數(shù)據(jù)、各種大小的卷積核和計算核生成的中間數(shù)據(jù)??刂破骺刂平邮蘸桶l(fā)送信息給其他四個部分,控制每部分的狀態(tài)并檢查當前狀態(tài)是否可以運行。
圖2 加速器結構
計算核模塊主要包括卷積器單元、加法樹單元、非線性單元和池化單元,計算核的計算流程如圖3所示,實線計算路徑進行3×3卷積運算,虛線計算路徑進行5×5卷積運算。
圖3 計算核總體結構
本文設計的基礎PE如圖4所示,其中,寄存器堆由9個寄存器組成,主要功能是暫存乘法運算后得到的9個數(shù)據(jù),在AlexNet網(wǎng)絡中,當計算3×3大小卷積時,步長為1,計算一次卷積計算會有6個數(shù)據(jù)可以在下一次卷積運算中實現(xiàn)復用,根據(jù)電路的設計,9個寄存器采用流水線的設計方式,每次處理時更新一個數(shù)據(jù),三個時鐘周期即可完成3個數(shù)據(jù)的更新,并與保留的6個寄存器數(shù)據(jù)做加法操作,如此迭代,可以在每次卷積運算中減少6次乘法計算,有效減少處理時間。
圖4 基礎PE結構
PE的重構通過多個基礎PE組合來實現(xiàn),為了盡可能提高計算資源的利用率,采用圖5所示的重構計算方式,當處理5×5卷積運算時,設計由3個基礎PE組合來完成,在處理之前首先利用控制器對特征圖進行預處理,對特征圖上的每個權值進行標記,使得PE可以根據(jù)地址找到需要處理的特征圖區(qū)域,例如,調用PE0,PE1,PE2完成一次5×5卷積計算時,需要通過控制器控制PE處理的地址,定義PE0的處理地址從0到8;定義PE1處理的地址從9到17;定義PE2的地址從18到24;三個PE對同一幅特征圖做卷積計算,完成卷積運算后將三個寄存器堆中的數(shù)據(jù)求和完成一次5×5卷積運算,構建的5×5處理PE結構如圖5(a)所示。5×5卷積過程如圖5(b)所示,PE0,PE1,PE2分別和空白區(qū)域、深灰色區(qū)域、淺灰色區(qū)域做卷積計算,每個PE的控制器控制其區(qū)域的移動,直到完成整個特征圖的卷積運算,三個PE每完成一次滑窗的卷積做一次加法完成一次5×5卷積運算。斜線區(qū)域是一次5×5卷積可以數(shù)據(jù)復用的部分,該區(qū)域的復用同時也劃分為三個區(qū)域,白色區(qū)域由PE0中的寄存器存儲,深灰色區(qū)域由PE1中的寄存器存儲,淺灰色區(qū)域由PE2中的寄存器存儲。每完成一次5×5卷積運算有20個數(shù)據(jù)可以用于下次的卷積運算,一次5×5卷積運算可以減少20次乘法計算,最大程度地利用有限的計算單元,而文獻[8]的重構設計方式是利用4個3×3卷積核構建一個5×5卷積核,導致更多的計算單元被浪費,同時增加了不必要的數(shù)據(jù)搬移。因此相比于文獻[6~8],本文在計算資源的利用率和系統(tǒng)功耗上優(yōu)勢明顯。
圖5 5×5卷積運算PE結構和處理過程
每一層卷積計算完成,會加上一個修正線性單元對數(shù)據(jù)進行非線性化,優(yōu)勢是在更高維度上對圖像進行分類,本文采用ReLU作為激活函數(shù),當輸入為負時,輸出值均為0,當輸入為非負時,輸出與輸入的數(shù)值保持一致。計算公式如下
f(x)=max(0,x)
(1)
在池化層處理過程中,AlexNet網(wǎng)絡采用3×3大小的池化窗口,使用一個臨時緩存將上一層卷積計算結果保存,每一次的卷積輸出都和這個臨時緩存做比較,較大的數(shù)據(jù)繼續(xù)存儲在這個臨時緩存中,較小的數(shù)據(jù)被丟棄,使用一個控制信號控制池化窗口的步長,完成一次池化后,重復以上的操作,直至完成一層的池化。
當接收到輸入圖像的像素信息時,首先對卷積神經(jīng)網(wǎng)絡算法要處理的網(wǎng)絡層進行判斷,確定當前處理層在整個網(wǎng)絡中的位置后,根據(jù)網(wǎng)絡算法對應層所需的數(shù)據(jù)進行塊取數(shù),在取出來的像素值和與之對應的權值進行卷積計算之前,對當前層所需要的卷積核大小進行判斷,當前層計算3×3卷積核時,不需要進行調度,直接使用計算核堆中的PE進行卷積運算;若當前層計算5×5卷積核時,需要調度計算核堆中的3個3×3的PE來處理一個5×5卷積核。在完成一層的計算操作后,判斷若當前層數(shù)小于整個網(wǎng)絡的層數(shù)時,重復上面的運算操作;若判斷當前層等于整個網(wǎng)絡的層數(shù)時,整個網(wǎng)路完成數(shù)據(jù)處理,計算結束得到最終結果。
為了驗證所提出的卷積神經(jīng)網(wǎng)絡加速器,采用Xilinx公司的Vivado2017.4開發(fā)環(huán)境進行功能仿真和綜合驗證,通過Xilinx公司的ZYNQ系列芯片XC7Z045開發(fā)板對設計的加速器進行綜合測試。
傳統(tǒng)方法完成一次5×5卷積需要25次乘法和24次加法共需要26個時鐘周期。本文完成一次3×3卷積需要10個時鐘周期,完成一次5×5卷積僅需要11個時鐘周期,其中,C2生成27×27×96×256個卷積結果,C3生成13×13×256×384個卷積結果,C4生成13×13×384×384個卷積結果,C5生成13×13×384×256個卷積結果,對應層所需時鐘周期數(shù)如表1所示。
表1 卷積層計算時間
表1是AlexNet網(wǎng)絡計算時間,本文的特征圖和文獻[11,12]處理的特征圖數(shù)量不同,文獻[11,12]的第二層輸入只有7張?zhí)卣鲌D,輸出64張?zhí)卣鲌D,而本文第二層的輸入特征圖數(shù)量有96張?zhí)卣鲌D,輸出了256張?zhí)卣鲌D,相比于文獻[11,12]處理的數(shù)據(jù)量更多。通過輸入特征圖的歸一化處理,在同時處理單張輸入特征圖時,相比于文獻[11,12],本文設計的加速器花費的時間更少,加速器處理時間減少了98.95 %。
表2是各種卷積神經(jīng)網(wǎng)絡加速器的性能對比,從表2可以看出,相比于文獻[4,6,13],本文設計的加速器占用較少的硬件資源,同時可以處理多種如LeNet—5、VGG等采用3×3或5×5大小卷積的神經(jīng)網(wǎng)絡,在靈活性和高能效上優(yōu)勢明顯,同時能效比達到了16.89 Gop/s/W,本文設計與文獻[4,6,8,13]對比,能效比分別提升410 %,78 %,19 %,270 %。
表2 加速器性能對比
本文根據(jù)卷積神經(jīng)網(wǎng)絡逐層計算方式和卷積計算特點,設計了一種可重構的卷積神經(jīng)網(wǎng)絡加速器,該方案設計3×3大小的卷積核作為基礎PE,利用3個基礎PE構建5×5卷積核,并且每一個基礎PE內部設計有寄存器堆用于暫存數(shù)據(jù),寄存器之間采用流水線的設計方式,每次處理時更新一個數(shù)據(jù),三個時鐘周期即可完成3個數(shù)據(jù)的更新,并與之前保留的6個寄存器數(shù)據(jù)做加法操作,可以在每次卷積運算中減少6次乘法計算。構建5×5卷積核時,3個基礎PE可以分別控制可數(shù)據(jù)復用的區(qū)域實現(xiàn)重構后的數(shù)據(jù)復用,每完成一次5×5卷積運算有20個數(shù)據(jù)可以用于下次的卷積運算,一次5×5卷積運算可以減少20次乘法計算。通過加速器處理時間實驗對比,本文設計的加速器處理單張?zhí)卣鲌D時,處理時間僅需要51 074個時鐘周期,并且加速器的功耗僅為1.8 W,低功耗的設計帶來了16.89 Gop/s/W的高能效比,相比于當前典型設計,能效比分別有410 %,270 %,78 %,19 %的提升。