何凱旋,袁 勛,陳 松
(1.中國(guó)科學(xué)技術(shù)大學(xué) 微電子學(xué)院,安徽 合肥 230026; 2.中國(guó)科學(xué)技術(shù)大學(xué) 微納電子系統(tǒng)集成研究中心,安徽 合肥 230026)
卷積神經(jīng)網(wǎng)絡(luò)是一種多層神經(jīng)網(wǎng)絡(luò),通常由卷積層、池化層和全連接層組成。在圖像處理領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)主要用于對(duì)輸入圖像的特征進(jìn)行提取分類,以識(shí)別位移、縮放與其他形式扭曲不變的二維圖形,比如應(yīng)用于手寫數(shù)字與車牌的識(shí)別[1-2]。ImageNet數(shù)據(jù)集的推出,使卷積神經(jīng)網(wǎng)絡(luò)在計(jì)算機(jī)視覺(jué)應(yīng)用方面取得巨大成功,更加推動(dòng)了卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展[3]。
卷積神經(jīng)網(wǎng)絡(luò)具有很高的并行性,其間的運(yùn)算操作由大量的乘法與加法組成,是一種運(yùn)算密集性很高的網(wǎng)絡(luò)。FPGA設(shè)計(jì)靈活,大量的片上資源可以滿足卷積神經(jīng)網(wǎng)絡(luò)的運(yùn)算要求,不僅可以充分發(fā)揮卷積神經(jīng)網(wǎng)絡(luò)的并行性,還可以有效降低設(shè)計(jì)成本。
隨著卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展,其深度和復(fù)雜度都在上升。從大量的前人工作中可以發(fā)現(xiàn),卷積神經(jīng)網(wǎng)絡(luò)識(shí)別的正確率與其層數(shù)規(guī)?;境烧?,在硬件實(shí)現(xiàn)的階段,便對(duì)FPGA的片上資源需求提出了更大的挑戰(zhàn)。因此,本文提出動(dòng)態(tài)重構(gòu)的設(shè)計(jì)方法來(lái)降低卷積神經(jīng)網(wǎng)絡(luò)所需的硬件資源。
基于FPGA的動(dòng)態(tài)重構(gòu)技術(shù)就是利用“時(shí)分復(fù)用”的思想,將FPGA的配置區(qū)域劃分為靜態(tài)區(qū)域與重構(gòu)區(qū)域。在重構(gòu)控制器的控制下,重構(gòu)區(qū)域從存儲(chǔ)器中加載不同的配置文件,經(jīng)過(guò)一定的配置時(shí)間,重構(gòu)模塊加載完成,之后重構(gòu)區(qū)域可以開始執(zhí)行不同的邏輯功能。如果重構(gòu)區(qū)域的配置時(shí)間大于兩個(gè)重構(gòu)模塊使用時(shí)間間隔,便會(huì)延長(zhǎng)系統(tǒng)的執(zhí)行時(shí)間,反之,便可以隱藏在執(zhí)行時(shí)間中。當(dāng)一個(gè)重構(gòu)區(qū)域重配置時(shí),F(xiàn)PGA內(nèi)部其他區(qū)域的正常運(yùn)行不受影響。通過(guò)應(yīng)用FPGA可動(dòng)態(tài)重構(gòu)的特性,可以實(shí)現(xiàn)FPGA上資源的“時(shí)分復(fù)用”,對(duì)部分模塊進(jìn)行動(dòng)態(tài)重構(gòu),提高了系統(tǒng)的靈活性,充分利用了FPGA的硬件資源,節(jié)約了成本。動(dòng)態(tài)重構(gòu)技術(shù)具有很高的拓展性,可以應(yīng)用于航天、國(guó)防等眾多領(lǐng)域[4]。
卷積神經(jīng)網(wǎng)絡(luò)通常由卷積層、池化層與全連接層組成。卷積層與池化層交替連接構(gòu)成卷積神經(jīng)網(wǎng)絡(luò)的前幾層,一個(gè)或者幾個(gè)全連接層構(gòu)成卷積神經(jīng)網(wǎng)絡(luò)的后幾層,作用是對(duì)前面的網(wǎng)絡(luò)層產(chǎn)生的特征進(jìn)行識(shí)別與分類。通過(guò)局部連接和神經(jīng)元的共享權(quán)重,可以大大減少卷積神經(jīng)網(wǎng)絡(luò)所需的參數(shù),且卷積神經(jīng)網(wǎng)絡(luò)的執(zhí)行效率高于全連接神經(jīng)網(wǎng)絡(luò)。結(jié)合池化層的功能,使得圖像特征具有較好的平移、縮放和扭曲不變性[5]。
本文使用的優(yōu)化Lenet-5手寫體識(shí)別卷積神經(jīng)網(wǎng)絡(luò)是一個(gè)典型的多層感知網(wǎng)絡(luò)[1],由三層卷積層(C1、C3、C5)、兩層池化層(S2,S4)與一層全連接層(F6)組成,如圖1所示。
圖1 優(yōu)化的Lenet-5網(wǎng)絡(luò)
其中,C1層為單卷積層,實(shí)行卷積運(yùn)算,有6個(gè)卷積核,輸入1幅32×32的圖像,輸出6幅28×28的特征圖像。S2層為2×2的平均池化層,輸入6幅28×28的特征圖像,輸出6幅14×14的特征圖像。S2與C3之間有一個(gè)激勵(lì)層。C3為卷積層,輸入6幅14×14的特征圖像,輸出16幅10×10的特征圖像,每個(gè)輸出由若干個(gè)輸入圖像卷積后相加再加偏置得到。S4層為2×2 的平均池化層,輸入16幅10×10的特征圖像,輸出16幅5×5的特征圖像。C5為卷積層,輸入16幅5×5 的特征圖像,輸出120幅1×1的特征圖像。F6為全連接層,輸入為1×120的特征圖像,輸出為1×10的特征圖像,值最大的即結(jié)果。
卷積層生成的輸出特征圖可由(1)式計(jì)算得到:
Aki=f(Wki?Aki-1+bki)
(1)
其中,Aki表示第i層的第k個(gè)特征圖,第i層的第k個(gè)卷積核的特性由權(quán)重矩陣Wki和偏置項(xiàng)bki決定。
卷積神經(jīng)網(wǎng)絡(luò)由于其自身算法的運(yùn)算密集性,在硬件實(shí)現(xiàn)階段對(duì)LUT、DSP等資源提出了很高的要求,所以降低卷積神經(jīng)網(wǎng)絡(luò)的硬件資源占用量勢(shì)在必行。
基于FPGA動(dòng)態(tài)可重構(gòu)技術(shù)就是利用“時(shí)分復(fù)用”的思想,將設(shè)計(jì)從一個(gè)純空間的數(shù)字邏輯系統(tǒng)轉(zhuǎn)化為在時(shí)間、空間混合構(gòu)建的數(shù)字邏輯系統(tǒng)。這種技術(shù)使FPGA資源利用率成倍提高,實(shí)現(xiàn)系統(tǒng)功能所用的硬件規(guī)模大大下降[6]。
本文采用模塊化設(shè)計(jì)方法實(shí)現(xiàn)FPGA的動(dòng)態(tài)部分重構(gòu),其原則是將重構(gòu)邏輯和靜態(tài)邏輯劃分到不同的區(qū)域中。根據(jù)要求從重構(gòu)區(qū)域中替換需要更改的模塊,從而實(shí)現(xiàn)動(dòng)態(tài)重構(gòu)的功能,如圖2所示。
圖2 模塊化設(shè)計(jì)示意圖
動(dòng)態(tài)重構(gòu)的流程需要使用動(dòng)態(tài)重構(gòu)控制器來(lái)進(jìn)行控制。動(dòng)態(tài)重構(gòu)控制器接收靜態(tài)區(qū)域中產(chǎn)生的重構(gòu)觸發(fā)信號(hào),然后對(duì)相應(yīng)的重構(gòu)區(qū)域進(jìn)行重配置。
動(dòng)態(tài)重構(gòu)控制器從非易失性存儲(chǔ)器(例如Flash)中檢索部分比特流文件,將其傳送到內(nèi)部配置端口ICAP(Internal Configuration Access Port)。動(dòng)態(tài)重構(gòu)制器可以置于外部設(shè)備(例如處理器)中,也可以放在需要重構(gòu)的FPGA設(shè)備中。與靜態(tài)區(qū)域中的其他邏輯一樣,動(dòng)態(tài)重構(gòu)控制器在整個(gè)動(dòng)態(tài)重構(gòu)過(guò)程中不間斷地運(yùn)行。
Vivado設(shè)計(jì)套件對(duì)動(dòng)態(tài)重構(gòu)的設(shè)計(jì)進(jìn)行了軟件上的支持。在Vivado中,提供了動(dòng)態(tài)重構(gòu)設(shè)計(jì)的專用流程,并且提供了動(dòng)態(tài)重構(gòu)控制器(Partial Reconfiguration Controller,PRC)IP核[7-8],用戶可以直接使用此IP核來(lái)進(jìn)行動(dòng)態(tài)重構(gòu)流程的設(shè)計(jì)。
靜態(tài)卷積神經(jīng)網(wǎng)絡(luò)加速器的總體硬件架構(gòu)圖如圖3所示。在第一層(C1)、第三層(C3)與第五層(C5)卷積層階段,分別采用了6個(gè)、6個(gè)、10個(gè)卷積模塊并行運(yùn)算。其中第二層池化層(S2)與第四層池化層(S4)分別與之前的C1和C3構(gòu)成流水線結(jié)構(gòu)。最后一層全連接層(F6)直接復(fù)用C5層的10個(gè)卷積模塊。
圖3 總體架構(gòu)圖
在第一層卷積層(C1)中,輸入為32×32的輸入圖像,輸出為6個(gè)通道的輸出特征圖。所以在C1中,設(shè)計(jì)了6個(gè)卷積模塊并行地對(duì)6幅輸出特征圖進(jìn)行計(jì)算。在每個(gè)卷積模塊中有5個(gè)PE單元,它們將25個(gè)乘加運(yùn)算分解為5個(gè)1×5的乘加運(yùn)算并行計(jì)算。
C1之后的是第一層池化層(S2),輸入為6幅28×28的特征圖,輸出為6幅14×14的輸出特征圖。所以在S2中,設(shè)計(jì)了6個(gè)池化模塊并行地對(duì)6幅輸入特征圖進(jìn)行池化運(yùn)算。C1與S2采用流水線結(jié)構(gòu),S2階段首先對(duì)C1階段生成的像素點(diǎn)進(jìn)行緩存,當(dāng)緩存的像素點(diǎn)可以形成一個(gè)2×2的池化區(qū)域時(shí),開始S2層的運(yùn)算。
第二層卷積層(C3)在S2之后開始運(yùn)算。C3層的輸入圖像為6幅14×14的輸入特征圖,輸出為16幅10×10的輸出特征圖(與6幅輸入特征圖部分連接)。所以在C3層中設(shè)計(jì)了6個(gè)卷積模塊對(duì)6幅輸入特征圖進(jìn)行卷積操作,串行地輸出16幅輸出特征圖。卷積模塊中的PE設(shè)計(jì)同C1層。
第二層池化層(S4)采用一個(gè)池化模塊對(duì)串行輸出的16幅輸出特征圖進(jìn)行下采樣,輸出16幅5×4的輸出特征圖。流水線設(shè)計(jì)同上。
第三層卷積層(C5)的輸入為16幅5×5的輸入特征圖,輸出為120幅1×1的輸出特征圖。所以設(shè)計(jì)了10個(gè)卷積模塊循環(huán)12次對(duì)這120個(gè)輸出特征圖進(jìn)行計(jì)算。
最后一層全連接層(F6)輸出為1×10的數(shù)組,代表著手寫體的識(shí)別結(jié)果。這里復(fù)用了C5層的10個(gè)卷積模塊來(lái)對(duì)這十個(gè)值并行計(jì)算。
卷積神經(jīng)網(wǎng)絡(luò)涉及的一個(gè)核心運(yùn)算是圖像的卷積運(yùn)算。由于Lenet-5網(wǎng)絡(luò)卷積層的卷積運(yùn)算規(guī)模為5×5,本文的設(shè)計(jì)將卷積運(yùn)算分成等量的5組,每組中的5個(gè)乘加運(yùn)算采用二級(jí)流水線的結(jié)構(gòu)。每一組的乘加運(yùn)算都會(huì)輸出一個(gè)結(jié)果至下一組,下一組將自己的乘加運(yùn)算結(jié)果加上上一組的結(jié)果后,再繼續(xù)對(duì)下一組輸入。最后由第五組累加前面4組的乘加和進(jìn)行輸出。本文設(shè)計(jì)的PE結(jié)構(gòu)圖如圖4所示。PE工作時(shí)乘法器每個(gè)周期都有輸入數(shù)據(jù),既提高了吞吐率又提高了硬件的利用率。
圖4 PE架構(gòu)圖
本文設(shè)計(jì)的動(dòng)態(tài)部分重構(gòu)方案把FPGA片上區(qū)域分為靜態(tài)區(qū)域(Static)與四個(gè)動(dòng)態(tài)重構(gòu)區(qū)域(PR1、PR2、PR3、PR4)。每個(gè)重構(gòu)區(qū)域都分配了三個(gè)不同的重構(gòu)模塊用于分時(shí)配置。
將重構(gòu)模塊分配給不同的重構(gòu)區(qū)域時(shí),遵循了配置進(jìn)同一個(gè)重構(gòu)區(qū)域的不同模塊,其占用的片上資源數(shù)目要盡量相近的原則,以降低對(duì)片上資源的浪費(fèi)[9]。本文的設(shè)計(jì)對(duì)重構(gòu)模塊的分配情況如表1所示。在不同的階段,相應(yīng)的重構(gòu)模塊被配置進(jìn)對(duì)應(yīng)的重構(gòu)區(qū)域中,與靜態(tài)區(qū)域中的其他模塊共同完成這一階段的運(yùn)算。
如表1所示,整個(gè)神經(jīng)網(wǎng)絡(luò)的識(shí)別過(guò)程分為C1-S2(第一層卷積層與第二層池化層)、C3-S4(第三層卷積層與第四層池化層)與C5-F6(第五層卷積層與第六層全連接層)這三個(gè)階段。
表1 重構(gòu)模塊分配
在第一個(gè)階段,四個(gè)重構(gòu)區(qū)域?qū)?huì)配置C1層與S2層所需的功能模塊。在S2層的輸出特征圖存儲(chǔ)結(jié)束之后,部分重構(gòu)控制器通過(guò)ICAP接口讀取C3-S4階段的配置文件,對(duì)四個(gè)重構(gòu)區(qū)域進(jìn)行新的配置。C5-F6階段同理。在C5~F6階段的運(yùn)算完成后,卷積神經(jīng)網(wǎng)絡(luò)輸出一個(gè)識(shí)別結(jié)果,此時(shí)開始新的C1-S2階段的重構(gòu)模塊配置。
重構(gòu)設(shè)計(jì)硬件架構(gòu)圖如圖5所示。對(duì)于重構(gòu)流程的控制、配置文件的掃描提取、配置文件的存儲(chǔ),分別使用了:
圖5 硬件架構(gòu)圖
(1)Xilinx?PRC(Partial Reconfiguration Controller) IP:Xilinx提供的PRC IP為部分動(dòng)態(tài)重構(gòu)提供了管理功能,它可以監(jiān)測(cè)到重構(gòu)觸發(fā)信號(hào),并對(duì)重構(gòu)的流程進(jìn)行控制[8]。
(2)ICAP (Internal Configuration Access Port):Xilinx FPGA的動(dòng)態(tài)部分重構(gòu)設(shè)計(jì)要基于ICAP接口來(lái)實(shí)現(xiàn),它用于檢索與傳送存儲(chǔ)于非易失性存儲(chǔ)器中的配置文件,并且可以通過(guò)部分重構(gòu)控制器來(lái)控制[9]。
(3)BPI(Byte-wide Peripheral Interface) Flash:本文的設(shè)計(jì)中采用了FPGA開發(fā)板上的BPI Flash來(lái)進(jìn)行所有配置文件的存儲(chǔ)。BPI Flash在存儲(chǔ)結(jié)構(gòu)上屬于Nor Flash,其×16位寬的數(shù)據(jù)總線可以提供比SPI閃存更快的配置,并且擁有比SPI閃存更大的容量[10]。
當(dāng)重構(gòu)區(qū)域需要重配置時(shí),會(huì)產(chǎn)生一個(gè)特定的觸發(fā)信號(hào)。PRC捕捉到觸發(fā)信號(hào)后,通過(guò)ICAP端口提取存儲(chǔ)至BPI Flash的配置文件。ICAP作為FPGA的內(nèi)部配置端口,和SelectMap端口功能相似,它會(huì)在PRC的控制下對(duì)FPGA進(jìn)行動(dòng)態(tài)配置。
本文對(duì)Lenet-5手寫體識(shí)別網(wǎng)絡(luò)的動(dòng)態(tài)重構(gòu)設(shè)計(jì),采用了Xilinx-VC707開發(fā)板上進(jìn)行硬件實(shí)現(xiàn)。代碼編寫采用Verilog硬件描述語(yǔ)言,使用Vivado IDE 2018進(jìn)行仿真實(shí)現(xiàn),軟件環(huán)境為Windows 10。
對(duì)Lenet-5卷積神經(jīng)網(wǎng)絡(luò)的靜態(tài)設(shè)計(jì)(不使用動(dòng)態(tài)部分重構(gòu))與動(dòng)態(tài)部分重構(gòu)設(shè)計(jì)進(jìn)行了對(duì)比。使用了動(dòng)態(tài)部分重構(gòu)方法的設(shè)計(jì)相比靜態(tài)設(shè)計(jì),在片上資源的使用量上,尤其是DSP的使用量上有了極大的降低。具體評(píng)估結(jié)果如表2所示。
表2 資源占用情況
在動(dòng)態(tài)重構(gòu)設(shè)計(jì)后,卷積神經(jīng)網(wǎng)絡(luò)加速器所用Slice LUTs資源降低至靜態(tài)設(shè)計(jì)的56.5%,Slice資源降低至靜態(tài)設(shè)計(jì)的56.5%,Slice Register資源降低至靜態(tài)設(shè)計(jì)的72.2%,DSP資源降低至靜態(tài)設(shè)計(jì)的28.9%??梢?jiàn),動(dòng)態(tài)重構(gòu)設(shè)計(jì)可以有效地減少卷積神經(jīng)網(wǎng)絡(luò)加速器占用的硬件資源,提升資源利用率,節(jié)約硬件成本。
FPGA動(dòng)態(tài)重構(gòu)的配置速度基本由配置文件的大小和ICAP端口的帶寬所限制[9]。
在本文的設(shè)計(jì)中,共劃分了四個(gè)重構(gòu)區(qū)域,每個(gè)重構(gòu)區(qū)域有三個(gè)分時(shí)配置的重構(gòu)模塊,所以一次完整的手寫體識(shí)別網(wǎng)絡(luò)共需要1個(gè)靜態(tài)配置文件與12個(gè)部分配置文件??偟呐渲梦募笮〖s為27 MB。
VC707所屬的Virtex系列開發(fā)板,ICAP配置端口在100 MHz的最大時(shí)鐘頻率下的最大帶寬為3.2 Gb/s[9]。加上卷積神經(jīng)網(wǎng)絡(luò)本身的識(shí)別時(shí)間,計(jì)算得出總時(shí)間為20.3 ms。對(duì)比基于ARM Cortex A9處理器的軟件實(shí)現(xiàn),如表3所示,在時(shí)間與功耗上有著很大的提升。
表3 不同實(shí)現(xiàn)方式識(shí)別100次的用時(shí)與功耗
由于ICAP內(nèi)部配置端口的帶寬限制,動(dòng)態(tài)重構(gòu)之后完成一次手寫體識(shí)別所需的時(shí)間,相較在FPGA上直接進(jìn)行靜態(tài)實(shí)現(xiàn)所需的時(shí)間會(huì)有所延長(zhǎng)。這是因?yàn)樵谥貥?gòu)模塊需要工作時(shí),重構(gòu)區(qū)域還未重配置完成,這些等待重構(gòu)區(qū)域而配置完成的時(shí)間拉長(zhǎng)了整個(gè)系統(tǒng)的執(zhí)行時(shí)間。
在未來(lái)的設(shè)計(jì)中,為了更好地發(fā)揮動(dòng)態(tài)重構(gòu)的優(yōu)勢(shì),可以選取更大規(guī)模的卷積神經(jīng)網(wǎng)絡(luò),并將重構(gòu)粒度縮小,使配置時(shí)間可以隱含在執(zhí)行時(shí)間當(dāng)中。當(dāng)然,相信未來(lái)的科研工作者們會(huì)對(duì)配置端口帶寬進(jìn)一步提升,增大動(dòng)態(tài)重構(gòu)的優(yōu)勢(shì)。
本文介紹了動(dòng)態(tài)部分重構(gòu)的思想與設(shè)計(jì)方法,對(duì)Lenet-5手寫體識(shí)別卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行了動(dòng)態(tài)重構(gòu)設(shè)計(jì)。在文中對(duì)部分動(dòng)態(tài)重構(gòu)設(shè)計(jì)中要用到的ICAP接口與BPI Flash進(jìn)行了簡(jiǎn)要的說(shuō)明。在文章的最后,給出了本文的設(shè)計(jì)在Xilinx VC707上實(shí)現(xiàn)所需的資源、時(shí)間與功耗。實(shí)驗(yàn)表明,動(dòng)態(tài)重構(gòu)設(shè)計(jì)可以有效降低卷積神經(jīng)網(wǎng)絡(luò)硬件實(shí)現(xiàn)階段所需的片上資源,大大提升硬件資源利用率,使卷積神經(jīng)網(wǎng)絡(luò)的硬件實(shí)現(xiàn)更加通用靈活。
本文首次將動(dòng)態(tài)重構(gòu)技術(shù)應(yīng)用于卷積神經(jīng)網(wǎng)絡(luò)的硬件實(shí)現(xiàn)中,可以有效解決卷積神經(jīng)網(wǎng)絡(luò)因所需硬件資源過(guò)多而不能完整放置于硬件的問(wèn)題。
限制動(dòng)態(tài)重構(gòu)配置速度的主要為ICAP配置端口的帶寬,希望未來(lái)科研工作者可以對(duì)此進(jìn)步一提升,更好地推動(dòng)動(dòng)態(tài)部分重構(gòu)的發(fā)展。