武世雄,高 巍,尹震宇,張飛青,徐福龍
1(沈陽(yáng)化工大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,沈陽(yáng) 110000)
2(中國(guó)科學(xué)院 沈陽(yáng)計(jì)算技術(shù)研究所,沈陽(yáng) 110168)
3(遼寧省國(guó)產(chǎn)基礎(chǔ)軟硬件工控平臺(tái)技術(shù)研究重點(diǎn)實(shí)驗(yàn)室,沈陽(yáng) 110168)
近年來(lái),卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)能夠?qū)崿F(xiàn)圖像識(shí)別、目標(biāo)檢測(cè)和自動(dòng)翻譯等任務(wù),已經(jīng)被廣泛應(yīng)用于智能制造、自動(dòng)駕駛和航天航空等領(lǐng)域[1-5].由于神經(jīng)網(wǎng)絡(luò)模型層數(shù)的不斷加深以及結(jié)構(gòu)復(fù)雜度的不斷提高,使用中央處理器(Central Processing Unit,CPU)或者圖像處理器(Graphics Processing Unit,GPU)通常會(huì)遇到功耗較高、便攜性不足等問(wèn)題.為有效緩解這些問(wèn)題,在網(wǎng)絡(luò)層面上提出了很多減少模型參數(shù)的方法,如參數(shù)量化[6]、網(wǎng)絡(luò)剪枝[7]等;在硬件層面上,由于嚴(yán)格的計(jì)算、存儲(chǔ)和能耗等資源的限制,現(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,FPGA)成為CPU和GPU的可替代方案,利用其并行性[8]和可靈活配置[9]等特點(diǎn)加速卷積神經(jīng)網(wǎng)絡(luò),可以大大提高計(jì)算的性能并降低功耗.
由于FPGA片上資源有限,如何提高計(jì)算的并行度并降低片上存儲(chǔ)資源成為當(dāng)前卷積神經(jīng)網(wǎng)絡(luò)加速器面臨的主要問(wèn)題.通常卷積運(yùn)算由乘法器和加法器構(gòu)成,但是使用FPGA實(shí)現(xiàn)乘加運(yùn)算需要更多的硬件資源.Zhang等人提出了Roofline模型以優(yōu)化資源利用率,有效的提高了循環(huán)流水的性能[10].Ma等人提出一種從輸出特征圖數(shù)、高度和寬度展開(kāi)的架構(gòu),并且優(yōu)化循環(huán)操作和數(shù)據(jù)流操作進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)加速,但該文將輸入特征圖和權(quán)重參數(shù)都緩存在片上,很難在低端FPGA上運(yùn)行[11].Han等人提出,在不損失準(zhǔn)確率或準(zhǔn)確率損失較小的情況下,用位數(shù)較低的數(shù)據(jù)如4-8位的數(shù)據(jù)代替全精度浮點(diǎn)數(shù)是可行的[12,13].Qiu等人提出了參數(shù)重排及數(shù)據(jù)量化的方法,并設(shè)計(jì)了一種在卷積核長(zhǎng)寬二維展開(kāi)的加速器架構(gòu),但建模時(shí)沒(méi)有考慮傳輸時(shí)延,導(dǎo)致實(shí)際性能與理論相差較大[14].上述研究提出各種方法通過(guò)并行計(jì)算和內(nèi)存優(yōu)化,以達(dá)到計(jì)算單元利用率和緩存數(shù)據(jù)復(fù)用率的最大化,進(jìn)而實(shí)現(xiàn)計(jì)算性能的提高和片上內(nèi)存的優(yōu)化.
本文在前人的研究基礎(chǔ)上,針對(duì)目前卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜、參數(shù)較多導(dǎo)致硬件資源消耗較大等問(wèn)題,設(shè)計(jì)了面向ZYNQ SoC的卷積神經(jīng)網(wǎng)絡(luò)加速器,包括:
1)通過(guò)軟硬件協(xié)同配合,能夠?qū)D像進(jìn)行識(shí)別分類,采用滑動(dòng)窗口間并行策略提高了并行計(jì)算能力;
2)該加速器進(jìn)行了參數(shù)量化,在精度損失很小的情況下,大大節(jié)省了片上存儲(chǔ)資源;
3)同時(shí)進(jìn)行了權(quán)重參數(shù)的重排序,能夠以較大的突發(fā)長(zhǎng)度進(jìn)行傳輸,有效的減少了訪存次數(shù),提高了帶寬的利用率.
卷積神經(jīng)網(wǎng)絡(luò)通常以反饋的方式訓(xùn)練,以前饋方式進(jìn)行圖像分類,而FPGA更適合神經(jīng)網(wǎng)絡(luò)算法的推理階段,其工作流程為逐層提取輸入圖像的特征,最終通過(guò)分類器得到所需要的結(jié)果,CNN主要有卷積計(jì)算、全連接計(jì)算、批歸一化(Batch Normalization)計(jì)算、激活函數(shù)處理和池化計(jì)算.
卷積神經(jīng)網(wǎng)絡(luò)主要由多個(gè)卷積層組成,整個(gè)神經(jīng)網(wǎng)絡(luò)百分之九十以上的計(jì)算量來(lái)源于卷積層,卷積層是整個(gè)神經(jīng)網(wǎng)絡(luò)的主體部分,其主要作用是對(duì)輸入的圖像數(shù)據(jù)進(jìn)行特征提取,其計(jì)算公式如下:
(1)
公式(1)中:Qn(i,j)為第n張輸出圖像上(i,j)處的輸出特征;wmn(x,y)為卷積核(x,y)處的權(quán)重值;gm(s0i+x,s0j+y)為第m張輸入圖像在(s0i+x,s0j+y)處的特征值;bn為第n張輸出特征的偏置值;Mn為輸入圖像的通道數(shù),Xn和Yn為卷積核的長(zhǎng)寬,S0為步長(zhǎng).
卷積層輸出的結(jié)果需要經(jīng)過(guò)批量歸一化和激活函數(shù)處理.批量歸一化處理可以有效避免數(shù)據(jù)在激活之前被轉(zhuǎn)化成相似的模式,從而使得非線性特征分布趨于同化,可以解決梯度爆炸的問(wèn)題,加速網(wǎng)絡(luò)的收斂;激活函數(shù)的作用是將特征保留并映射出來(lái),用來(lái)增強(qiáng)卷積神經(jīng)網(wǎng)絡(luò)的非線性,本文選擇ReLU函數(shù)作為非線性激活函數(shù).除此之外,還需要經(jīng)過(guò)池化層進(jìn)行特征選擇和信息過(guò)濾,池化層包括最大池化和平均池化,本文選擇最大池化來(lái)降低數(shù)據(jù)的維度,防止圖像過(guò)擬合.
最后進(jìn)入全連接層,該層將特征圖進(jìn)行整合和分類以得到整個(gè)圖像的信息,該層權(quán)重參數(shù)較多,訪存較頻繁,可以看作特征圖與卷積核在做1×1的卷積操作,以實(shí)現(xiàn)特征分類.最后經(jīng)過(guò)Softmax邏輯回歸函數(shù)得到分類結(jié)果,其計(jì)算公式如下:
(2)
公式(2)中w為神經(jīng)元的權(quán)值,K為要分類的類別數(shù),T為轉(zhuǎn)置,x為上一層的輸出平鋪后的結(jié)果,i為預(yù)測(cè)的類別,p為當(dāng)輸入為x預(yù)測(cè)類別為i的概率.
VGG-16網(wǎng)絡(luò)是一種典型的深度CNN模型,由Simonyan和Zisserman在2014年提出的,在ImageNet2014分類大賽中Top-5錯(cuò)誤率僅為7.4%[15],僅次于GoogleNet的6.7%,是一種非常強(qiáng)大的深度卷積神經(jīng)網(wǎng)路,能夠提取圖像中的更深層特征,分類能力突出.在此之后,不斷出現(xiàn)層數(shù)更多的網(wǎng)絡(luò)結(jié)構(gòu),如VGG-19,是通過(guò)加深網(wǎng)絡(luò)結(jié)構(gòu)來(lái)提高網(wǎng)絡(luò)分類的性能.因?yàn)榫W(wǎng)絡(luò)越深,梯度退化阻礙了網(wǎng)絡(luò)的收斂.所以,本文采用VGG-16,標(biāo)準(zhǔn)的VGG-16網(wǎng)絡(luò)包含13個(gè)卷積層和3個(gè)全連接層,使用3×3的卷積核,并通過(guò)2×2最大池化來(lái)減小運(yùn)算規(guī)格.其網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示.
圖1 VGG-16卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
本文所提出的系統(tǒng)整體硬件架構(gòu)如圖2所示,卷積神經(jīng)網(wǎng)絡(luò)加速器在PS(Processor System)端對(duì)整個(gè)加速器進(jìn)行控制操作,在PL(Programmable Logic)端進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)的并行計(jì)算.PS端主要包含串口控制模塊、流程控制模塊和存儲(chǔ)控制模塊;PL端主要包含直接內(nèi)存存取(Direct Memory Access,DMA)模塊、卷積運(yùn)算模塊、特征增強(qiáng)模塊、全連接模塊、邏輯回歸模塊和中斷模塊.
圖2 系統(tǒng)整體硬件架構(gòu)圖
串口控制模塊主要用于接收運(yùn)算結(jié)果并打印結(jié)果信息;流程控制模塊是ARM處理器對(duì)整體系統(tǒng)進(jìn)行控制;存儲(chǔ)控制模塊主要用于對(duì)動(dòng)態(tài)隨機(jī)存儲(chǔ)器(Double Data Rate,DDR)的控制操作;DMA用于DDR與片上緩存器之間數(shù)據(jù)傳輸;卷積運(yùn)算模塊用于對(duì)CNN中卷積層進(jìn)行運(yùn)算操作;特征增強(qiáng)模塊進(jìn)行非線性處理運(yùn)算,用于實(shí)現(xiàn)參數(shù)的量化操作、反量化操作、ReLU運(yùn)算、批量歸一化(Batch Normalization,BN)運(yùn)算和池化運(yùn)算;全連接模塊用于實(shí)現(xiàn)圖像分類;回歸模塊用于完成回歸模塊概率運(yùn)算并且給出預(yù)測(cè)結(jié)果最大的前五個(gè)概率和標(biāo)號(hào);中斷模塊為全局中斷控制模塊,負(fù)責(zé)接收卷積運(yùn)算模塊、特征增強(qiáng)模塊、全連接模塊和邏輯回歸模塊相對(duì)應(yīng)的中斷,并對(duì)接收到的中斷進(jìn)行整合操作.
本文所設(shè)計(jì)的卷積神經(jīng)網(wǎng)絡(luò)硬件加速器運(yùn)算流程圖如圖3所示,首先需要對(duì)神經(jīng)網(wǎng)絡(luò)圖像數(shù)據(jù)和權(quán)重參數(shù)進(jìn)行量化處理,接著將權(quán)重?cái)?shù)據(jù)和圖像數(shù)據(jù)加載到DDR中,并且分別對(duì)卷積模塊、特征增強(qiáng)模塊、全連接模塊和回歸模塊的寄存器進(jìn)行配置.
圖3 運(yùn)算流程圖
然后,使用DMA將部分圖像數(shù)據(jù)和權(quán)重參數(shù)寫入片上緩存,通過(guò)中斷模塊對(duì)卷積、池化和全連接運(yùn)算進(jìn)行控制,直到整個(gè)卷積神經(jīng)網(wǎng)絡(luò)中所有層運(yùn)算完成之后,將運(yùn)算的結(jié)果通過(guò)DMA寫回到DDR;最后,進(jìn)行Softmax運(yùn)算,通過(guò)寄存器的方式將預(yù)測(cè)結(jié)果傳回串口并打印.
3.2.1 感知量化前向傳播過(guò)程
CNN訓(xùn)練過(guò)程通常會(huì)采用多種方法來(lái)提高訓(xùn)練結(jié)果的準(zhǔn)確度,在進(jìn)行模型前向推理的過(guò)程中,會(huì)對(duì)卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)進(jìn)行預(yù)處理,可以減少前向推理的計(jì)算量,有利于對(duì)模型進(jìn)行量化處理,提高運(yùn)算的速度.
卷積神經(jīng)網(wǎng)絡(luò)計(jì)算涉及的操作數(shù)一般默認(rèn)是32位或者是64位的浮點(diǎn)數(shù),但是Han等人的相關(guān)實(shí)驗(yàn)證實(shí),在不損失準(zhǔn)確率或者準(zhǔn)確率損失較小的情況下,對(duì)于卷積神經(jīng)網(wǎng)絡(luò)的乘加運(yùn)算,用定點(diǎn)數(shù)代替浮點(diǎn)數(shù)進(jìn)行運(yùn)算是可行的,而且將定點(diǎn)數(shù)的數(shù)據(jù)位寬調(diào)整到16位或8位[12].相比于浮點(diǎn)數(shù),使用位數(shù)相對(duì)較少的定點(diǎn)數(shù),可以有效減少數(shù)據(jù)帶寬,增加FPGA片上存儲(chǔ)的數(shù)據(jù),減少訪問(wèn)DDR的次數(shù),同時(shí)還可以增加吞吐量和計(jì)算的性能.
本文對(duì)權(quán)重參數(shù)和輸入特征圖進(jìn)行8位定點(diǎn)量化,如下以一層卷積運(yùn)算進(jìn)行ReLU和全連接運(yùn)算為例.一個(gè)浮點(diǎn)數(shù)f需要量化到(0,N-1)的范圍內(nèi),本文采用的量化位寬為8,那么N為256.f表示浮點(diǎn)數(shù),q表示量化后的定點(diǎn)數(shù),浮點(diǎn)數(shù)和量化后定點(diǎn)數(shù)轉(zhuǎn)換公式如下:
f=S(q-Z)
(3)
(4)
其中S表示縮放系數(shù),為任意大于0的浮點(diǎn)數(shù);Z表示零點(diǎn),當(dāng)Z為0時(shí),f為q的量化值.其公式如下:
(5)
(6)
其中fmax和fmin分別表示浮點(diǎn)矩陣的最大值和最小值,qmax和qmin分別表示量化后定點(diǎn)數(shù)矩陣的最大值和最小值.
(7)
假設(shè)第1層卷積的中間結(jié)果為a1,經(jīng)過(guò)ReLU之后的結(jié)果為a2,卷積運(yùn)算公式如下:
(8)
(9)
(10)
M≈(int)(2-n×M0)
(11)
其中M0為[0.5,1)之間的定點(diǎn)數(shù);n是正整數(shù),為乘以2的次數(shù).
對(duì)于ReLU來(lái)說(shuō),計(jì)算公式不再是qa2=max(qa1,0),而是qa2=max(qa1,Za1),并且Sa1=Sa2,Za1=Za2.量化后的全連接層為如下公式:
(12)
通過(guò)上述過(guò)程的量化中間結(jié)果,可以用定點(diǎn)數(shù)的移位和乘加來(lái)擬合浮點(diǎn)數(shù)的乘加運(yùn)算,除了推理過(guò)程中的預(yù)處理和后處理外,在FPGA端使用量化后的定點(diǎn)數(shù)進(jìn)行計(jì)算和傳輸,這將會(huì)大大提高傳輸速度和計(jì)算速度.
3.2.2 參數(shù)重排
對(duì)于權(quán)重參數(shù),在本文的加速器中,將預(yù)先訓(xùn)練好的權(quán)重參數(shù)加載到DDR.在未排序的情況下如圖4(a)所示,將分配64個(gè)長(zhǎng)度為900的緩存區(qū),在進(jìn)行卷積層的計(jì)算時(shí),權(quán)重參數(shù)會(huì)逐個(gè)填充到緩沖區(qū),導(dǎo)致DMA頻繁讀取DDR中的權(quán)重參數(shù),為了減少DMA頻繁啟動(dòng)和在進(jìn)行全連接層的計(jì)算時(shí),讀取數(shù)據(jù)保持較長(zhǎng)的突發(fā)長(zhǎng)度,將在DDR中進(jìn)行權(quán)重?cái)?shù)據(jù)的重排.Qiu等人采用參數(shù)排序方式如圖4(b)所示,該排序是將整個(gè)矩陣分成64個(gè)9×100的塊,需要按箭頭的順序從DDR讀取100×9大小的權(quán)重參數(shù)64次,但是由于參數(shù)不連續(xù),需要訪存100×64次,每次的突發(fā)長(zhǎng)度為9[14];而本文采用的排序方式如圖4(c)所示,由于每次讀取的參數(shù)的存放是連續(xù)的,只需要訪存64次,每次傳輸?shù)耐话l(fā)長(zhǎng)度為100×9.采取本文所述的參數(shù)重新排序后,增大了突發(fā)長(zhǎng)度并且減少了大量的訪存次數(shù),保證帶寬有較高的利用率,減少了數(shù)據(jù)傳輸帶來(lái)的開(kāi)銷.在DMA讀取DDR的權(quán)重參數(shù)到片上緩存時(shí),設(shè)置了片上雙緩存,利用“乒乓”數(shù)據(jù)傳輸機(jī)制,可以有效的用計(jì)算時(shí)間掩蓋數(shù)據(jù)的傳輸時(shí)間,減少了程序整體的執(zhí)行時(shí)間.
圖4 DDR中權(quán)重參數(shù)排序
3.2.3 滑動(dòng)窗口間并行
本文加速器中卷積部分的運(yùn)算數(shù)據(jù)流,采用滑動(dòng)窗口間并行策略.首先進(jìn)行圖像的預(yù)處理,該預(yù)處理模塊與徐欣等人[16]采用的結(jié)構(gòu)相似,對(duì)圖像數(shù)據(jù)進(jìn)行重組和對(duì)齊,實(shí)現(xiàn)圖像數(shù)據(jù)的高度并行傳輸和計(jì)算.文中使用W表示圖像的寬度,M表示數(shù)據(jù)傳輸?shù)牟⑿卸?即一個(gè)時(shí)鐘周期內(nèi)并行傳輸?shù)臄?shù)據(jù)個(gè)數(shù);N表示數(shù)據(jù)計(jì)算的并行度,為一個(gè)卷積核在圖像上可同時(shí)計(jì)算的結(jié)果個(gè)數(shù);K為卷積核的大小.預(yù)處理單元由3個(gè)先進(jìn)先出線性緩存器(FIFO)組成,目的是緩存圖像數(shù)據(jù),使得輸入數(shù)據(jù)為行對(duì)齊結(jié)構(gòu),滿足卷積運(yùn)算對(duì)數(shù)據(jù)格式的要求.
為實(shí)現(xiàn)并行計(jì)算,輸入圖像的寬度W應(yīng)為數(shù)據(jù)傳輸并行度M的整數(shù)倍,如果不滿足整數(shù)倍需要做Padding操作擴(kuò)充輸入圖像,以在W/M個(gè)時(shí)鐘周期內(nèi)完成輸入圖像每行數(shù)據(jù)的傳輸.這樣圖像數(shù)據(jù)就可以以行對(duì)齊的方式存儲(chǔ)在線性FIFO中,不會(huì)產(chǎn)生行錯(cuò)位.然后,行對(duì)齊輸出要求對(duì)FIFO進(jìn)行同時(shí)讀取,使不同行的輸入位置的數(shù)據(jù)一起輸出.最后,將讀取的圖像數(shù)據(jù)組合成卷積矩陣,輸入到計(jì)算模塊,與系數(shù)進(jìn)行卷積運(yùn)算.
如圖5所示的輸入圖像為8×8,卷積核大小為3×3,其中原始圖像大小為6×6,因?yàn)橐馆敵鎏卣鲌D和原始圖像一樣大,通過(guò)padding操作進(jìn)行像素填充,DMA將輸入特征圖搬運(yùn)到片上緩存,首先經(jīng)過(guò)FIFO進(jìn)行緩存,解決外部圖像輸入與內(nèi)部計(jì)算電路時(shí)鐘域異步問(wèn)題.按行優(yōu)先的順序?qū)斎雸D像進(jìn)行讀取,數(shù)據(jù)傳輸?shù)牟⑿卸萂設(shè)置為8,滑動(dòng)步長(zhǎng)為1.圖像的邊長(zhǎng)正好為數(shù)據(jù)傳輸并行度的整數(shù)倍,所以無(wú)需在FIFO中補(bǔ)充無(wú)效數(shù)據(jù).該例中使用3個(gè)FIFO緩存三行輸入數(shù)據(jù),實(shí)現(xiàn)行對(duì)齊輸出,如圖5(b)所示.當(dāng)卷積核的滑動(dòng)步長(zhǎng)為1時(shí),每個(gè)卷積操作的輸入矩陣之間有重疊區(qū)域,故按照如圖5(c)的方式進(jìn)行組合可得到6個(gè)卷積矩陣.然后復(fù)用如圖5(d)的卷積核與每個(gè)輸入矩陣進(jìn)行乘加運(yùn)算,這樣一個(gè)時(shí)鐘周期就可以得到如圖5(e)中6×6的輸出圖像.
圖5 滑動(dòng)窗口間并行
綜上所述,雖然卷積層的原始計(jì)算模式是計(jì)算完一個(gè)滑動(dòng)窗口,再向右移動(dòng)一個(gè)步長(zhǎng),計(jì)算新的窗口.本文可以先連續(xù)從輸入特征圖中提取多個(gè)相鄰的滑動(dòng)窗口,不同的滑動(dòng)窗口使用相同的卷積核,大大降低了卷積核的讀取次數(shù),并且增加了計(jì)算的并行度.
3.3.1 卷積整體架構(gòu)
卷積模塊的整體架構(gòu)如圖6所示,處理單元(Processing Element,PE)主要負(fù)責(zé)卷積運(yùn)算過(guò)程的乘加運(yùn)算,數(shù)據(jù)重組模塊對(duì)圖像數(shù)據(jù)進(jìn)行Padding操作和重組對(duì)齊.卷積模塊的運(yùn)算過(guò)程為:卷積運(yùn)算模塊接收控制模塊發(fā)送讀取數(shù)據(jù)指令,按照指令進(jìn)行相關(guān)寄存器的配置,并且根據(jù)指令要求從卷積權(quán)重緩存中讀取權(quán)重參數(shù)傳給各個(gè)PE模塊,同時(shí)從圖像數(shù)據(jù)緩存中讀取圖像數(shù)據(jù)到數(shù)據(jù)重組模塊,數(shù)據(jù)重組模塊進(jìn)行圖像數(shù)據(jù)的Padding操作和重組對(duì)齊,然后將圖像數(shù)據(jù)傳給每個(gè)PE模塊進(jìn)行卷積運(yùn)算.卷積運(yùn)算完成后,將卷積運(yùn)算結(jié)果通過(guò)DMA發(fā)送到特征增強(qiáng)模塊,進(jìn)行ReLU運(yùn)算或者池化運(yùn)算.
圖6 卷積運(yùn)算模塊整體架構(gòu)
由于不同卷積核對(duì)同一輸入數(shù)據(jù)的卷積操作在一個(gè)PE中進(jìn)行計(jì)算,因此輸入數(shù)據(jù)只需要從DDR中讀取一次便可以在片上多次使用,這有效的提高了片上數(shù)據(jù)的使用率,一定程度上減少了訪存次數(shù).
3.3.2 計(jì)算核心單元設(shè)計(jì)
本文加速器計(jì)算核心單元的具體實(shí)現(xiàn)細(xì)節(jié)如圖7所示,該加速器是由Poy×Pox×Pkx×Pkx個(gè)乘累加(Multiply-Accumulation,MAC)單元組成,每個(gè)MAC由一個(gè)乘法器和一個(gè)加法器組成,從輸入數(shù)據(jù)緩存區(qū)讀取圖像數(shù)據(jù)由Pox×Pkx×Pkx個(gè)MAC單元共享,滑動(dòng)窗口重疊的數(shù)據(jù)可以被重用;從權(quán)重緩存區(qū)中讀取的權(quán)重參數(shù)由Poy×Pkx×Pkx共享.等待權(quán)重?cái)?shù)據(jù)和圖像數(shù)據(jù)進(jìn)入MAC單元之后,一個(gè)時(shí)鐘周期可以完成2×Poy×Pox×Pkx×Pkx次乘法和加法運(yùn)算,即MAC單元的并行度為Poy×Pox×Pkx×Pkx.每個(gè)MAC將計(jì)算結(jié)果輸出到加法樹(shù)中進(jìn)行累加操作,最后加入偏置,輸出到輸出緩存.
圖7 卷積計(jì)算核心單元
本文網(wǎng)絡(luò)的不同卷積層之間參數(shù)不同,圖像的尺寸、通道數(shù)和卷積核的數(shù)量也不相同,每一次卷積計(jì)算的循環(huán)次數(shù)和相關(guān)寄存器的配置由控制器進(jìn)行控制與調(diào)度,該控制器通過(guò)AXI總線控制計(jì)算核心單元有序執(zhí)行,控制DMA將DDR中的數(shù)據(jù)搬運(yùn)到片上緩存,從而對(duì)不同卷積層進(jìn)行計(jì)算.
如圖8所示為本文控制流的處理:將從DDR中讀取的權(quán)重?cái)?shù)據(jù)和圖像數(shù)據(jù)寫入到片上緩存,卷積模塊讀取相關(guān)數(shù)據(jù)進(jìn)行卷積運(yùn)算,然后交給特征增強(qiáng)模塊進(jìn)行BN運(yùn)算、ReLU運(yùn)算和池化運(yùn)算,最后將運(yùn)算結(jié)果寫回到輸出緩存,等全部運(yùn)算結(jié)束后將得到的最終結(jié)果寫回到DDR.
圖8 控制調(diào)度流
本實(shí)驗(yàn)使用的FPGA芯片為Xilinx ZYNQ XC7Z100-2FFG900I(Kintex-7架構(gòu)).采用的卷積神經(jīng)網(wǎng)絡(luò)模型為VGG-16,數(shù)據(jù)集為ImageNet數(shù)據(jù)集.本文加速器工作頻率為100MHz,使用Xilinx公司的Vivado 2019.1軟件進(jìn)行綜合和布局布線,使用Modelsim SE-64 10.7進(jìn)行仿真.
本文通過(guò)Verilog HDL語(yǔ)言完成各個(gè)IP核的設(shè)計(jì),然后將各個(gè)IP核進(jìn)行配置和連線,完成Block Design設(shè)計(jì).在設(shè)計(jì)輸入之后、設(shè)計(jì)綜合之前進(jìn)行功能仿真,使用Vivado和Modelsim進(jìn)行聯(lián)合仿真對(duì)電路設(shè)計(jì)進(jìn)行驗(yàn)證.對(duì)完成的電路添加約束并進(jìn)行綜合,進(jìn)一步布局布線之后可以得到時(shí)序分析報(bào)告和資源使用率報(bào)告.設(shè)計(jì)完成后加入調(diào)試所需要的集成邏輯分析器(Integrated Logic Analyzer,ILA)進(jìn)行時(shí)序仿真,該仿真可以真實(shí)的反映邏輯的時(shí)延和功能,綜合考慮電路各個(gè)路徑延遲與門延遲的影響,驗(yàn)證電路能否在一定時(shí)序條件下滿足設(shè)計(jì)構(gòu)想和是否存在時(shí)序違規(guī).經(jīng)過(guò)調(diào)試驗(yàn)證之后,得到滿足時(shí)序要求的SoC系統(tǒng)設(shè)計(jì).最后將綜合后的Bitstream文件導(dǎo)入Vivado SDK中進(jìn)行軟件層面的開(kāi)發(fā)和驗(yàn)證.如表1所示為本文FPGA資源的使用情況.
表1 FPGA資源利用情況
在FPGA中采用32位浮點(diǎn)數(shù)進(jìn)行運(yùn)算時(shí),需要3個(gè)DSP資源才能實(shí)現(xiàn)一次乘累加運(yùn)算;而使用8位定點(diǎn)數(shù)進(jìn)行運(yùn)算時(shí),只需要一個(gè)DSP就可以實(shí)現(xiàn)一次乘累加運(yùn)算.本文實(shí)現(xiàn)了8位定點(diǎn)精度的卷積神經(jīng)網(wǎng)絡(luò)加速器,相對(duì)于32位浮點(diǎn)數(shù),用8位定點(diǎn)數(shù)來(lái)實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)對(duì)網(wǎng)絡(luò)整體的精度影響較小,如表2所示,采用8位定點(diǎn)數(shù)的模型參數(shù)量較32位浮點(diǎn)數(shù)的參數(shù)量減少了75%,大大減少了數(shù)據(jù)的傳輸時(shí)間和存儲(chǔ)資源,同時(shí)減少了邏輯資源的使用,進(jìn)而提升了加速器的性能和運(yùn)算的速度.
表2 網(wǎng)絡(luò)參數(shù)
本文采用軟硬件協(xié)同配和的方式對(duì)卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行加速,FPGA對(duì)卷積神經(jīng)網(wǎng)絡(luò)中大量的乘法和加法進(jìn)行運(yùn)算,ARM處理器用于初始化卷積神經(jīng)網(wǎng)絡(luò)加速過(guò)程中各層參數(shù)的配置和對(duì)FPGA的各個(gè)IP核進(jìn)行調(diào)度.如表3所示為本文神經(jīng)網(wǎng)絡(luò)加速器與其他加速器在加速VGG-16的性能比較.該加速器工作頻率在100MHz下,處理一張224×224的圖片所需要的時(shí)間為15.10ms(66.21幀/s),功率為2.47W,能耗為0.16KJ,本文功率相比于文獻(xiàn)[17]降低了69.13%,較文獻(xiàn)[18]降低了74.35%;本文卷積運(yùn)算的性能為99.5GOPS,峰值性能能夠達(dá)到306.24GOPS,整個(gè)加速過(guò)程中的平均性能為80.88GOPS,平均性能較文獻(xiàn)[19]提升了0.29倍;性能密度較文獻(xiàn)[18]提升了1.76倍,較文獻(xiàn)[19]提升了1.14倍;使用的DSP的數(shù)量?jī)H為文獻(xiàn)[18]的22.05%和文獻(xiàn)[19]的59.72%.
表3 相關(guān)工作對(duì)比
本文通過(guò)對(duì)卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)及網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行分析,提出了一種面向ZYNQ SoC的卷積神經(jīng)網(wǎng)絡(luò)加速器,對(duì)參數(shù)進(jìn)行了8位定點(diǎn)量化和重新排序,使用了滑動(dòng)窗口并行策略進(jìn)行加速.實(shí)驗(yàn)表明量化后的VGG-16網(wǎng)絡(luò)參數(shù)量減少的同時(shí),該加速器性能有明顯的提升.下一步的工作中,將增大硬件加速VGG-16的并行度,靈活使用LUT來(lái)代替部分DSP資源,盡可能的去發(fā)揮FPGA的并行計(jì)算能力.