儲 萍,倪 偉
(合肥工業(yè)大學(xué) 電子科學(xué)與應(yīng)用物理學(xué)院,安徽 合肥 230009)
近幾年深度神經(jīng)網(wǎng)絡(luò)算法在計(jì)算機(jī)視覺、自然語言處理、語音識別等領(lǐng)域得到廣泛應(yīng)用。VGG16、GoogLeNet和ResNet101[1-3]等深度神經(jīng)網(wǎng)絡(luò)模型在取得優(yōu)越性能的同時伴隨著較高的存儲空間需求和計(jì)算復(fù)雜度。移動設(shè)備雖具有豐富的計(jì)算和存儲資源,但運(yùn)行以上深度神經(jīng)網(wǎng)絡(luò)模型仍面臨較大的挑戰(zhàn)。
深度神經(jīng)網(wǎng)絡(luò)中存在大量冗余計(jì)算,造成存儲和計(jì)算資源浪費(fèi),因此研究人員試圖通過壓縮網(wǎng)絡(luò)模型來減少冗余計(jì)算。該研究主要分為3個方向,即網(wǎng)絡(luò)剪枝、網(wǎng)絡(luò)參數(shù)量化和加速網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)。網(wǎng)絡(luò)剪枝用于訓(xùn)練較好的神經(jīng)網(wǎng)絡(luò)模型,移除網(wǎng)絡(luò)模型中特征信息少的權(quán)值數(shù)據(jù)。文獻(xiàn)[4]提出低值連接直接刪除的剪枝法,將原始密集神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換為稀疏神經(jīng)網(wǎng)絡(luò),并為剪枝后的網(wǎng)絡(luò)設(shè)計(jì)了首個稀疏網(wǎng)絡(luò)加速器EIE(Efficient Inference Engine)[5]。網(wǎng)絡(luò)參數(shù)量化主要針對權(quán)值和特征圖值進(jìn)行量化處理,使用低位定點(diǎn)數(shù)據(jù)代替高精度訓(xùn)練下的浮點(diǎn)數(shù)據(jù)。文獻(xiàn)[6]提出二值神經(jīng)網(wǎng)絡(luò)(Binarized Neural Networks,BNN),對網(wǎng)絡(luò)中權(quán)值和中間特征圖值進(jìn)行二值化處理,使用位運(yùn)算代替原來浮點(diǎn)數(shù)乘法運(yùn)算,減少了計(jì)算復(fù)雜度。文獻(xiàn)[7]提出同或網(wǎng)絡(luò)XNOR-Net,為二值化處理中產(chǎn)生的誤差引入近似因子,XNOR-Net精度僅比全精度網(wǎng)絡(luò)低10%。加速網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)是指探索最優(yōu)的網(wǎng)絡(luò)結(jié)構(gòu),例如輕量型網(wǎng)絡(luò)ShuffleNet、MobileNet、SqueezeNet[8-10]等。與前面深度神經(jīng)網(wǎng)絡(luò)模型相比,此類輕量型網(wǎng)絡(luò)網(wǎng)絡(luò)參數(shù)少,識別精度高,能減少計(jì)算復(fù)雜度和存儲空間需求,因此更具研究價值。近幾年多種變形的輕量型網(wǎng)絡(luò)也已被應(yīng)用到實(shí)際生活中[11-13]。復(fù)旦大學(xué)ASIC重點(diǎn)實(shí)驗(yàn)室提出了基于層結(jié)構(gòu)設(shè)計(jì)的SqueezeNet輕量型網(wǎng)絡(luò)加速器[14],其以蝶形流水線結(jié)構(gòu)使多層并行計(jì)算,但是其網(wǎng)絡(luò)層數(shù)較深,無法并行整個網(wǎng)絡(luò)進(jìn)行同時計(jì)算,仍存在改進(jìn)空間。
本文在深入研究SqueezeNet網(wǎng)絡(luò)的基礎(chǔ)上,以處理塊結(jié)構(gòu)部署網(wǎng)絡(luò)進(jìn)行加速設(shè)計(jì),減少了計(jì)算模塊和內(nèi)存間流動的數(shù)據(jù)量,降低了內(nèi)存讀寫消耗。此外,本文利用激活函數(shù)特性,為計(jì)算模塊引入提前結(jié)束卷積計(jì)算的思想,減少了無效值占用的計(jì)算量和計(jì)算周期,提高了網(wǎng)絡(luò)部署的效率。
SqueezeNet網(wǎng)絡(luò)是一種輕量且高效的神經(jīng)網(wǎng)絡(luò)模型,參數(shù)量僅為AlexNet網(wǎng)絡(luò)的1/48,但識別精度與 AlexNet網(wǎng)絡(luò)相同[10]。
SqueezeNet網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示,主要包含卷積層(Conv)、ReLU激活函數(shù)、池化層(Pool)和Fire塊。其中Fire塊表示SqueezeNet網(wǎng)絡(luò)的核心組成模塊Fire module,其由Squeeze(S1)、Expand(E1、E3)、ReLU、Concat(C)和Pool(P)層組成。S1是卷積核為1×1的卷積層Squeeze1×1,經(jīng)過該層后輸出的特征圖數(shù)據(jù)深度較小,具有降維作用。E1和E3分別是卷積核為1×1、3×3的卷積層Expand1×1和Expand3×3。C為拼接層,E1和E3層輸出特征圖數(shù)據(jù)經(jīng)過C層后,在通道上進(jìn)行拼接,輸出數(shù)據(jù)量增加一倍。輸入大小為227×227×3的圖片數(shù)據(jù),經(jīng)過SqueezeNet網(wǎng)絡(luò)多層處理后可得到1 000個圖像分類結(jié)果。
圖1 SqueezeNet網(wǎng)絡(luò)結(jié)構(gòu)
1.2.1 卷積層
卷積計(jì)算是卷積核在輸入特征圖上滑動時與對應(yīng)卷積框內(nèi)特征圖數(shù)據(jù)的乘累加計(jì)算。SqueezeNet網(wǎng)絡(luò)中的卷積計(jì)算及拼接過程如圖2所示,其中輸入特征圖ifmap分別與1×1、3×3的卷積核K1、K2進(jìn)行卷積計(jì)算,輸出大小相同的特征圖數(shù)據(jù)ofmap1、ofmap2,再經(jīng)過Concat拼接層后輸出特征圖ofmaps。輸入特征圖的高(H)和寬(W)與輸出特征圖的高(E)和寬(F)滿足式(1)。
圖2 卷積計(jì)算及拼接過程
(1)
式中,S為卷積核每次移動的步長;P為填充單位;K為卷積核大小。
1.2.2 激活函數(shù)
當(dāng)網(wǎng)絡(luò)中不引入激活函數(shù)時,即使網(wǎng)絡(luò)層數(shù)再深,也與單層線性網(wǎng)絡(luò)性質(zhì)等價,僅限于處理線性問題。而激活函數(shù)的引入為網(wǎng)絡(luò)中加入了非線性因素,可解決線性模型無法解決的問題。常用的ReLU激活函數(shù)式為
ReLU(x)=max(0,x)
(2)
式中,x為卷積層輸出特征圖值;ReLU激活函數(shù)將小于0的輸出特征圖值置為0,其余值保持不變。這給網(wǎng)絡(luò)中引入大量稀疏數(shù)據(jù)0。
1.2.3 池化層
通常在連續(xù)的卷積層后插入池化層,常用的有最大池化和平均池化,即取池化框內(nèi)最大值或平均值替換池化框內(nèi)所有數(shù)據(jù)。池化操作后的特征圖尺寸相比原始特征圖有所縮小,可降低網(wǎng)絡(luò)中的數(shù)據(jù)量和計(jì)算量。
加速器整體架構(gòu)如圖3所示,主要分為配置模塊、全局緩沖模塊、輸入緩沖模塊、權(quán)重緩存模塊、核心計(jì)算模塊和中間值緩存模塊。其中配置模塊根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)配置每個處理塊(Process block,Pb)中的信息,包括輸入特征圖傳輸、權(quán)重值加載、核心計(jì)算模塊運(yùn)算、中間特征圖存儲。特征圖數(shù)據(jù)存儲在全局緩沖模塊,可選擇是否經(jīng)過輸入緩沖模塊送到核心計(jì)算模塊中。若計(jì)算Expand3×3卷積層,則需要先將特征圖數(shù)據(jù)送到輸入緩沖模塊的移位寄存器中,等到卷積計(jì)算開始時,再從移位寄存器中取值送到核心計(jì)算模塊。若計(jì)算Expand1×1卷積層,則直接從全局緩沖模塊取出特征圖數(shù)據(jù)送到核心計(jì)算模塊。核心計(jì)算模塊主要完成處理塊中Expand3×3、Expand1×1和Squeeze1×1卷積層的運(yùn)算。若核心計(jì)算模塊輸出完整特征圖數(shù)據(jù),則直接將完整特征圖數(shù)據(jù)送到激活單元后寫回全局緩沖模塊,否則將產(chǎn)生的部分特征圖數(shù)據(jù)送到部分值緩存單元,等待核心計(jì)算模塊送出的下一組特征圖數(shù)據(jù)一起進(jìn)行累加計(jì)算,直到輸出完整特征圖數(shù)據(jù)再送到激活單元,最后寫回全局緩沖模塊。
圖3 加速器整體架構(gòu)
SqueezeNet網(wǎng)絡(luò)參數(shù)量僅為AlexNet網(wǎng)絡(luò)的1/48,但中間流動的特征圖數(shù)據(jù)量達(dá)到202 kB。若逐層部署網(wǎng)絡(luò),每層輸出特征圖數(shù)據(jù)需先寫入內(nèi)存中,等待下一層計(jì)算需要時,從內(nèi)存中取出送回計(jì)算單元。在計(jì)算單元和內(nèi)存間流動的202 kB數(shù)據(jù)會產(chǎn)生大量讀寫消耗,導(dǎo)致此種部署方式效率不高。文獻(xiàn)[14]為避免單層網(wǎng)絡(luò)部署效率低問題,以SqueezeNet核心模塊Fire來部署網(wǎng)絡(luò),此時讀寫入內(nèi)存中的數(shù)據(jù)為Concat層輸出數(shù)據(jù),計(jì)算單元和內(nèi)存間流動數(shù)據(jù)量達(dá)到177 kB,相比單層網(wǎng)絡(luò)部署減少了12.3%。
圖4給出SqueezeNet網(wǎng)絡(luò)部分層輸入、輸出特征圖數(shù)據(jù)大小,其中Concat層將Expand1×1和Expand3×3卷積層輸出數(shù)據(jù)在通道維度上進(jìn)行拼接,輸出數(shù)據(jù)量增加一倍,故文獻(xiàn)[14]中以Fire塊部署網(wǎng)絡(luò)仍具探索空間。為進(jìn)一步減少中間流動數(shù)據(jù)量并降低讀寫內(nèi)存消耗,本文利用Squeeze1×1層降維作用,以處理塊結(jié)構(gòu)重新劃分網(wǎng)絡(luò)。除個別層外,處理塊由Expand1×1、Expand3×3(E1、E3)層和Squeeze1×1(S1)層組成,以Squeeze1×1層結(jié)束的處理塊。這樣處理使得輸出特征圖數(shù)據(jù)量明顯減少,由此可知處理塊結(jié)構(gòu)部署網(wǎng)絡(luò)能有效減少中間流動數(shù)據(jù)量并降低讀寫內(nèi)存消耗。
圖4 處理塊劃分的SqueezeNet網(wǎng)絡(luò)
激活函數(shù)ReLU給網(wǎng)絡(luò)中引入大量的稀疏數(shù)據(jù)0,這些0值雖不影響卷積計(jì)算輸出,但占用了無效的計(jì)算量和計(jì)算周期,影響網(wǎng)絡(luò)計(jì)算速度。文獻(xiàn)[15]設(shè)計(jì)的加速器能跳過特征圖中0值計(jì)算,避免浪費(fèi)多余的計(jì)算量和計(jì)算周期,但該方法僅考慮了跳過0值占用的無效計(jì)算。本文通過研究ReLU激活函數(shù)特性,為核心計(jì)算模塊設(shè)計(jì)了有效索引生成單元、有效索引控制取值單元和卷積判斷單元,進(jìn)一步減少了無效值包括非0特征圖值占用的計(jì)算量和計(jì)算周期,加快了網(wǎng)絡(luò)計(jì)算速度,減少了計(jì)算資源消耗。
2.3.1 有效值生成單元
有效值生成單元包括有效索引生成單元和有效索引控制取值單元,如圖5所示。其中權(quán)值和特征圖值分別來自權(quán)重緩存模塊和輸入緩沖模塊的移位寄存器。首先給權(quán)值降序排序產(chǎn)生原始位置索引,然后特征圖值按照原始位置索引取值生成輸入判斷值。若原始位置索引值對應(yīng)位置的特征圖值不為0,則輸入判斷值為1,否則輸入判斷值為0。將生成的輸入判斷值和原始位置索引相與,輸出中間索引。對中間索引再排序。非0值索引依序靠前排列,0值索引相應(yīng)靠后排列,得到有效索引。
圖5 有效值生成單元
有效索引生成單元輸出的有效索引具有以下特點(diǎn):非0索引值靠前,0值索引置后;按照非0索引值取出的權(quán)值降序排序。由圖5可以看出,有效索引控制取值單元按照有效索引取出的有效特征圖值和權(quán)值比原始數(shù)據(jù)短,減少了乘累加計(jì)算量和周期消耗。
2.3.2 卷積判斷單元
卷積判斷單元的輸出由有效索引(idx)、有效權(quán)值(w)和累加計(jì)算輸出值(s)決定,如圖6所示。若輸入有效索引值為0或累加計(jì)算輸出值小于0且有效權(quán)值小于0,則卷積判斷單元的輸出為1;不滿足兩者條件時,卷積判斷單元的輸出為0。當(dāng)卷積判斷單元輸出為1時,跳過剩余乘累加計(jì)算,輸出當(dāng)前累加計(jì)算值并拉高early_end信號,控制移入下一組特征圖數(shù)據(jù)。若卷積判斷單元輸出為0,則將累加計(jì)算輸出值送到寄存器中,與乘法器下一個輸出值一起送到加法器進(jìn)行累加計(jì)算,將新得到的累加計(jì)算值和有效權(quán)值、有效索引值再次送到卷積判斷單元中,進(jìn)行下一次卷積提前結(jié)束的判斷。
圖6 卷積判斷單元
圖7中給出單張?zhí)卣鲌D與權(quán)值的卷積計(jì)算過程,并對比了正常卷積計(jì)算和卷積提前結(jié)束計(jì)算下的周期消耗。正常卷積計(jì)算下,特征圖1和特征圖2與權(quán)值相乘,9個時鐘周期后輸出乘累加值0、40,共消耗18個時鐘周期。卷積提前結(jié)束計(jì)算時,有效索引控制取值單元根據(jù)有效索引生成單元輸出的有效索引取相應(yīng)的特征圖值和權(quán)值送往右邊進(jìn)行乘累加計(jì)算。此計(jì)算過程加入了卷積判斷單元,用于停止卷積計(jì)算。當(dāng)特征圖1與權(quán)值計(jì)算到第3個時鐘周期,乘累加輸出結(jié)果為負(fù)且權(quán)值為負(fù),卷積判斷單元的輸出為1,此時停止卷積計(jì)算,將乘累加值-4送到激活單元后輸出值0。特征圖2與權(quán)值計(jì)算到第6個時鐘周期時有效索引值為0,卷積判斷單元輸出為1,停止卷積計(jì)算,乘累加值40送到激活單元后輸出值40,總耗時9個時鐘周期。由圖7可以看出,卷積提前結(jié)束下特征圖1、特征圖2與權(quán)值的乘累加輸出值與正常卷積計(jì)算相同,相比正常卷積計(jì)算,新方法跳過了9個無效值占用的計(jì)算量和計(jì)算周期。
圖7 卷積計(jì)算過程
為了驗(yàn)證加速器優(yōu)化效果,本文使用Vivado和Modelsim對設(shè)計(jì)的輕量型SqueezeNet網(wǎng)絡(luò)加速器進(jìn)行功能仿真驗(yàn)證和現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)驗(yàn)證。
加速器以處理塊結(jié)構(gòu)部署網(wǎng)絡(luò),減少了計(jì)算模塊和內(nèi)存間流動的數(shù)據(jù)量,降低了讀寫內(nèi)存消耗。而讀寫內(nèi)存中數(shù)據(jù)的能耗遠(yuǎn)大于計(jì)算模塊中計(jì)算的能耗。
文獻(xiàn)[14]以Fire module(Fm)劃分網(wǎng)絡(luò)本加速器以Pb劃分網(wǎng)絡(luò),兩種劃分方式的流動數(shù)據(jù)量比較如圖8所示,其中網(wǎng)絡(luò)流動數(shù)據(jù)量包括輸入特征圖(In)、權(quán)重(W)和輸出特征圖(O)數(shù)據(jù)量,并給出Pb流動數(shù)據(jù)量占Fire module流動數(shù)據(jù)量的百分比(Pb/Fm)。
圖8 兩種劃分方式流動數(shù)據(jù)量對比
看由圖8可以出,以處理塊劃分網(wǎng)絡(luò)的流動數(shù)據(jù)量比Fm劃分方式少。所有Fm中流動數(shù)據(jù)量輸出值為7.62 MB,所有Pb中流動數(shù)據(jù)量輸出值為3.40 MB。相比之下,Pb中總流動數(shù)據(jù)量減少為Fm中總流動數(shù)據(jù)量的44.62%,即以Pb劃分網(wǎng)絡(luò)后,整個網(wǎng)絡(luò)減少55.38%的數(shù)據(jù)流動量。
利用激活函數(shù)特性為核心計(jì)算模塊設(shè)計(jì)了有效索引生成單元、有效索引控制取值單元和卷積判斷單元,可跳過無效值占用的計(jì)算量和計(jì)算周期。
圖9(a)為SqueezeNet網(wǎng)絡(luò)中不同處理塊(Pb)的計(jì)算量,包含Expand3×3(E3)、Expand1×1(E1)和Squeeze1×1(S1)層中0值乘累加計(jì)算量(Zero MAC)、非0值乘累加計(jì)算量(Nonzero MAC)以及0值乘累加計(jì)算量占總計(jì)算量(Zero MAC/Total MAC)的比例。由圖9(a)中可知,隨著網(wǎng)絡(luò)層數(shù)加深,0值乘累加計(jì)算量占總計(jì)算量的比例也在增加。
(a)
圖9(b)給出了不同處理塊的理想周期消耗(Cycle_Th)和仿真周期消耗(Cycle_Ac),其中理想周期消耗不考慮數(shù)據(jù)延遲,而仿真周期消耗為Modelsim仿真結(jié)果統(tǒng)計(jì)的周期消耗數(shù),其加入了數(shù)據(jù)延遲。由圖9(b)可知,引入提前結(jié)束卷積計(jì)算思想后,仿真周期消耗數(shù)低于理想周期消耗數(shù)。而處理塊1(Pb1)中未利用提前結(jié)束卷積計(jì)算思想,其理想周期消耗數(shù)為29 256,仿真周期消耗數(shù)為32 362。匯總所有處理塊中理周期消耗數(shù)得到網(wǎng)絡(luò)整體周期消耗數(shù)為419 688,而匯總所有處理塊中仿真周期消耗數(shù)可得到網(wǎng)絡(luò)整體周期消耗數(shù)為358 071。相比理想周期消耗數(shù),仿真周期消耗數(shù)減少為它的85.32%,跳過了14.68%無效值占用的計(jì)算量和計(jì)算周期。
表1是加速器設(shè)計(jì)綜合后的FPGA中資源消耗,其中DSP用于執(zhí)行卷積計(jì)算,BRAM用于存儲特征圖值和權(quán)值。
表1 資源消耗
表2為所設(shè)計(jì)的加速器與其它研究中加速器的對比結(jié)果。本文設(shè)計(jì)的加速器與文獻(xiàn)[16]相比,都使用定點(diǎn)數(shù)表示網(wǎng)絡(luò)參數(shù),但本文加速器增加了網(wǎng)絡(luò)并行度,消耗的計(jì)算資源DSP為文獻(xiàn)[16]的8倍左右,延遲加速比則達(dá)到93倍。在消耗相同計(jì)算資源的情況下,相比文獻(xiàn)[16],本加速器的延遲加速比達(dá)到11倍左右。本文與文獻(xiàn)[14]加速器均使用相同的精度數(shù)據(jù)表示網(wǎng)絡(luò)參數(shù),加速器間延遲數(shù)據(jù)相差不大,但本加速器中計(jì)算資源DSP和存儲資源BRAM消耗比文獻(xiàn)[14]中低,加速器整體性能高于文獻(xiàn)[14]中的加速器。
表2 與其它研究的對比
本文針對輕量型SqueezeNet網(wǎng)絡(luò)中間流動數(shù)據(jù)量大及計(jì)算周期長等問題,設(shè)計(jì)了一種基于FPGA的SqueezeNet推斷加速器。本文提出了處理塊結(jié)構(gòu)部署網(wǎng)絡(luò),相比文獻(xiàn)[14]的方案減少了55.38%的數(shù)據(jù)流動量,降低了讀寫內(nèi)存消耗。此外,本文為處理塊中計(jì)算模塊引入提前結(jié)束卷積計(jì)算思想,跳過特征圖中14.68%的無效值占用的計(jì)算量和計(jì)算周期,減少了計(jì)算資源和存儲資源的消耗。實(shí)驗(yàn)結(jié)果分析表明,利用處理塊結(jié)構(gòu)和提前結(jié)束卷積計(jì)算的思想能提高加速器性能。本加速器是針對輕量型網(wǎng)絡(luò)SqueezeNet設(shè)計(jì)的,在以后的研究中可嘗試設(shè)計(jì)通用性更強(qiáng)的網(wǎng)絡(luò)加速器。