秦文強(qiáng),吳仲城,張 俊,李 芳
(1.安徽大學(xué)物質(zhì)科學(xué)與信息技術(shù)研究院,安徽 合肥 230601; 2.中國科學(xué)院合肥物質(zhì)科學(xué)研究院強(qiáng)磁場科學(xué)中心,安徽 合肥 230031;3.強(qiáng)磁場安徽省實(shí)驗(yàn)室,安徽 合肥 230031)
隨著深度神經(jīng)網(wǎng)絡(luò)算法的發(fā)展[1,2],智能應(yīng)用不再局限于在云端服務(wù)器上運(yùn)行,諸如智慧城市、智能安防等應(yīng)用場景,對算法的移動(dòng)嵌入式計(jì)算提出了迫切需求[3]。卷積神經(jīng)網(wǎng)絡(luò)CNN(Convolutional Neural Network)的前向推理過程是計(jì)算密集型任務(wù),由于網(wǎng)絡(luò)參數(shù)量和推理計(jì)算量大,使其難以高效地部署于資源有限的低功耗嵌入式設(shè)備。近年來,卷積神經(jīng)網(wǎng)絡(luò)在終端和邊緣側(cè)的應(yīng)用處于快速發(fā)展階段,模型的加速計(jì)算通??刹捎肅PU、GPU、專用ASIC、FPGA 4類芯片實(shí)現(xiàn)。直接使用CPU進(jìn)行CNN的前向運(yùn)算,很難滿足實(shí)時(shí)性的要求;基于GPU的運(yùn)算雖然速度快,但該類硬件平臺(tái)一般體積大、成本高、功耗高。專用ASIC通過定制化可以有效提升模型運(yùn)算速度,但開發(fā)周期長、難度大,一次性成本高。而FPGA因其高并行、低功耗、靈活可編程的優(yōu)勢,成為嵌入式設(shè)備部署智能應(yīng)用的主要選擇[4]。
在基于FPGA的嵌入式設(shè)備上實(shí)現(xiàn)高效的CNN模型部署,業(yè)界主要聚焦于研究如何降低網(wǎng)絡(luò)在硬件上的實(shí)現(xiàn)復(fù)雜度,并實(shí)現(xiàn)高并行計(jì)算,減少訪存開銷,提升系統(tǒng)的吞吐率,同時(shí)保證模型推理精度。文獻(xiàn)[5]采用量化的方法,降低資源消耗;文獻(xiàn)[6]利用循環(huán)展開實(shí)現(xiàn)并行計(jì)算,利用流水化操作提升計(jì)算效率,但由于數(shù)據(jù)加載和卷積計(jì)算是串行進(jìn)行,系統(tǒng)吞吐率較低;文獻(xiàn)[7]利用循環(huán)優(yōu)化增大并行度,同時(shí)提出了一種數(shù)據(jù)路由器,減少了內(nèi)存訪問的開銷,但是該文獻(xiàn)中的方法將權(quán)重參數(shù)全部導(dǎo)入片上BRAM,消耗大量資源,導(dǎo)致該方法難以應(yīng)用于資源受限的平臺(tái),伸縮性較差。
目前,大部分神經(jīng)網(wǎng)絡(luò)加速器[8,9]都是針對大型CNN模型(如VGG16、ResNet50)進(jìn)行設(shè)計(jì)的,硬件資源消耗較多且難以獲得較高性能。近年來,一些研究人員開始研究輕量化網(wǎng)絡(luò)的加速,文獻(xiàn)[10]實(shí)現(xiàn)了輕量化模型SqueezeNet的FPGA加速器,利用特征圖的稀疏性,采用跳過零激活及數(shù)據(jù)共享的方法,減少了計(jì)算量,但其批標(biāo)準(zhǔn)化在FPGA上實(shí)現(xiàn),導(dǎo)致硬件復(fù)雜度和資源開銷較大。文獻(xiàn)[11]針對輕量化MobileNet設(shè)計(jì)了一個(gè)并行加速單元,并在卷積層之間實(shí)現(xiàn)了流水化操作,但由于其數(shù)據(jù)讀取的速度不能很好地與計(jì)算并行度相匹配,導(dǎo)致計(jì)算效率不高。
針對以上問題,本文分別從網(wǎng)絡(luò)模型優(yōu)化以及硬件加速優(yōu)化2個(gè)方面進(jìn)行研究,通過批標(biāo)準(zhǔn)化融合和動(dòng)態(tài)定點(diǎn)數(shù)量化對模型進(jìn)行預(yù)處理,降低硬件實(shí)現(xiàn)復(fù)雜度;利用卷積分塊策略,使系統(tǒng)具有較好的伸縮性;通過循環(huán)展開、流水化、數(shù)組分割的方法實(shí)現(xiàn)高效并行卷積計(jì)算,同時(shí)通過數(shù)據(jù)流優(yōu)化的方法,提升了系統(tǒng)吞吐率。根據(jù)MobileNet網(wǎng)絡(luò)結(jié)構(gòu)特點(diǎn),基于FPGA分別設(shè)計(jì)了標(biāo)準(zhǔn)卷積、逐點(diǎn)卷積、深度卷積、殘差連接、池化和全連接IP (Intellectual Property)核,并結(jié)合CPU進(jìn)行資源調(diào)度,實(shí)現(xiàn)了基于異構(gòu)平臺(tái)的MobileNet神經(jīng)網(wǎng)絡(luò)加速系統(tǒng)。
MobileNet系列網(wǎng)絡(luò)模型[12-14]的主要特點(diǎn)是引入了深度可分離卷積的設(shè)計(jì)理念[15]。深度可分離卷積由深度Dw(Depthwise)卷積和逐點(diǎn)Pw(Pointwise)卷積組成,分別起到濾波和轉(zhuǎn)換通道的作用。相比標(biāo)準(zhǔn)卷積操作,Dw卷積的卷積核負(fù)責(zé)單個(gè)通道的特征提取,通道間不疊加;Pw卷積是卷積核為1*1的標(biāo)準(zhǔn)卷積,通過將特征圖在深度方向上進(jìn)行加權(quán)組合,實(shí)現(xiàn)通道間信息的融合。該系列模型中,MobileNetV2網(wǎng)絡(luò)采用線性瓶頸的反向殘差結(jié)構(gòu),對特征空間先升維再降維,在移動(dòng)應(yīng)用上可提供高效的內(nèi)存實(shí)現(xiàn)[13]。如圖1所示,反向殘差結(jié)構(gòu)分為卷積步長分別為1和2的2種類型,圖1中BN(Batch Normalization)為批標(biāo)準(zhǔn)化操作,ReLU6和Linear為激活函數(shù)。
Figure 1 Structure of reverse residual圖1 反向殘差結(jié)構(gòu)
MobileNetV2網(wǎng)絡(luò)整體配置如表1所示。其中,Conv 為標(biāo)準(zhǔn)卷積,bottleneck為線性瓶頸的反向殘差結(jié)構(gòu),Avgpool 為平均池化,c為輸出通道數(shù),n為該模塊重復(fù)次數(shù),s為步長。
網(wǎng)絡(luò)中每個(gè)卷積層的結(jié)構(gòu)包括:卷積計(jì)算、批標(biāo)準(zhǔn)化和激活函數(shù)。本文將批標(biāo)準(zhǔn)化作為一個(gè)線性的操作融合到卷積計(jì)算中,融合過程如下所示。
卷積計(jì)算公式如式(1)所示:
y=w*x+b
(1)
其中,w為權(quán)重,b為偏置。
批標(biāo)準(zhǔn)化計(jì)算公式如式(2)所示:
(2)
其中,mean為均值,var為方差,γ為縮放系數(shù),β為偏移系數(shù)。
將式(1)和式(2)進(jìn)行結(jié)合得到式(3):
(3)
融合后,得到的卷積層新參數(shù)權(quán)重w_new和偏置b_new分別如式(4)和式(5)所示:
(4)
(5)
批標(biāo)準(zhǔn)化融合之后,在FPGA上,只需要讓融合后得到的權(quán)重參數(shù)w_new和b_new參加卷積計(jì)算即可,省去了批標(biāo)準(zhǔn)化運(yùn)算在FPGA端的實(shí)現(xiàn)以及批標(biāo)準(zhǔn)化參數(shù)傳輸?shù)拈_銷,同時(shí)降低了FPGA資源的消耗,提升了網(wǎng)絡(luò)在硬件上的執(zhí)行效率。
神經(jīng)網(wǎng)絡(luò)訓(xùn)練完成后得到的參數(shù)是浮點(diǎn)型的,而在FPGA上進(jìn)行浮點(diǎn)數(shù)運(yùn)算,需要消耗大量的DSP資源和較多的時(shí)鐘周期。因此,本文采用動(dòng)態(tài)定點(diǎn)數(shù)量化方法[16],將32位的浮點(diǎn)型參數(shù)量化為16位的定點(diǎn)數(shù),以減少資源的消耗和數(shù)據(jù)傳輸?shù)拈_銷,加快網(wǎng)絡(luò)的推理速度。浮點(diǎn)數(shù)轉(zhuǎn)化為定點(diǎn)數(shù)如式(6)所示:
xfixed=(int)(xfloat*2wd)
(6)
其中,wd為定點(diǎn)數(shù)中小數(shù)部分的位寬。
量化流程如下所示:
(7)
(2)確定第i層參數(shù)和特征圖數(shù)據(jù)的整數(shù)位寬Ii,如式(8)所示:
(8)
(3)確定第i層參數(shù)和特征圖數(shù)據(jù)的小數(shù)位寬Fi,如式(9)所示:
Fi=16-Ii
(9)
前向推理時(shí),權(quán)重參數(shù)是固定的,但由于不同的網(wǎng)絡(luò)輸入,得到的每層輸出不同。為了能保證最終結(jié)果的精度,本文用1 000幅圖像進(jìn)行推理,通過對每一層的輸出求平均值,使特征圖的數(shù)據(jù)范圍更加準(zhǔn)確。
XILINX公司推出Vivado高層次綜合HLS(High Level Synthesis),可以將高級抽象語言如 C、C++轉(zhuǎn)換成 VHDL硬件描述語言,方便用戶進(jìn)行FPGA電路的設(shè)計(jì)、調(diào)試,提高開發(fā)效率[17,18]。本文利用Vivado HLS和C語言進(jìn)行MobileNet加速器的FPGA設(shè)計(jì)與優(yōu)化。
本文利用軟硬件協(xié)同設(shè)計(jì)的方法。其中,CPU負(fù)責(zé)完成上層應(yīng)用程序的執(zhí)行以及系統(tǒng)的調(diào)度和控制,FPGA負(fù)責(zé)加速神經(jīng)網(wǎng)絡(luò)的前向推理,充分結(jié)合CPU的邏輯控制能力和FPGA的并行計(jì)算優(yōu)勢。異構(gòu)系統(tǒng)需要在FPGA中設(shè)計(jì)軟核處理器,雖然會(huì)消耗一定的FPGA資源,但可以實(shí)現(xiàn)軟硬件設(shè)計(jì)的分離,底層的硬件開發(fā)人員負(fù)責(zé)對FPGA進(jìn)行設(shè)計(jì)并封裝,軟件開發(fā)人員負(fù)責(zé)編寫應(yīng)用驅(qū)動(dòng)程序,調(diào)用設(shè)計(jì)好的硬件模塊。同時(shí),在面對不同的上層應(yīng)用需求時(shí),無需再對底層的硬件設(shè)計(jì)進(jìn)行不斷的修改和調(diào)試,實(shí)現(xiàn)硬件模塊的復(fù)用,較好地滿足終端設(shè)備復(fù)雜的應(yīng)用需求,非常適合人工智能在嵌入式邊緣場景中的應(yīng)用。
Figure 2 Overall framework of accelerated system圖2 加速系統(tǒng)總體框架
圖2為加速系統(tǒng)總體框架。在CPU端,設(shè)計(jì)應(yīng)用驅(qū)動(dòng)程序,完成推理前的準(zhǔn)備工作。根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)調(diào)用加速器中的相應(yīng)模塊完成前向推理,主要包括:系統(tǒng)初始化;為網(wǎng)絡(luò)參數(shù)分配內(nèi)存空間,加載參數(shù)到內(nèi)存;對輸入圖像進(jìn)行歸一化、量化等預(yù)處理;將網(wǎng)絡(luò)各層的配置參數(shù)傳給加速器并調(diào)用具體功能模塊進(jìn)行計(jì)算;對加速器返回的圖像分類結(jié)果進(jìn)行評估。在FPGA端,根據(jù)MobileNet網(wǎng)絡(luò)的結(jié)構(gòu)特點(diǎn),設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)加速器,主要包括:標(biāo)準(zhǔn)卷積模塊、深度卷積模塊、逐點(diǎn)卷積模塊、殘差連接模塊、池化模塊、全連接模塊。同時(shí),在FPGA的片上BRAM中分別設(shè)計(jì)輸入緩存、輸出緩存、權(quán)重緩存,然后將FPGA加速器與CPU集成,構(gòu)建模型加速SoC(System on a Chip)異構(gòu)系統(tǒng)。加速器通過AXI4總線與CPU的AXI_HP接口連接,緩存與DDR3內(nèi)存之間通過AXI4總線進(jìn)行數(shù)據(jù)交互;通過AXI_Lite總線與CPU的AXI_GP接口連接,CPU利用AXI_Lite總線對加速器內(nèi)部寄存器進(jìn)行配置。內(nèi)存DDR與AXI接口之間的數(shù)據(jù)交互主要由DDR控制器負(fù)責(zé)控制。
4.2.1 卷積分塊
由于神經(jīng)網(wǎng)絡(luò)每層具有不同的規(guī)模,為了使設(shè)計(jì)具有一定的伸縮性,本文采用卷積分塊策略[19],設(shè)計(jì)一個(gè)固定規(guī)模大小的通用卷積塊單元,對卷積進(jìn)行分塊計(jì)算。如圖3所示,輸入的分塊變量表示包括通道數(shù)Tn、寬Tic和高Tir,卷積核分塊表示包括通道數(shù)Tm*Tn、寬Tkc和高Tkr,輸出的分塊變量表示包括通道數(shù)Tm、寬Toc和高Tor。其中,輸入和輸出分塊變量滿足如下關(guān)系:Tir=(Tor-1)*S+Tkr,Tic=(Toc-1)*S+Tkc,其中S為卷積核移動(dòng)步長。
Figure 3 Computation in blocks of convolution圖3 卷積分塊計(jì)算
卷積塊單元每次進(jìn)行固定塊大小的卷積計(jì)算,同時(shí)通過滑動(dòng)窗口的方式對卷積塊單元進(jìn)行分時(shí)復(fù)用,從而完成所有輸出特征圖的計(jì)算。卷積塊單元規(guī)模的確定需要綜合考慮整個(gè)網(wǎng)絡(luò)中所有卷積層的特征圖尺寸、卷積核尺寸、輸入和輸出通道大小以及硬件開發(fā)平臺(tái)的資源情況。在理想情況下,規(guī)模越大,并行計(jì)算時(shí)計(jì)算并行度越高,前向推理速度越快,但同時(shí)消耗的DSP和片上BRAM等硬件資源也越多??紤]到本文使用的目標(biāo)硬件Zynq-7020芯片共有220個(gè)DSP,BRAM數(shù)量也較少,還需要給其他模塊預(yù)留空間和資源,最終確定標(biāo)準(zhǔn)卷積的分塊變量大小為:Tm=8,Tn=3,Tkc=Tkr=3,Toc=Tor=28。在實(shí)際應(yīng)用中,需要在推理速度和資源消耗上進(jìn)行折衷考慮。通過調(diào)節(jié)卷積塊單元規(guī)模,使設(shè)計(jì)具備一定的伸縮性,以適應(yīng)不同資源規(guī)模的平臺(tái)。
4.2.2 并行卷積計(jì)算
卷積計(jì)算主要由輸出特征圖(高、寬)、輸出通道、輸入通道、卷積核(高、寬)6個(gè)維度嵌套的循環(huán)結(jié)構(gòu)組成。本文通過調(diào)整卷積塊內(nèi)的嵌套循環(huán)順序,將輸出通道和輸入通道的循環(huán)置于最內(nèi)層,并且通過UNROOL指令對這2個(gè)維度進(jìn)行循環(huán)展開,讓編譯器創(chuàng)建多組相同的硬件計(jì)算單元來實(shí)現(xiàn)并行計(jì)算,以此提高卷積計(jì)算效率。同時(shí),通過PIPELINE指令進(jìn)行流水化(如圖4所示),使讀數(shù)據(jù)(RD)、計(jì)算(CMP)和寫數(shù)據(jù)(WR)流水化進(jìn)行,增大吞吐率[20]。
Figure 4 Schematic diagram of pipelining圖4 流水化示意圖
Figure 5 Core hardware structure of parallel computing圖5 并行計(jì)算的核心硬件結(jié)構(gòu)
4.2.3 緩存分割
卷積塊內(nèi)的計(jì)算并行度分別為Tn、Tm*Tn和Tm,為了滿足并行計(jì)算,需要在一個(gè)周期內(nèi)完成數(shù)組中多個(gè)數(shù)據(jù)的同時(shí)讀寫。然而,數(shù)組在BRAM中是連續(xù)存放的,最多只有2個(gè)數(shù)據(jù)端口,為實(shí)現(xiàn)數(shù)據(jù)同時(shí)讀寫,本文采用了緩存分割的設(shè)計(jì)。如圖6所示,ARRAY PARTIRION指令將輸入緩存、權(quán)重緩存、輸出緩存分別分割為具有Tn個(gè)讀端口、Tm*Tn個(gè)讀端口、Tm個(gè)寫端口的BRAM區(qū)塊,由此增加其讀寫端口的數(shù)量,從而實(shí)現(xiàn)了并行讀寫。圖6中,Tm表示分割后BRAM區(qū)塊的個(gè)數(shù),[Tor][Toc]表示分割后BRAM區(qū)塊的大小為Tor*Toc,[Tor]表示數(shù)組的行數(shù),[Toc]表示數(shù)組的列數(shù),其他變量的含義類似。
Figure 6 Schematic diagram of cache segmentation圖6 緩存分割示意圖
4.3.1 數(shù)據(jù)傳輸優(yōu)化
由于FPGA 訪問內(nèi)存DDR會(huì)有較大的延時(shí),為了減少訪存開銷,本文在設(shè)計(jì)上增加了讀取數(shù)據(jù)的接口數(shù)量和接口位寬。如圖7所示,將數(shù)據(jù)地址空間平均劃分為4塊,將每一塊的首地址作為每個(gè)通道的入口地址,利用4個(gè)AXI接口并行讀取數(shù)據(jù),增加數(shù)據(jù)傳輸帶寬,并且設(shè)置每個(gè)接口的位寬最大為64 bit。由于量化后的每個(gè)數(shù)據(jù)位寬為16 bit,所以每個(gè)通道可以同時(shí)傳送4個(gè)數(shù)據(jù),數(shù)據(jù)到達(dá)緩存后按16 bit分解為單個(gè)數(shù)據(jù),并同時(shí)送入PE陣列進(jìn)行運(yùn)算。
Figure 7 Schematic diagram of data transmission optimization圖7 數(shù)據(jù)傳輸優(yōu)化示意圖
同時(shí),將數(shù)據(jù)在內(nèi)存中以行優(yōu)先的方式排布,使數(shù)據(jù)的讀取順序與數(shù)據(jù)在內(nèi)存中的排布方式一致。在并行傳輸數(shù)據(jù)的同時(shí),通過較長的突發(fā)傳輸長度抵消讀地址通道握手的時(shí)間和一個(gè)數(shù)據(jù)讀出所需等待的時(shí)間,以減少數(shù)據(jù)傳輸延遲。
Figure 8 Ping-pong caching mechanisms圖8 “乒乓”緩存機(jī)制
4.3.2 任務(wù)級流水化
卷積分塊計(jì)算可分為3個(gè)階段:加載數(shù)據(jù)、卷積計(jì)算和寫回結(jié)果。為了掩蓋數(shù)據(jù)傳輸?shù)臅r(shí)間,本文采用“乒乓”緩存機(jī)制實(shí)現(xiàn)任務(wù)級流水化。如圖8所示,在FPGA的片上BRAM中設(shè)置2塊同樣大小的輸入緩存、權(quán)重緩存和輸出緩存,當(dāng)緩存1加載數(shù)據(jù)時(shí),PE陣列處理緩存2中的數(shù)據(jù),并將結(jié)果寫回;當(dāng)緩存2加載數(shù)據(jù)時(shí),PE陣列處理緩存1中的數(shù)據(jù),并將結(jié)果寫回。通過這種方式,使數(shù)據(jù)傳輸時(shí)間與計(jì)算時(shí)間重疊,減少了延遲并改善吞吐量,進(jìn)一步提高了加速系統(tǒng)的性能。圖8中的×代表沒有數(shù)據(jù)流,該通路不工作。
Vivado HLS的綜合結(jié)果分析界面如圖9所示。可以看到,經(jīng)過緩存分割和數(shù)據(jù)流優(yōu)化后,模塊的數(shù)據(jù)加載、卷積計(jì)算和寫回結(jié)果3個(gè)過程同時(shí)執(zhí)行。
Figure 9 Synthesis results analysis of Vivado HLS圖9 Vivado HLS綜合結(jié)果分析
4.4.1 深度卷積模塊
深度卷積計(jì)算方式與標(biāo)準(zhǔn)卷積不同,一個(gè)卷積核只負(fù)責(zé)卷積特征圖的一個(gè)通道。因此,深度卷積只需要5個(gè)維度嵌套的循環(huán),其它實(shí)現(xiàn)方法與標(biāo)準(zhǔn)卷積基本一致。首先,進(jìn)行卷積分塊,根據(jù)深度卷積層的特征,確定分塊大小為:Tm=8,Tkc=Tkr=3,Toc=Tor=7,然后,在輸出通道上進(jìn)行循環(huán)展開、流水化、數(shù)組分割操作,并利用數(shù)據(jù)傳輸優(yōu)化和“乒乓”緩存機(jī)制進(jìn)行數(shù)據(jù)流優(yōu)化,以提高計(jì)算的并行度和吞吐率。
4.4.2 逐點(diǎn)卷積模塊
逐點(diǎn)卷積與標(biāo)準(zhǔn)卷積計(jì)算方式一致。卷積核尺寸為1*1。先進(jìn)行卷積分塊,確定分塊大小為:Tm=Tn=8,Toc=Tor=14,之后將塊內(nèi)的計(jì)算變?yōu)槎S矩陣的乘法運(yùn)算,即A[14*14][8]*B[8][8]=C[14*14][8]。然后,在輸入、輸出通道2個(gè)維度上進(jìn)行循環(huán)展開、流水化、數(shù)組分割操作,利用數(shù)據(jù)傳輸優(yōu)化和“乒乓”緩存機(jī)制進(jìn)行數(shù)據(jù)流優(yōu)化。
4.4.3 殘差連接模塊
該模塊用來完成反向殘差結(jié)構(gòu)中的支路殘差求和,輸入2幅同樣大小的特征圖,將2幅圖對應(yīng)位置的數(shù)據(jù)相加取和,得到輸出數(shù)據(jù)。通過在通道維度上使用循環(huán)展開和流水化的方法來加快運(yùn)算過程。
4.4.4 池化模塊
池化部分采用一種基于“部分和緩存”的多路并行計(jì)算方法,池化核大小為7*7,內(nèi)部邏輯如圖10所示,計(jì)算原理如下所示:
(1)模塊先從DDR讀取數(shù)據(jù)到In_buf中,用通道指針來控制數(shù)據(jù)讀取的位置,在設(shè)計(jì)中使用5個(gè)部分和緩存Psum存儲(chǔ)中間結(jié)果。
(2)將每個(gè)通道的數(shù)據(jù)兩兩相加,放入Psum中,并通過PIPELINE指令使部分和間的計(jì)算并行流水進(jìn)行,得到最終的平均池化值,送入Out_buf。
(3)同時(shí),在輸入通道維度進(jìn)行循環(huán)展開和流水化,設(shè)置通道并行度T=32,直到完成所有通道的池化計(jì)算。
該池化操作通過多路通道并行的部分和累加計(jì)算,加快了池化計(jì)算的速度。
Figure 10 Pooling operation process圖10 池化運(yùn)算過程
4.4.5 全連接模塊
全連接用于最終的分類輸出。本文使用的ImageNet數(shù)據(jù)集共有1 000個(gè)類別。全連接計(jì)算的實(shí)質(zhì)為:向量A[1280]與矩陣B[1280][1000]相乘得到向量C[1000]。本文對矩陣的行、列2個(gè)維度進(jìn)行循環(huán)展開和流水化,設(shè)置并行度為:Tn=32和Tm=10,并使用“乒乓”緩存機(jī)制來加快計(jì)算過程。
實(shí)驗(yàn)采用XILINX公司推出的 PYNQ-Z2開發(fā)板作為測試平臺(tái),該平臺(tái)采用ZYNQ-7020芯片,芯片內(nèi)部資源如表2所示,FPGA端的時(shí)鐘頻率為125 MHz,ARM端的時(shí)鐘頻率為667 MHz。
Table 2 Chip resources表2 芯片資源
本文首先在PC端用ImageNet數(shù)據(jù)集訓(xùn)練MobileNetV2網(wǎng)絡(luò),得到網(wǎng)絡(luò)每層的權(quán)重參數(shù)和批標(biāo)準(zhǔn)化參數(shù);然后經(jīng)過批標(biāo)準(zhǔn)化融合和量化將最終的權(quán)重參數(shù)導(dǎo)入開發(fā)板中。實(shí)驗(yàn)對比了分別利用CPU和CPU+FPGA進(jìn)行CNN推理的性能表現(xiàn)。CPU方案是指在ARM端安裝TensorFlow深度學(xué)習(xí)框架,搭建MobileNetV2網(wǎng)絡(luò)模型,只利用CPU進(jìn)行網(wǎng)絡(luò)前向推理;CPU+FPGA方案是指不使用深度學(xué)習(xí)框架,利用本文設(shè)計(jì)的加速器進(jìn)行前向推理。
加速系統(tǒng)的實(shí)驗(yàn)流程設(shè)計(jì)如下:
(1)首先,基于FPGA使用Vivado HLS完成加速器各模塊IP核的設(shè)計(jì);
(2)然后,利用Vivado將加速器IP核結(jié)合CPU搭建加速系統(tǒng),驗(yàn)證設(shè)計(jì)并生成比特流,加載到開發(fā)板;
(3)最后,在CPU端設(shè)計(jì)應(yīng)用驅(qū)動(dòng)程序,調(diào)用加速器完成神經(jīng)網(wǎng)絡(luò)的前向推理。
實(shí)驗(yàn)結(jié)果如表3所示??梢钥吹?基于MobileNet神經(jīng)網(wǎng)絡(luò)的加速系統(tǒng)對單幀圖像的推理時(shí)間為0.18 s,相對于僅使用ARM單核處理器實(shí)現(xiàn)了128倍的加速效果。本文采用了動(dòng)態(tài)定點(diǎn)數(shù)量化的方法,將32位浮點(diǎn)型參數(shù)量化為16位的定點(diǎn)數(shù)。為了比較量化前后模型的準(zhǔn)確率,采用1 000幅圖像進(jìn)行測試。結(jié)果表明,量化后的準(zhǔn)確率僅下降了0.3%,說明本文采用的量化方法對模型的精度影響較小;加速系統(tǒng)運(yùn)行時(shí)的平均功耗為2.62 W,滿足低功耗的設(shè)計(jì)要求。
Table 3 Experimental results表3 實(shí)驗(yàn)結(jié)果
各模塊資源占用情況如表4所示,可以看到加速系統(tǒng)整體資源消耗較少。由于本文采用了卷積并行計(jì)算和任務(wù)級流水化等方法使卷積部分資源消耗占比較大,其中卷積部分消耗的DSP資源占總耗資源的97%,消耗的BRAM資源占總耗資源的65%。
Table 4 Resource usage of each module表4 各模塊資源占用情況
表5對比了本文工作與相關(guān)工作的綜合性能。其中,文獻(xiàn)[8]提出了一種數(shù)據(jù)重排方法,提高了外部存儲(chǔ)器帶寬的利用率,但由于其加速的網(wǎng)絡(luò)為參數(shù)量較大的VGG16,在占用較大資源的情況下,單幀推理時(shí)間較長且功耗較高;文獻(xiàn)[11]實(shí)現(xiàn)了卷積層之間的流水化,增大了系統(tǒng)的吞吐率,整體設(shè)計(jì)消耗的資源較少,系統(tǒng)功耗也較低,但系統(tǒng)的推理延遲較大;文獻(xiàn)[21]在FPGA中直接用32位的浮點(diǎn)數(shù)進(jìn)行運(yùn)算,盡管通過通道間并行計(jì)算提升了卷積計(jì)算效率,同時(shí)采用DMA加快了數(shù)據(jù)在內(nèi)存和FPGA片上緩存之間的交互,減小了訪存延遲,但最終的推理延遲較大。在量化策略上,本文和文獻(xiàn)[8]、文獻(xiàn)[11]的設(shè)計(jì)中都將網(wǎng)絡(luò)參數(shù)量化為16位定點(diǎn)數(shù)??梢钥闯?本文單幀推理速度是文獻(xiàn)[11]的16.08倍,是文獻(xiàn)[21]的99倍。
本文提出了一種新的基于異構(gòu)平臺(tái)的卷積神經(jīng)網(wǎng)絡(luò)加速架構(gòu),設(shè)計(jì)并實(shí)現(xiàn)了基于MobileNet的輕量化卷積神經(jīng)網(wǎng)絡(luò)加速系統(tǒng),利用動(dòng)態(tài)定點(diǎn)數(shù)量化和批標(biāo)準(zhǔn)化融合的方法,減少了硬件復(fù)雜度和資源開銷;利用卷積分塊、并行卷積計(jì)算、數(shù)據(jù)流優(yōu)化的方法,提高了卷積運(yùn)算效率,增大了系統(tǒng)吞吐率,使系統(tǒng)具有較好的伸縮性。在PYNQ-Z2平臺(tái)的實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)具有高效的計(jì)算內(nèi)核,圖像識(shí)別速度快,加速效果明顯且功耗低,可以將Mobilenet網(wǎng)絡(luò)高效地應(yīng)用于資源有限的嵌入式設(shè)備。下一步利用卷積神經(jīng)網(wǎng)絡(luò)加速系統(tǒng)研制面向行業(yè)應(yīng)用的視覺檢測智能終端,將系統(tǒng)部署于實(shí)際應(yīng)用場景中。
Table 5 Comparison of system design synthesis results表5 系統(tǒng)設(shè)計(jì)綜合對比