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