尹震宇,徐光遠(yuǎn)1,,張飛青1,,徐福龍1,,李興瀅1,
1(中國科學(xué)院大學(xué),北京 100049) 2(中國科學(xué)院 沈陽計(jì)算技術(shù)研究所,沈陽 110168)
隨著“中國制造2025”的提出,實(shí)現(xiàn)智能化生產(chǎn)已成為制造業(yè)發(fā)展的重要目標(biāo).卷積神經(jīng)網(wǎng)絡(luò)(Convolution Neural Network,CNN)作為一種應(yīng)用較廣的人工神經(jīng)網(wǎng)絡(luò),能夠高精度的實(shí)現(xiàn)目標(biāo)檢測[1]、目標(biāo)識別[2]等任務(wù),已經(jīng)被廣泛應(yīng)用于智能生產(chǎn)線的產(chǎn)品檢測、郵件分揀自動(dòng)化[3]及物流數(shù)字化管理等方面.但是,CNN是以高計(jì)算量為代價(jià)實(shí)現(xiàn)了高精度.為了加快計(jì)算速度,開發(fā)人員已經(jīng)為CNN部署采用了專門的硬件加速器,例如SoC[4,5],ASIC[6],GPU和FPGA[7].使用GPU對神經(jīng)網(wǎng)絡(luò)進(jìn)行加速雖然是最常用的加速手段,但是基于GPU的加速平臺往往都有著較大的體積和較大的功耗,因此體積更小、功耗更低的硬件平臺就成為了神經(jīng)網(wǎng)絡(luò)加速的一個(gè)熱門研究方向[8].
其中,現(xiàn)場可編程門陣列(FPGA)以其靈活性、并行性、集成性、上市時(shí)間短和能源效率高等特點(diǎn)成為有效的解決方案.傳統(tǒng)的FPGA開發(fā)多使用VHDL及Verilog等硬件語言,開發(fā)難度大且開發(fā)周期長,并且需要開發(fā)者具有一定的硬件專業(yè)知識背景,這對于軟件工程師來說具有一定的困難.然而高層次綜合(High-Level Synthesis,HLS)的使用降低了對FPGA進(jìn)行編程的困難,使得軟件工程師也可以較快的進(jìn)行FPGA開發(fā).因此,基于FPGA的人工神經(jīng)網(wǎng)絡(luò)單元設(shè)計(jì)被廣泛研究和應(yīng)用.
Yunxuan Yu[9]等人設(shè)計(jì)了一種將卷積和反卷積運(yùn)算相統(tǒng)一的硬件加速方法,但是其采用硬件語言進(jìn)行設(shè)計(jì),實(shí)現(xiàn)難度較大;黃佳凱[10]基于ARM平臺和TensorFlow框架實(shí)現(xiàn)了嵌入式平臺上的手寫數(shù)字識別,但是運(yùn)行效率比較低且框架移植有較多限制條件.余子健[11]在vertex-5系列平臺上搭建神經(jīng)網(wǎng)絡(luò)模型完成了手寫數(shù)字識別任務(wù),但是他所構(gòu)建的實(shí)驗(yàn)平臺并不是嵌入式平臺,需要PC機(jī)配合FPGA使用.
本文在前人研究基礎(chǔ)上,提出了基于Zynq平臺的卷積神經(jīng)網(wǎng)絡(luò)單元,實(shí)現(xiàn)了對手寫數(shù)字的識別.該設(shè)計(jì)充分利用了Zynq平臺的異構(gòu)特點(diǎn),并使用高層綜合語言HLS實(shí)現(xiàn)并優(yōu)化卷積層和池化層的IP核設(shè)計(jì).實(shí)驗(yàn)結(jié)果表明,在保證手寫數(shù)字識別正確率的同時(shí),該設(shè)計(jì)相比于基于ARM的嵌入式平臺神經(jīng)網(wǎng)絡(luò)模型運(yùn)算速度有顯著提升.
人工神經(jīng)網(wǎng)絡(luò)是機(jī)器學(xué)習(xí)的一個(gè)分支,是模擬生物神經(jīng)網(wǎng)絡(luò)的數(shù)學(xué)模型的統(tǒng)稱,卷積神經(jīng)網(wǎng)絡(luò)作為人工神經(jīng)網(wǎng)絡(luò)的一種常見結(jié)構(gòu),其主要優(yōu)勢在特征提取方面.
卷積神經(jīng)網(wǎng)絡(luò)主要結(jié)構(gòu)如圖1所示,包括卷積層、池化層和全連接層.其中,卷積層接受上一層的特征圖,通過多個(gè)卷積核卷積來提取特征,并輸出該層的特征圖.卷積核每個(gè)元素對應(yīng)一個(gè)權(quán)重系數(shù)和偏移量,卷積的層數(shù)越多,輸出的特征圖代表的特征就越復(fù)雜.卷積層的計(jì)算方式為:
池化層也被叫做下采樣層,用來減小卷積層輸出特征圖的大小,減少圖的維數(shù)來防止過擬合.常見的池化層有最大池化和平均池化.全連接層則是將二維圖像連接成一個(gè)一維向量,用于結(jié)果的輸出[12].
圖1 手寫識別任務(wù)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)Fig.1 Neural network structure of handwriting recognition task
FPGA不依賴于指令級架構(gòu),而是基于查找表實(shí)現(xiàn)的,主要包含查找表、觸發(fā)器、可編程IO、可編程布線資源、嵌入式存儲(chǔ)器以及IP硬核.FPGA具有獨(dú)特的并行流水線運(yùn)算方式,使FPGA有著極大的運(yùn)算帶寬以及數(shù)據(jù)傳輸速率[13].由于FPGA的可重配置性,使得用戶能夠自定義算法架構(gòu)以及接口,將深度學(xué)習(xí)算法部署在FPGA上,且可以重復(fù)修改而不需要更換FPGA芯片,適合于不斷迭代更新的深度學(xué)習(xí)算法的部署和開發(fā).
Zynq平臺是Xilinx公司開發(fā)的可編程的SoC,不同于傳統(tǒng)的FPGA產(chǎn)品,Zynq平臺上除了包括了FPGA芯片,還包括了ARM處理器,并且在這兩部分之間提供了AXI總線等多種接口.Zynq兼具了基于ARM的嵌入式平臺和FPGA的優(yōu)點(diǎn),既能夠方便的在ARM上部署操作系統(tǒng)及運(yùn)行軟件程序,也可利用FPGA的并行性特點(diǎn)對軟件中并行加速的部分進(jìn)行加速,提高整個(gè)平臺的運(yùn)行效率,同時(shí)保留嵌入式平臺體積小、能耗低、方便部署和遷移的特點(diǎn).而在神經(jīng)網(wǎng)絡(luò)中往往也存在著較多的線性結(jié)構(gòu),在ARM上運(yùn)行效率會(huì)更高,這正契合了Zynq平臺的優(yōu)勢,因此Zynq平臺是非常適合搭建嵌入式神經(jīng)網(wǎng)絡(luò)單元的硬件平臺.
本文選用人工神經(jīng)網(wǎng)絡(luò)單元硬件平臺為Xilinx的Zynq-7000系列的7020芯片,芯片內(nèi)同時(shí)包含PS部分即ARM核和PS部分即FPGA,部分片上規(guī)格如表1所示.
表1 Zynq 7020部分片上規(guī)格Table 1 Part of specification on Zynq 7020 sheets
本文選取經(jīng)典的Lenet-5模型來實(shí)現(xiàn)對手寫數(shù)字的識別[14],包含兩個(gè)卷積層、兩個(gè)池化層、兩個(gè)全連接層[15],雖然與現(xiàn)在更加復(fù)雜的神經(jīng)網(wǎng)絡(luò)相比,Lenet-5在結(jié)構(gòu)上要簡單很多,但是已經(jīng)包含了神經(jīng)網(wǎng)絡(luò)最主要的結(jié)構(gòu).而如果后期想擴(kuò)展為更加復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型,只需對代碼做簡單修改,可以繼續(xù)調(diào)用已經(jīng)設(shè)計(jì)完成的卷積層和池化層IP核.
卷積神經(jīng)網(wǎng)絡(luò)單元總體設(shè)計(jì)如圖2所示,由PS部分ARM核完成數(shù)據(jù)的前期處理及結(jié)果輸出功能,將神經(jīng)網(wǎng)絡(luò)中卷積、池化等運(yùn)算過程部署在PL(FPGA)上實(shí)現(xiàn),充分利用FPGA進(jìn)行并行計(jì)算的優(yōu)勢,同時(shí)減少對于FPGA計(jì)算資源的浪費(fèi).
圖2 手寫數(shù)字識別流程Fig.2 Handwritten number recognition process
卷積層在神經(jīng)網(wǎng)絡(luò)中占用了大量的計(jì)算資源,相較于其它層占據(jù)了最多的計(jì)算時(shí)間,因此對卷積層的優(yōu)化就成為了提高卷積神經(jīng)網(wǎng)絡(luò)運(yùn)行速度的關(guān)鍵.由于FPGA上的計(jì)算資源也是有限的,在提升運(yùn)行速度的同時(shí)也應(yīng)考慮資源使用量,可以通過復(fù)用一些加速電路來提高資源的利用率.比如卷積層和池化層的加速電路就能夠進(jìn)行復(fù)用,因此對卷積層和池化層設(shè)計(jì)兩個(gè)通用的加速電路,對神經(jīng)網(wǎng)絡(luò)進(jìn)行加速.
由于卷積運(yùn)算過程主要是對應(yīng)元素的乘加運(yùn)算,因此計(jì)算過程可采用并行處理,從而充分利用FPGA的優(yōu)勢.但是嵌入式平臺上FPGA的計(jì)算資源是有限的,在設(shè)計(jì)時(shí)也要考慮資源利用情況.
本文使用Xilinx的HLS工具來完成卷積層和池化層的IP核的設(shè)計(jì).HLS能夠?qū)⑹褂肅、C++和System C完成的設(shè)計(jì)轉(zhuǎn)化成寄存器傳輸級實(shí)現(xiàn),生成IP核,相比于使用硬件語言,代碼量明顯減少,編程人員的工作效率得到提升,同時(shí)也不需要太多的硬件知識背景,相比于傳統(tǒng)的硬件語言更容易上手[16].并且在HLS中進(jìn)行IP核設(shè)計(jì)時(shí)便于進(jìn)行優(yōu)化,加速運(yùn)算過程.但是需要注意,并不是所有的C、C++語法都被允許在HLS中使用,一些涉及到動(dòng)態(tài)分配內(nèi)存的指令是不能在HLS中使用的,在使用HLS進(jìn)行IP核設(shè)計(jì)時(shí)仍然要具有一定的硬件知識以及硬件編程思想,否則可能使得設(shè)計(jì)的IP核運(yùn)行效率很低,甚至難以運(yùn)行.
在HLS中實(shí)現(xiàn)卷積層設(shè)計(jì)的主要過程如下.首先,使用C語言實(shí)現(xiàn)卷積函數(shù)Conv的編寫,在編寫過程中要嚴(yán)格避免使用動(dòng)態(tài)分配內(nèi)存地址的相關(guān)代碼,否則HLS將無法對代碼進(jìn)行轉(zhuǎn)化.同時(shí),為了對卷積層進(jìn)行優(yōu)化,應(yīng)避免代碼中存在過多的線性結(jié)構(gòu),為驗(yàn)證函數(shù)的正確性,需要在Test Bench中編寫main函數(shù)并調(diào)用其Conv函數(shù),進(jìn)行模擬計(jì)算,驗(yàn)證計(jì)算結(jié)果正確性.然后,定義函數(shù)接口,并選取合適的總線.將相關(guān)各接口配置為AXI Master,可以在保證高效數(shù)據(jù)傳輸?shù)耐瑫r(shí),很方便的獲取數(shù)據(jù)、寫回結(jié)果,之后,運(yùn)行RTL Cosimulation進(jìn)行仿真驗(yàn)證,如圖3所示,最后生成IP核.池化層實(shí)現(xiàn)過程與之類似,池化函數(shù)定義為Pool,同樣進(jìn)行接口定義及仿真驗(yàn)證.
圖3 卷積層仿真波形圖Fig.3 Convolution layer simulation waveform
為了提高卷積層和池化層的運(yùn)行效率并且發(fā)揮FPGA的特點(diǎn),增加計(jì)算的并行程度,在確保資源足夠的情況下,將卷積運(yùn)算中的for循環(huán)進(jìn)行一定程度的展開.展開前一個(gè)周期內(nèi)只能進(jìn)行一次計(jì)算,而展開后同一周期內(nèi)可進(jìn)行多次計(jì)算,例如5次的for循環(huán),在傳統(tǒng)CPU平臺上需要5個(gè)周期完成的計(jì)算,而在FPGA平臺上,因?yàn)槊看蝔or循環(huán)的計(jì)算不具有相關(guān)性,不存在讀寫沖突,可將5次for循環(huán)展開,在FPGA上通過硬件加速電路在一個(gè)周期內(nèi)同時(shí)完成5次運(yùn)算,理論上即可提升5倍的速度.在HLS中可通過在for循環(huán)中添加命令:
#pragma HLS UNROLL
來實(shí)現(xiàn)循環(huán)展開.也可在右側(cè)Directive標(biāo)簽頁中添加循環(huán)展開的信息,實(shí)現(xiàn)效果與直接添加命令相同.
不同于在PC等平臺上部署神經(jīng)網(wǎng)絡(luò)模型,在Zynq平臺部署神經(jīng)網(wǎng)絡(luò)模型時(shí)還需要對平臺硬件進(jìn)行硬件設(shè)計(jì),通過添加IP模塊來組成硬件平臺設(shè)計(jì),其中一些基礎(chǔ)功能例如DDR管理使用官方模塊,而神經(jīng)網(wǎng)絡(luò)模型中的卷積層和池化層的加速電路則使用自定義的IP核來實(shí)現(xiàn),卷積層和池化層的IP核要分別生成,構(gòu)建結(jié)果如圖4所示.
FPGA硬件平臺構(gòu)建主要過程如下:首先在HLS中Solution Setting選定SoC型號,選擇Export RTL,生成IP核.然后在Vivado中添加卷積層和池化層IP核到IP Catalog,點(diǎn)擊Create Block Design添加硬件設(shè)計(jì),加入ZYNQ7并雙擊進(jìn)行配置,點(diǎn)擊PS-PL Configuration勾選S AXI HP0 interface和S AXI HP1 interface.最后加入卷積層和池化層IP核,分別連接到對應(yīng)接口上,對硬件平臺設(shè)計(jì)進(jìn)行綜合,并分析資源利用情況.
本文實(shí)驗(yàn)在Vivado 2018開發(fā)環(huán)境中進(jìn)行,首先在HLS中編寫卷積層代碼,編寫代碼過程中避免使用動(dòng)態(tài)分配內(nèi)存代碼,盡量簡化循環(huán)中的結(jié)構(gòu),以方便對循環(huán)進(jìn)行展開優(yōu)化.經(jīng)過對代碼的綜合及仿真,可驗(yàn)證卷積層計(jì)算過程正確.池化層實(shí)現(xiàn)方法與卷積層相似,不再贅述.
圖4 硬件平臺結(jié)構(gòu)Fig.4 Hardware platform structure
然后,對卷積層代碼進(jìn)行優(yōu)化,將卷積層最內(nèi)層循環(huán)進(jìn)行展開,如表2所示,優(yōu)化后的卷積層在資源占用率增加不足1倍的情況下,時(shí)鐘周期減少了超過70%,即速度提高了3.5倍多,故該優(yōu)化設(shè)計(jì)對卷積運(yùn)算的速度提升是十分明顯的.最后,將卷積層和池化層分別生成IP核,等待構(gòu)建神經(jīng)網(wǎng)絡(luò)硬件平臺時(shí)進(jìn)行調(diào)用.
表2 未優(yōu)化和優(yōu)化后卷積層資源占用及時(shí)鐘周期對比Table 2 Comparison of resource utilization and clock cycle between unoptimized convolution layer and optimized convolution layer
該實(shí)驗(yàn)基于米聯(lián)客的702A開發(fā)版進(jìn)行,開發(fā)板上Zynq型號為XC7Z020CLG400-2I,并且該開發(fā)板帶有SD卡接口,同時(shí)底板上配有串口接口.開發(fā)板上HDMI接口是連接在FPGA部分的,如果想使用HDMI接口輸出圖像必須要在FPGA上配置相應(yīng)IP核,考慮到本實(shí)驗(yàn)輸出結(jié)果較為簡單,特別是不需要輸出視頻圖像,因此從減少開發(fā)難度和降低資源使用率角度出發(fā),使用串口與PC連接,將神經(jīng)網(wǎng)絡(luò)模型運(yùn)行結(jié)果通過串口輸出到PC端顯示.
表3 硬件資源占用情況Table 3 Hardware resource occupancy
按照第3節(jié)所述過程,構(gòu)建硬件平臺,并分析資源占用情況,構(gòu)建的硬件平臺資源占用情況如表3所示.
表4 不同平臺手寫數(shù)字識別速度對比Table 4 Speed comparison of handwritten digit recognition on different platforms
最后,在Zynq平臺上進(jìn)行手寫數(shù)字識別實(shí)驗(yàn)驗(yàn)證.實(shí)驗(yàn)過程中先將手寫數(shù)字圖片和神經(jīng)網(wǎng)絡(luò)參數(shù)存入SD卡,連接好開發(fā)板和PC,并且在PC端運(yùn)行接收端程序.然后開發(fā)板上電,運(yùn)行神經(jīng)網(wǎng)絡(luò)模型.經(jīng)過對表4實(shí)驗(yàn)數(shù)據(jù)分析,相對于只在ARM核上運(yùn)行的神經(jīng)網(wǎng)絡(luò),基于FPGA的神經(jīng)網(wǎng)絡(luò),在精度損失極小(0.1%)的情況下,運(yùn)行時(shí)間減少67.0%,實(shí)現(xiàn)了運(yùn)行速度的大幅度提升.
本文設(shè)計(jì)了一種基于Zynq平臺的卷積神經(jīng)網(wǎng)絡(luò)單元,并完整的介紹了各部分的設(shè)計(jì)與實(shí)現(xiàn)過程,重點(diǎn)介紹了卷積層與池化層的設(shè)計(jì)與實(shí)現(xiàn)及優(yōu)化的過程.經(jīng)過測試實(shí)現(xiàn)快速準(zhǔn)確地識別手寫數(shù)字,相較于只在ARM核上實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò),運(yùn)行時(shí)間減少了67.0%.與現(xiàn)有的神經(jīng)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)方式相比,本單元采用嵌入式平臺設(shè)計(jì),具有體積小、能耗低、易于部署的特點(diǎn),方便在工業(yè)生產(chǎn)現(xiàn)場安裝配置,能夠在智能制造生產(chǎn)線上發(fā)揮重要作用,具有實(shí)際應(yīng)用意義.