鄭文凱 楊濟(jì)民
( 山東師范大學(xué)物理與電子科學(xué)學(xué)院,250014,濟(jì)南 )
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)是一類人工神經(jīng)網(wǎng)絡(luò),它可以自動從大規(guī)模數(shù)據(jù)中學(xué)習(xí)特征,并把結(jié)果向同類型數(shù)據(jù)泛化,在語音識別、圖像識別、圖像分割、自然語言處理等領(lǐng)域廣泛應(yīng)用[1,2].
由于CNN特定的計(jì)算模式,現(xiàn)有大部分CNN的設(shè)計(jì)實(shí)現(xiàn)都是基于GPU等硬件的支持,比如INVIDA公司的硬件加速顯卡,其就是圍繞GPU布局設(shè)計(jì)的,但是該芯片功耗較大、過大的體積很難適用于移動平臺;對于通用處理器CPU而言,其在處理并行數(shù)據(jù)上效率較低;雖說使用ASIC平臺設(shè)計(jì)具有可定制化的優(yōu)點(diǎn),但是成本高昂,產(chǎn)品的可遷移性低[3];而現(xiàn)場可編程門列(FPGA)具有豐富的片上硬件邏輯資源、靈活的線路連接特性以及良好的內(nèi)存帶寬等優(yōu)點(diǎn),相比于ASIC而言,更是省去了流片過程,因此在本研究中我們選擇使用FPGA來設(shè)計(jì)該AI芯片.
在一項(xiàng)對于在CPU及GPU上實(shí)現(xiàn)CNN的工作中,我們可以清晰的看到在整個(gè)CNN網(wǎng)絡(luò)進(jìn)行前向傳播的過程中,卷積層所耗費(fèi)時(shí)間的比例是很高的[4],所以我們的首要目標(biāo)就是去優(yōu)化加速卷積操作. Stylianos等人提出一種以SDF計(jì)算模型為基礎(chǔ)的框架[5],我們借鑒了該SDF模型以經(jīng)典的用于識別手寫數(shù)字集MNIST的CNN網(wǎng)絡(luò)Lenet-5為例在FPGA開發(fā)板上進(jìn)行了實(shí)現(xiàn),該方法不局限于僅實(shí)現(xiàn)固定結(jié)構(gòu)的CNN,我們采用IP核互聯(lián)以及數(shù)據(jù)流的方式可以動態(tài)調(diào)整網(wǎng)絡(luò)結(jié)構(gòu)以及參數(shù),具有較強(qiáng)的靈活性與通用性.
1.1卷積層卷積層是卷積神經(jīng)網(wǎng)絡(luò)的核心,大部分的計(jì)算量都在這個(gè)層,具體的卷積操作我們可以通過以下兩個(gè)公式來理解,
(1)
Output=(N-K+2×padding)/stride+1.
(2)
1.2池化層池化層也叫作子采樣層,其作用就是減少特征圖的空間尺寸、減少參數(shù)進(jìn)一步達(dá)到控制過擬合的作用. 池化層并不會對于特征圖的深度有影響.還是會保持原來的深度.
1.3全連接層全連接層一般在整個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的末層,該層中的每一個(gè)神經(jīng)元節(jié)點(diǎn)與上一層的神經(jīng)元結(jié)點(diǎn)是全連接的,目的是將前面層提取到的特征進(jìn)行綜合.
1.4Lenet-5的網(wǎng)絡(luò)結(jié)構(gòu)LeNet-5[6]共有8層,按次序分別為輸入層、C1卷積層、S2池化層、C3卷積層、S4池化層、C5卷積層、F6全連接層、輸出層,每層都包含可訓(xùn)練參數(shù).輸入圖像大小為32×32,而MNIST數(shù)據(jù)集圖像的維度為28×28,因此在訓(xùn)練整個(gè)網(wǎng)絡(luò)之前,需要對28×28的圖像進(jìn)行填充,使其維度變?yōu)?2×32.
圖1 Lenet-5網(wǎng)絡(luò)結(jié)構(gòu)及參數(shù)
2.1總體框架概覽我們采用的設(shè)計(jì)平臺是Xilinx公司研發(fā)的PYNQ-Z1開發(fā)板,可編程芯片為zynq7020,該芯片上資源較為充足,具有53 200個(gè)LUT,4.9MB(280個(gè)18kb塊)的BRAM和220個(gè)DSP(18×25MACC).以及雙核ARM Cortex-A9,可實(shí)現(xiàn)軟硬邏輯協(xié)同設(shè)計(jì).在該平臺上實(shí)現(xiàn)的Lenet-5 CNN網(wǎng)絡(luò)大致可分為兩部分:CPU ARM處理器端以及硬件邏輯單元端.具體工作流程大致如下:CPU ARM處理器端的其中一個(gè)MCU,被配置為接收輸入MNIST數(shù)據(jù)集的圖片張量,并傳輸至DDR存儲器以及輸出MNIST數(shù)據(jù)集的分類結(jié)果;DDR存儲器,被配置為把輸入MNIST數(shù)據(jù)集的圖片張量、輸出MNIST數(shù)據(jù)集的分類結(jié)果以及訓(xùn)練好的模型參數(shù)存儲起來;另一個(gè)MCU,被配置為執(zhí)行DMA驅(qū)動程序,控制調(diào)度DDR存儲器中存儲的MNIST數(shù)據(jù)集圖片張量以及將訓(xùn)練好的模型參數(shù)傳輸至FPGA的片上BRAM,并控制輸出MNIST數(shù)據(jù)集的分類結(jié)果存儲于DDR存儲器.在DMA中,通過AXI4-Streaming協(xié)議以盡可能大的吞吐量傳輸數(shù)據(jù)流,AXI DMA支持每個(gè)時(shí)鐘周期一個(gè)數(shù)據(jù)字的吞吐量.
圖2 PYNQ開發(fā)板上搭建CNN網(wǎng)絡(luò)的邏輯框架圖
2.2數(shù)據(jù)量化的必要性以及整體搭建過程一般神經(jīng)網(wǎng)絡(luò)的訓(xùn)練是在GPU上進(jìn)行,使用浮點(diǎn)運(yùn)算對速度影響不大,但是在FPGA上的離線預(yù)測階段,使用浮點(diǎn)數(shù)格式的數(shù)據(jù)參與運(yùn)算會嚴(yán)重影響速度.所以要想提高前向傳播的運(yùn)算速度,我們需要對網(wǎng)絡(luò)模型進(jìn)行數(shù)據(jù)量化.進(jìn)行數(shù)據(jù)量化的動機(jī)主要有兩個(gè):1) 減小模型文件的大小,因?yàn)槟P臀募紦?jù)很大的存儲空間;2) 降低預(yù)測過程需要的計(jì)算資源,從而提高運(yùn)行速度、減低功耗,這在嵌入式系統(tǒng)設(shè)計(jì)中具有重要意義.
Plilipp在其研究工作中明確比較了Lenet-5網(wǎng)絡(luò)在32位浮點(diǎn)數(shù)、16位定點(diǎn)數(shù)以及8位定點(diǎn)數(shù)三種數(shù)據(jù)格式下的分類精度,在32位浮點(diǎn)數(shù)下,Lenet-5對MNIST數(shù)據(jù)集的分類準(zhǔn)確率為99.15%,而在16位定點(diǎn)數(shù)的數(shù)據(jù)格式下準(zhǔn)確率幾乎沒有下降,從32位浮點(diǎn)數(shù)到8位定點(diǎn)數(shù)在沒有進(jìn)行微調(diào)之前相對分類精度損失10.3%,經(jīng)過微調(diào)之后絕對分類精度損失縮小至0.27%,表明Lenet-5在8位定點(diǎn)數(shù)的數(shù)據(jù)表示下運(yùn)行良好.所以我們最終選擇用8位定點(diǎn)數(shù)的數(shù)據(jù)格式來在FPGA上實(shí)現(xiàn)Lenet-5.
在軟件邏輯端,由于Lenet-5網(wǎng)絡(luò)對于識別MNIST數(shù)據(jù)集已經(jīng)很成熟,所以我們無需重新訓(xùn)練網(wǎng)絡(luò),只需要將訓(xùn)練好的網(wǎng)絡(luò)模型下載好備用.在可編程邏輯端,我們選用了Xilinx公司研發(fā)的Vivado HLS2017.4編譯器,使用C語言設(shè)計(jì)算法來編寫配置各網(wǎng)絡(luò)層以備測試,并使用HLS提高抽象級別,這樣所有可編程器件都無需手動創(chuàng)建RTL,而且編譯器支持ISE和Vivado設(shè)計(jì)環(huán)境,這些特點(diǎn)顯著降低了后續(xù)設(shè)計(jì)者的參與門檻[7].
我們將設(shè)計(jì)好的各層IP核按照網(wǎng)絡(luò)結(jié)構(gòu)鏈接在一起即構(gòu)成了整個(gè)Lenet-5網(wǎng)絡(luò)的IP流圖(SDFG),SDF的優(yōu)點(diǎn)是只要數(shù)據(jù)流到達(dá)節(jié)點(diǎn),節(jié)點(diǎn)便會立即開始計(jì)算并輸出結(jié)果,因?yàn)镾DFG結(jié)構(gòu)中的任意IP核都可獨(dú)立驅(qū)動數(shù)據(jù)流,這樣每層的輸出結(jié)果會立即流向下一IP核,而不是緩存在片上存儲器中,從而節(jié)省了整個(gè)網(wǎng)絡(luò)的內(nèi)存占用.
2.3優(yōu)化加速措施及細(xì)節(jié)
2.3.1 將卷積操作轉(zhuǎn)換為矩陣乘法 首先利用滑動窗口函數(shù)根據(jù)各層的基礎(chǔ)維度、填充維度以及步幅將含有卷積運(yùn)算該層的輸入特征映射擴(kuò)展為列向量,列向量的順序與卷積核展開順序一致;再將擴(kuò)展的列向量與卷積核進(jìn)行矩陣乘法完成卷積運(yùn)算.
圖3 卷積過程示意圖
在默認(rèn)數(shù)據(jù)流的順序中,輸入特征映射圖按照(批量大小,輸入通道,高度,寬度)的順序排列,卷積核按照(輸出通道,輸入通道,高度,寬度)的順序排列,在這兩種數(shù)據(jù)流的排列方式中,輸入通道都在高度和寬度之前,因此如果我將矩陣拆分為數(shù)據(jù)流,則在緩沖區(qū)緩沖完一個(gè)矩陣乘法所有的權(quán)重之前,幾乎需要緩沖整個(gè)特征映射,但是我交叉改變數(shù)據(jù)流順序后,讓輸入通道成為順序中的最后一個(gè)參數(shù),如此所需要的緩沖區(qū)數(shù)為K*W*C,這大大減少了緩沖區(qū)內(nèi)存的使用,如圖4所示.
圖4 減小緩沖區(qū)內(nèi)存使用框圖
2.3.2 并行計(jì)算與流水線技術(shù) 要想提高運(yùn)算的并行性,其中一項(xiàng)有效的技術(shù)就是將數(shù)據(jù)必須存儲在多個(gè)BRAM中,以便同時(shí)獲取多個(gè)數(shù)據(jù);而另一方面并行性的提升帶來的是DSP資源的使用量增加,我們通過在程序中設(shè)置一個(gè)“并行因子”來平衡片上資源和速度,該“并行因子”的具體數(shù)值一方面要考慮片上資源的利用率,另一方面要考慮該AI芯片的性能,我們通過不斷仿真測試,最終確定了各層“并行因子”的數(shù)值.假定矩陣乘法維數(shù)為(M*4)*(4*N),在圖5中,輸入特征圖和權(quán)重都被分割成很小的存儲體以便可以并行獲取多個(gè)輸入數(shù)據(jù),我們將輸入特征映射存至第1、3、5、7個(gè)內(nèi)存塊,將權(quán)值存至第2、4、6、8個(gè)內(nèi)存塊.在使用乘法器和加法器樹進(jìn)行并行計(jì)算階段,計(jì)算過程包含了許多寄存器讀取時(shí)段,我們設(shè)置存儲器在接下來的一個(gè)時(shí)鐘周期繼續(xù)讀取數(shù)據(jù),而不是等待上一個(gè)輸出結(jié)果,這樣就創(chuàng)建了輸出流水線,輸出數(shù)據(jù)具有了較高吞吐量,從而整體數(shù)據(jù)處理速度也得以提高.
圖5 FPGA并行計(jì)算框圖
3.1Lenet-5SDFG模型展示圖7是Lenet-5網(wǎng)絡(luò)在Vivado HLS中的仿真模型,對于每個(gè)IP層核,在每個(gè)時(shí)鐘周期,IP會接收輸入特征映射的新字,并在新輸出字準(zhǔn)備就緒時(shí)候輸出.為了消除時(shí)間違規(guī),將AXI4-Streaming寄存器片插入到相鄰的IP核之間,從而在AXI4-Streaming主機(jī)和從機(jī)之間創(chuàng)建了定時(shí)隔離.
圖6 Lenet-5網(wǎng)絡(luò)SDFG仿真模型圖
3.2性能評估與展望在Vivado HLS中,我們首先利用測試平臺設(shè)計(jì)C測試程序來驗(yàn)證Lenet-5網(wǎng)絡(luò)每一層的輸入輸出的準(zhǔn)確性以及整個(gè)Lenet-5網(wǎng)絡(luò)的輸入輸出正確性;而在Vivado 中,我們將整個(gè)SDFG封裝成一個(gè)IP核,并進(jìn)行可行性的驗(yàn)證,通過Vivado 合成比特流并通過Jupyter Notebook下載至PYNQ開發(fā)板中,并在Jupyter Notebook部署程序來完成整個(gè)項(xiàng)目的測試.在具體程序中,加載預(yù)訓(xùn)練好的模型并傳遞參量,對比了FPGA網(wǎng)絡(luò)模型在整個(gè)運(yùn)行處理數(shù)據(jù)過程所用時(shí)間與片上ARM CPU網(wǎng)絡(luò)模型整個(gè)運(yùn)行處理數(shù)據(jù)過程所用時(shí)間,并且將時(shí)間損耗與分類準(zhǔn)確率可視化出來,便于評估分析.下面我們將從以下幾個(gè)方面來評估我們的工作以及后續(xù)的方向.
3.2.1 片上資源利用率 下表列出了整個(gè)網(wǎng)絡(luò)在FPGA上實(shí)現(xiàn)所占用的資源狀況.
表1 Lenet-5網(wǎng)絡(luò)片上資源的占用
從表中我們可以看到,除了片上的寄存器資源與DSP48E外,我們幾乎利用了PYNQ上全部的資源,這一方面反映了數(shù)據(jù)量化的必要性,另一方面反映了如果我們想進(jìn)一步的獲得更好的加速效果,還需要FPGA芯片上更多片上資源的支持.
3.2.2 網(wǎng)絡(luò)模型的吞吐量 下表展示出了網(wǎng)絡(luò)模型中的各層參量,其中k代表卷積核的維度,In-channels與Out-channels分別代表輸入特征張量通道數(shù)與輸出特征張量通道數(shù).
表2 FPGA上Lenet-5網(wǎng)絡(luò)加速優(yōu)化參數(shù)
表中列出的并行因子代表每一層最大并行的乘累加操作數(shù)(OP/s),因此在理想的情況下(即假設(shè)所有層的乘累加操作是同時(shí)進(jìn)行的),我們可以計(jì)算得到該CNN模型的理論上的最大吞吐量
(3)
即(25+30+40+20)×100MHz(ZYNQ芯片的時(shí)鐘頻率)=11.5GOP/S.但在前向傳播運(yùn)算中,由于每層的吞吐量都不一樣,所以整個(gè)網(wǎng)絡(luò)的實(shí)際吞吐量相比于理論吞吐量會有一定的下降.
3.2.3 網(wǎng)絡(luò)模型的加速比 我們在Jupyter notebook中可視化的時(shí)間損耗為整個(gè)系統(tǒng)的時(shí)間,包括網(wǎng)絡(luò)部署時(shí)間、Python腳本解釋器初始化時(shí)間、內(nèi)存?zhèn)鬏斠约扒跋騻鞑サ臅r(shí)間,在處理批量較小時(shí),前向傳播的時(shí)間在總體時(shí)間中所占百分比不大,其余時(shí)間在整個(gè)時(shí)間中占據(jù)主導(dǎo)作用,我們嘗試不斷增大處理批量,使得前向傳播的時(shí)間占比增大,在該AI芯片與ARM CPU之間加速比明顯的階段,改變不同的圖片處理量,記錄執(zhí)行一次遍歷所消耗的時(shí)間,結(jié)果如下表3所示.
表3 AI芯片與ARM CPU在不同數(shù)據(jù)處理量下的損耗時(shí)間對比
我們可以大致估算一下我們基于FPGA設(shè)計(jì)的AI芯片的性能,隨著batch_size的不斷增大,該芯片的加速比會逐漸趨于一個(gè)穩(wěn)定狀態(tài),大約在22倍左右.
在本文中,我們結(jié)合Vivado以及Vivado HLS等工具在FPGA上實(shí)現(xiàn)了一種基于Lenet-5卷積神經(jīng)網(wǎng)絡(luò)的AI芯片,具體采用對CNN網(wǎng)絡(luò)實(shí)現(xiàn)8位定點(diǎn)數(shù)的數(shù)據(jù)量來優(yōu)化片上資源的使用,在分類結(jié)果方面相比于32位浮點(diǎn)數(shù)數(shù)據(jù)模型的分類準(zhǔn)確率幾乎相同,同時(shí)相對于ARM CPU有大約22倍的加速.該AI芯片系統(tǒng)攜帶方便,并且在設(shè)計(jì)CNN的各層算法時(shí)用軟件編程替代傳統(tǒng)的硬件語言,降低了軟件開發(fā)人員開發(fā)FPGA的門檻,在對網(wǎng)絡(luò)輸入形式為二維圖片的分類課題上具有較強(qiáng)的通用性.
但是從長遠(yuǎn)來看,我們的工作仍然有很大的提升余地,本文所設(shè)計(jì)的AI芯片系統(tǒng)的性能仍然存在很大的改進(jìn)空間,芯片上的DSP48E以及Registers的資源利用率不高.在接下來的工作中,我們會優(yōu)化片上資源的分配來進(jìn)一步的提高芯片性能,我們會考慮實(shí)現(xiàn)結(jié)構(gòu)更加復(fù)雜以及針對特定分類主題的CNN網(wǎng)絡(luò),而在FPGA開發(fā)平臺方面,我們將考慮換用更大片上資源的芯片,實(shí)現(xiàn)更高的加速.