周冠宇
(南京航空航天大學(xué),江蘇 南京 210016)
目前,深度學(xué)習(xí)在圖像分類(lèi)、目標(biāo)檢測(cè)、機(jī)器翻譯、語(yǔ)音識(shí)別以及其他相關(guān)領(lǐng)域都取得了很多成果。卷積神經(jīng)網(wǎng)絡(luò)(convolutional nerual network)作為深度學(xué)習(xí)最具代表性的算法之一,近幾年來(lái)也取得了極大的發(fā)展,一些新的優(yōu)化算法和改良的卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)被不斷提出。
MobileNet是谷歌在2017年發(fā)布的一種輕量級(jí)卷積神經(jīng)網(wǎng)絡(luò)模型[1],與傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)模型相比,它在保證精度損失不大的前提下,彌補(bǔ)了傳統(tǒng)卷積神經(jīng)網(wǎng)絡(luò)模型過(guò)于巨大導(dǎo)致的無(wú)法應(yīng)用于嵌入式設(shè)備的不足。目前基于MobileNet的現(xiàn)場(chǎng)可編程門(mén)陳列(field programmable gate array, FPGA)實(shí)現(xiàn)[2-5]主要集中在通過(guò)增加資源的使用量來(lái)提高分類(lèi)速度,很少考慮硬件結(jié)構(gòu)上的優(yōu)化,對(duì)計(jì)算資源的浪費(fèi)情況較為嚴(yán)重。針對(duì)上述不足,本文設(shè)計(jì)了一個(gè)高性能的FPGA硬件架構(gòu)和加速單元,并與現(xiàn)有的MobileNet模型進(jìn)行了性能及結(jié)果分析。
MobileNet模型的關(guān)鍵點(diǎn)在于使用深度可分離卷積代替了普通的卷積結(jié)構(gòu)。得益于深度可分離卷積的特點(diǎn),MobileNet在精度損失不大的情況下,大大減少了整個(gè)網(wǎng)絡(luò)中的參數(shù)量和計(jì)算量。
深度可分離卷積結(jié)構(gòu)如圖1所示。它可以被分為兩個(gè)更小的操作:深度卷積和可分離卷積。深度卷積的輸入特征通道數(shù)和輸出特征通道數(shù)數(shù)目相等,各個(gè)輸入通道相互獨(dú)立??煞蛛x卷積在計(jì)算方式上其實(shí)就是普通的卷積,只不過(guò)采用的是1×1的卷積核,因此它也被稱(chēng)為點(diǎn)卷積。
圖1 深度可分離結(jié)構(gòu)
深度卷積的表達(dá)公式如式(1)所示。
(1)
式中:K是深度卷積核權(quán)重;下標(biāo)i,j表示作用在通道m(xù)上的卷積核像素點(diǎn)的位置;G代表特征圖輸出;k和l代表輸出特征圖的大小。
點(diǎn)卷積的表達(dá)公式如式(2)所示。
(2)
式中:Yi,N代表第N個(gè)輸出通道第i個(gè)位置的點(diǎn)卷積值;xi代表輸入第i個(gè)通道輸入特征圖上的像素點(diǎn);Wi,N代表輸出第N個(gè)通道對(duì)應(yīng)于第i個(gè)輸入通道的權(quán)重。
MobileNet的基本結(jié)構(gòu)如圖2所示。標(biāo)準(zhǔn)卷積、深度卷積以及點(diǎn)卷積后都會(huì)緊跟批量歸一化(batch normalization, BN)以及激活函數(shù)ReLU層。
圖2 MobileNet基本結(jié)構(gòu)
BN主要有加快卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和收斂速度、防止過(guò)擬合、控制梯度爆炸3個(gè)作用。它將所有樣本上每個(gè)特征的值歸一化為平均值為0且方差為1的數(shù)據(jù)。這使卷積值落入非線性函數(shù)有效值區(qū)域的中心,從而避免了梯度消失。在網(wǎng)絡(luò)訓(xùn)練后完成,批量歸一化層可由式(3)表示。其中γ與β值為常數(shù)。
y=γx+β
(3)
激活函數(shù)給卷積神經(jīng)網(wǎng)絡(luò)內(nèi)部帶來(lái)了非線性,ReLU函數(shù)如式(4)所示。
ReLU(x)=max(0,x)
(4)
池化層也被稱(chēng)為下采樣層,其具體操作與卷積層的操作基本相同,只不過(guò)池化層的運(yùn)算操作為只取對(duì)應(yīng)窗口內(nèi)的最大值、平均值等(最大池化、平均池化),即矩陣之間的運(yùn)算規(guī)律不一樣,并且不經(jīng)過(guò)反向傳播的修改,平均池化過(guò)程可用式(5)表示。
(5)
Softmax函數(shù)在深度學(xué)習(xí)中負(fù)責(zé)將多個(gè)神經(jīng)元的輸出,映射到(0,1)區(qū)間內(nèi),輸出的數(shù)值可以看成概率,從而來(lái)進(jìn)行圖像分類(lèi)。函數(shù)公式如式(6)所示。
(6)
本文設(shè)計(jì)的卷積神經(jīng)網(wǎng)絡(luò)加速系統(tǒng)采用“ARM+FPGA”的架構(gòu)(圖3),ARM側(cè)除了初始配置以及最后對(duì)結(jié)果的處理外,沒(méi)有參與到系統(tǒng)中間的運(yùn)算以及數(shù)據(jù)傳輸中,這顯著降低了系統(tǒng)運(yùn)行過(guò)程中ARM與FPGA通信所需的時(shí)間,提供了更高的計(jì)算效率。
圖3 系統(tǒng)架構(gòu)
卷積運(yùn)算模塊是整個(gè)硬件結(jié)構(gòu)的核心,其內(nèi)部由深度卷積運(yùn)算單元和點(diǎn)卷積運(yùn)算單元組成。由于FPGA內(nèi)部資源有限,不能將整個(gè)MobileNet網(wǎng)絡(luò)模型以平鋪式的架構(gòu)在FPGA上實(shí)現(xiàn),而MobileNet各層之間的計(jì)算方式存在極高的相似性。因此采用分時(shí)復(fù)用單層計(jì)算資源的方式來(lái)實(shí)現(xiàn)整個(gè)網(wǎng)絡(luò)。該模塊中的深度卷積運(yùn)算單元和點(diǎn)卷積運(yùn)算單元的圖像緩沖區(qū)域均為雙緩沖結(jié)構(gòu):一個(gè)是工作緩沖,負(fù)責(zé)存儲(chǔ)上一層網(wǎng)絡(luò)的輸出特征圖;另一個(gè)是結(jié)果緩沖,負(fù)責(zé)存儲(chǔ)本層網(wǎng)絡(luò)的中間結(jié)果。
1)并行化深度卷積運(yùn)算單元設(shè)計(jì)
每一個(gè)深度卷積計(jì)算單元DWC Unit負(fù)責(zé)一個(gè)輸入通道的計(jì)算,其結(jié)構(gòu)如圖4所示。深度卷積的卷積窗口為3×3,卷積窗口內(nèi)各個(gè)像素點(diǎn)在進(jìn)行乘累加時(shí)相互獨(dú)立,無(wú)依賴(lài)關(guān)系。因此本文在空間上對(duì)該卷積過(guò)程展開(kāi),進(jìn)行卷積核內(nèi)部的并行處理。一個(gè)DWC Unit內(nèi)包括9個(gè)乘法單元,mult用來(lái)執(zhí)行乘法操作,mult間通過(guò)加法樹(shù)連接,一個(gè)周期就可以計(jì)算得出一個(gè)像素點(diǎn),之后計(jì)算出來(lái)的像素點(diǎn)經(jīng)過(guò)BN層以及ReLU激活函數(shù)被送入雙緩沖結(jié)構(gòu)中進(jìn)行暫存。多個(gè)DWC Unit同時(shí)進(jìn)行多個(gè)輸入通道的并行計(jì)算也可以加快網(wǎng)絡(luò)層計(jì)算的吞吐量,本文設(shè)置4個(gè)DWC Unit同時(shí)計(jì)算,不同DWC Unit計(jì)算得出的結(jié)果被送至不同的片上緩存區(qū)域。
圖4 并行化深度卷積計(jì)算單元結(jié)構(gòu)
2)并行化點(diǎn)卷積運(yùn)算單元設(shè)計(jì)
從第二節(jié)的分析中可以看出,標(biāo)準(zhǔn)卷積層與點(diǎn)卷積層的結(jié)構(gòu)類(lèi)似,只是卷積核窗口大小不同。而整個(gè)MobileNet網(wǎng)絡(luò)結(jié)構(gòu)中只有第一層為標(biāo)準(zhǔn)卷積結(jié)構(gòu),如果單獨(dú)設(shè)計(jì)標(biāo)準(zhǔn)卷積結(jié)構(gòu),那么在第一層計(jì)算完畢后,用于進(jìn)行標(biāo)準(zhǔn)卷積的計(jì)算單元會(huì)進(jìn)入空閑狀態(tài),造成較大的資源浪費(fèi)。因此,本文設(shè)計(jì)了PWC Unit計(jì)算單元,使其能夠?qū)崿F(xiàn)標(biāo)準(zhǔn)卷積以及點(diǎn)卷積兩種網(wǎng)絡(luò)層的運(yùn)算,節(jié)省了資源,同時(shí)優(yōu)化了數(shù)據(jù)流向,更有利于流水線的形成。PWC Unit計(jì)算單元結(jié)構(gòu)如圖5所示,每一個(gè)PWC Unit中只包含一個(gè)mult用來(lái)進(jìn)行3×3或者1×1的卷積運(yùn)算,不再考慮卷積核內(nèi)部的并行處理。卷積結(jié)果經(jīng)過(guò)BN和ReLU后經(jīng)過(guò)加法樹(shù)后送入數(shù)據(jù)分散模塊。由于深度卷積層與點(diǎn)卷積層之間存在數(shù)據(jù)依賴(lài)性,因此深度卷積與點(diǎn)卷積計(jì)算單元的個(gè)數(shù)需要保持一致。而點(diǎn)卷積的結(jié)果計(jì)算后需要經(jīng)過(guò)數(shù)據(jù)分散模塊分散存儲(chǔ)在不同的片上緩存區(qū)域中才能滿(mǎn)足深度卷積計(jì)算單元的計(jì)算要求。
圖5 并行化點(diǎn)卷積計(jì)算單元結(jié)構(gòu)
本文時(shí)序策略分為兩塊,整個(gè)方案采用分時(shí)復(fù)用卷積計(jì)算模塊的方式實(shí)現(xiàn),網(wǎng)絡(luò)模型中的各卷積層都通過(guò)一個(gè)卷積計(jì)算模塊進(jìn)行實(shí)現(xiàn)。而在深度卷積與點(diǎn)卷積計(jì)算單元之間,采用層間流水的方式進(jìn)行兩者的并行運(yùn)算。當(dāng)ARM側(cè)向FPGA側(cè)發(fā)出啟動(dòng)信號(hào)后,標(biāo)準(zhǔn)卷積開(kāi)始進(jìn)行計(jì)算。當(dāng)標(biāo)準(zhǔn)卷積計(jì)算得出深度卷積需要的第一個(gè)卷積窗口時(shí),深度卷積開(kāi)始啟動(dòng)并與標(biāo)準(zhǔn)卷積同時(shí)進(jìn)行運(yùn)算。由于點(diǎn)卷積和標(biāo)準(zhǔn)卷積共用一個(gè)計(jì)算模塊,因此當(dāng)標(biāo)準(zhǔn)卷積層計(jì)算完畢,解除對(duì)計(jì)算模塊的占用后,深度卷積和點(diǎn)卷積才會(huì)同時(shí)進(jìn)行運(yùn)算,在標(biāo)準(zhǔn)卷積計(jì)算完成之前,深度卷積的結(jié)果會(huì)暫存在片上緩存中。緩存區(qū)域均采用雙緩存結(jié)構(gòu),當(dāng)?shù)趎層深度卷積正在進(jìn)行運(yùn)算時(shí),由于本文采用了層間并行運(yùn)算的設(shè)計(jì)方式,此時(shí)點(diǎn)卷積計(jì)算單元正在進(jìn)行n-1層的運(yùn)算,它的輸入是n-1層深度卷積的計(jì)算結(jié)果,因此深度卷積計(jì)算單元得到的結(jié)果需要被存放在結(jié)果緩沖中,點(diǎn)卷積計(jì)算單元需要的輸入特征圖則是從工作緩沖中讀取,這種結(jié)構(gòu)保證了當(dāng)前層正在參與計(jì)算的數(shù)據(jù)結(jié)果不會(huì)被計(jì)算出來(lái)的輸出特征圖覆蓋,同時(shí)減少了對(duì)外部存儲(chǔ)的訪問(wèn),提高了整個(gè)網(wǎng)絡(luò)的運(yùn)行速度。
本文采用的PYNQ板卡作為加速器驗(yàn)證平臺(tái),內(nèi)嵌Xilinx XC7Z020 FPGA芯片。整個(gè)硬件系統(tǒng)架構(gòu)為ARM+FPGA的異構(gòu)架構(gòu)。硬件開(kāi)發(fā)使用的是某公司提供的Vivado 2017.4開(kāi)發(fā)環(huán)境,軟件開(kāi)發(fā)環(huán)境為Xilinx SDK 2017.4。
在100MHz工作頻率下,本文設(shè)計(jì)的加速器資源使用情況如表1所示。通過(guò)分析可以發(fā)現(xiàn)DSP48E和BRAM是使用最多的兩種資源,這主要是因?yàn)槟P椭写嬖诖罅康某朔ㄟ\(yùn)算以及中間結(jié)果被全部緩存在BRAM。
表1 資源使用數(shù)量
與其他文獻(xiàn)的工作對(duì)比如表2所示。
表2 本設(shè)計(jì)與現(xiàn)有成果對(duì)比
對(duì)表2分析可知,與文獻(xiàn)[2]和文獻(xiàn)[3]相比,本設(shè)計(jì)使用的資源較少,同時(shí)實(shí)現(xiàn)了較高的分類(lèi)速度。
本文針對(duì)MobileNet的網(wǎng)絡(luò)結(jié)構(gòu),提出了深度流水化的加速器優(yōu)化方案。設(shè)計(jì)了一種時(shí)序控制策略,使得深度卷積層和點(diǎn)卷積層能夠同時(shí)計(jì)算來(lái)減少兩者之間的計(jì)算等待時(shí)間;設(shè)計(jì)了一種系統(tǒng)架構(gòu)來(lái)有效地減少處理器與FPGA的通信次數(shù);設(shè)計(jì)了能夠同時(shí)支持標(biāo)準(zhǔn)卷積與點(diǎn)卷積計(jì)算的計(jì)算單元,節(jié)省了資源。本文提出的加速器在工作頻率為100MHz的情況下,F(xiàn)PS可以達(dá)到135.2。