陳 辰,柴志雷,2+,夏 珺
1.江南大學(xué) 物聯(lián)網(wǎng)工程學(xué)院,江蘇 無(wú)錫214122
2.數(shù)學(xué)工程與先進(jìn)計(jì)算國(guó)家重點(diǎn)實(shí)驗(yàn)室,江蘇 無(wú)錫214125
+通訊作者E-mail:zlchai@jiangnan.edu.cn
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)已在圖像分類(lèi)、目標(biāo)檢測(cè)等領(lǐng)域被廣泛應(yīng)用[1-2]。為了滿(mǎn)足卷積神經(jīng)網(wǎng)絡(luò)對(duì)高強(qiáng)度計(jì)算能力的需求,當(dāng)前數(shù)據(jù)中心、服務(wù)器端不僅采用ASIC(application specific integrated circuit)或GPU(graphics processing unit)處理大批量數(shù)據(jù)[3],考慮到能效等因素也會(huì)大規(guī)模部署FPGA(field-programmable gate array)[4]。除了ASIC 外,F(xiàn)PGA 也可以很好地滿(mǎn)足嵌入式端低功耗高性能的需求[5]。并且,F(xiàn)PGA 可重構(gòu)的特點(diǎn)很好地適應(yīng)當(dāng)前深度學(xué)習(xí)日新月異的演變速度,因此已有許多基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)加速器的研究[6]。
Zhang 等人設(shè)計(jì)出一種輸入和輸出特征圖數(shù)目二維展開(kāi)的SIMD(single instruction multiple data)卷積神經(jīng)網(wǎng)絡(luò)加速器架構(gòu),并且提出采用Roofline模型進(jìn)行加速器設(shè)計(jì)空間的探索[7]。Qiu等人深入分析了CNN 模型的計(jì)算與存儲(chǔ)瓶頸,提出了參數(shù)重排序以及數(shù)據(jù)量化的具體流程,并設(shè)計(jì)出了一種在卷積核長(zhǎng)寬二維展開(kāi)的加速器架構(gòu)。但是,在建模時(shí)并沒(méi)有將傳輸延時(shí)也考慮在內(nèi),導(dǎo)致實(shí)際性能與理論性能相差接近47%[8]。雖然Rahman等人提出了一種將帶寬考慮在內(nèi)的加速器模型,但只是根據(jù)傳輸數(shù)據(jù)量建模,并沒(méi)有考慮實(shí)際傳輸時(shí)延[9]。Ma 等人詳細(xì)分析了基于卷積循環(huán)展開(kāi)SIMD架構(gòu)的設(shè)計(jì)可能性,并提出在輸出特征圖數(shù)、寬度和高度三維展開(kāi)的SIMD架構(gòu)加速器。然而,由于提出的架構(gòu)將特征圖像素和權(quán)重都緩存在片上,導(dǎo)致所耗費(fèi)的FPGA資源過(guò)多,很難在低端FPGA 上使用[10]。為了提高FPGA計(jì)算資源的動(dòng)態(tài)利用率,Shen 等人提出設(shè)計(jì)多個(gè)加速器并發(fā)處理不同層,并且通過(guò)多通道數(shù)據(jù)傳輸改進(jìn)傳輸時(shí)延[11]。Li等人設(shè)計(jì)了一種層間流水,層內(nèi)輸入、輸出特征圖數(shù)和卷積核寬三維展開(kāi)的加速器架構(gòu),但也只適用于資源足夠多的FPGA[12]。Zhang 等人提出通過(guò)增大突發(fā)傳輸長(zhǎng)度來(lái)有效利用帶寬,以及通過(guò)參數(shù)復(fù)用和多批量處理來(lái)提高處理全連接層時(shí)計(jì)算單元的利用效率[13]。盧冶等人提出了一種面向邊緣計(jì)算的嵌入式FPGA 平臺(tái)卷積神經(jīng)網(wǎng)絡(luò)的通用構(gòu)建方法,但是用于評(píng)估的模型過(guò)于簡(jiǎn)單,并且只設(shè)計(jì)了一種類(lèi)似文獻(xiàn)[7]的加速器架構(gòu)[14]。另外,硬件設(shè)計(jì)的開(kāi)發(fā)周期是非常長(zhǎng)的,這也是導(dǎo)致硬件相關(guān)研究緩慢的一大原因。因此,可以通過(guò)高層次綜合(high-level synthesis,HLS)來(lái)快速地描述和實(shí)現(xiàn)所需的硬件架構(gòu),由此造成的額外資源開(kāi)銷(xiāo)和開(kāi)發(fā)效率的提升相比是可以接受的[15-16]。
因此,使用HLS 設(shè)計(jì)并實(shí)現(xiàn)了一種在輸入和輸出特征圖數(shù)二維展開(kāi)的SIMD 卷積神經(jīng)網(wǎng)絡(luò)加速器架構(gòu),并使用了參數(shù)重排序、多通道數(shù)據(jù)傳輸?shù)葍?yōu)化策略。以目前在業(yè)界被廣泛應(yīng)用的YOLOv2 目標(biāo)檢測(cè)算法[1]為例,來(lái)介紹將CNN模型映射到FPGA上的完整流程。在Zedboard 上獲得了30.15 GOP/s 的性能,與Xeon E5-2620 v4 CPU 相比,能效是其120.4倍,性能是其7.3倍;與雙核ARM-A9 CPU相比,能效是其86 倍,性能是其112.9 倍。同時(shí),在性能上也超過(guò)現(xiàn)有的工作。
本文的貢獻(xiàn)如下:
(1)設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)加速器,給出將YOLOv2模型映射到FPGA上的完整流程,對(duì)加速器的性能和所需資源進(jìn)行深入分析和建模,將實(shí)際傳輸延時(shí)考慮在內(nèi),極大地縮小了加速器理論與實(shí)際時(shí)延的誤差。代碼已在github 開(kāi)源(https://github.com/dhm2013724/yolov2_xilinx_fpga)。
(2)改進(jìn)了基于FPGA 的SIMD 二維展開(kāi)的卷積神經(jīng)網(wǎng)絡(luò)加速器架構(gòu)中的輸入和輸出模塊,使得傳輸像素塊能夠以較大的突發(fā)長(zhǎng)度進(jìn)行傳輸,有效提高了總線帶寬的實(shí)際利用率。
本章主要介紹YOLOv2 模型涉及到的相關(guān)概念、突發(fā)傳輸以及卷積計(jì)算的優(yōu)化策略。
YOLOv2 一共包含4 種類(lèi)型的層:卷積層、池化層、路由層和重排序?qū)?。其中,卷積層起到特征提取的作用,池化層用于像素抽樣,路由層用于多層次的特征融合,重排序?qū)佑糜谔卣鞯某闃又嘏?。在?xùn)練時(shí)常用批量歸一化來(lái)加速訓(xùn)練收斂[17],通過(guò)激活函數(shù)給網(wǎng)絡(luò)增加非線性擬合能力。批歸一化和激活函數(shù)一般都跟在卷積層后。
(1)卷積層(convolutional layer)
對(duì)多張輸入特征圖以對(duì)應(yīng)卷積核進(jìn)行卷積來(lái)實(shí)現(xiàn)特征提取,偽代碼如下所示:
其中R、C、M、N、K、S分別代表輸出特征圖高度、輸出特征圖寬度、輸出特征圖數(shù)、輸入特征圖數(shù)、卷積核大小和步長(zhǎng)。pixelL(m,r,c)代表輸出特征圖m中r行c列的像素。全連接層可看作K=1,S=1 的特殊卷積層。
(2)池化層(pool layer)
對(duì)輸入特征圖降采樣,以降低特征圖的規(guī)模,同時(shí)也具有保持某種不變性(旋轉(zhuǎn)、平移、伸縮等)的功能,一般跟在卷積層后。最大池化層偽代碼如下所示:
其中,Max 表示在K×K的鄰域中返回最大像素,其他參數(shù)含義與卷積層類(lèi)似。
(3)路由層(route layer)
將多層的輸出特征圖級(jí)聯(lián),作為下一層的輸入特征圖,實(shí)質(zhì)是將多維度的特征信息簡(jiǎn)單融合。
(4)重排序?qū)樱╮eorganization layer)
將給定的大尺度輸入特征圖在鄰域內(nèi)按位置抽樣,同位置像素形成子圖,如圖1所示。
Fig.1 Reorganization with stride of 2圖1 步長(zhǎng)S為2時(shí)的重排序過(guò)程
若步長(zhǎng)S=2,則一張W×H的輸入特征圖在2×2的鄰域內(nèi)按位置抽樣,最終輸出4張W/2×H/2 的子圖。
(5)批歸一化(batch normalization,BN)
深度學(xué)習(xí)常通過(guò)批歸一化加快訓(xùn)練收斂[17]。如果某卷積層在訓(xùn)練階段使用了批量歸一化,那么在推斷階段,該層的每個(gè)輸出特征圖像素都需要經(jīng)過(guò)以下映射:
其中,bn0、bn1、sc0、sc1在訓(xùn)練完成后為常數(shù)??梢詫⑹剑?)與式(2)合并,得到:
由于BN 一般跟在卷積計(jì)算后,激活函數(shù)前,并且由式(3)可知,BN實(shí)際是做一個(gè)線性變換,因此可以將其與對(duì)應(yīng)的卷積計(jì)算融合,得到新的卷積核權(quán)重和偏置參數(shù),公式如下所示:
其中,Am和Bm為針對(duì)不同輸出特征圖m的相應(yīng)常數(shù)。本文之后的權(quán)重和偏置參數(shù)默認(rèn)都已經(jīng)過(guò)融合。
(6)激活函數(shù)
激活函數(shù)對(duì)每個(gè)輸出特征圖像素做一個(gè)非線性變換,主要用于給網(wǎng)絡(luò)增加非線性擬合的能力,一般位于批歸一化后。YOLOv2 中用到的激活函數(shù)是
實(shí)際讀寫(xiě)DRAM(dynamic random access memory)的帶寬往往與突發(fā)傳輸長(zhǎng)度、數(shù)據(jù)位寬和時(shí)鐘頻率有關(guān)[13]。當(dāng)數(shù)據(jù)位寬和時(shí)鐘頻率保持不變時(shí),傳輸同樣長(zhǎng)度的連續(xù)數(shù)據(jù),突發(fā)傳輸長(zhǎng)度越長(zhǎng),傳輸時(shí)延越小。如圖2所示。
Fig.2 Effective bandwidth for 64 MB transmission圖2 傳輸連續(xù)64 MB的有效帶寬
在Xilinx 的Zedboard 開(kāi)發(fā)板上測(cè)試32 位AXI4 Master 接口在不同突發(fā)傳輸長(zhǎng)度下,向DRAM 寫(xiě)入連續(xù)的64 MB數(shù)據(jù)測(cè)得的實(shí)際帶寬??v軸是實(shí)測(cè)帶寬(單位:MB/s),橫軸是突發(fā)傳輸長(zhǎng)度,從1 至256。100 MHz 工作頻率下,在突發(fā)長(zhǎng)度為256 時(shí),能夠得到最大有效帶寬332 MB/s,此時(shí)的帶寬效率為332/400 ≈83%。150 MHz 工作頻率下,在突發(fā)長(zhǎng)度為256 時(shí),能夠得到最大有效帶寬489 MB/s,此時(shí)的帶寬效率為489/600 ≈81%。
在已測(cè)得實(shí)際對(duì)應(yīng)不同突發(fā)傳輸長(zhǎng)度的有效帶寬的前提下,根據(jù)算法1,對(duì)讀寫(xiě)DRAM 的時(shí)延進(jìn)行仿真。
算法1讀寫(xiě)DRAM時(shí)延仿真
輸入:(1)連續(xù)傳輸32 位數(shù)據(jù)長(zhǎng)度Length(32 bit);(2)最大突發(fā)長(zhǎng)度BurstLengthmax(1~256);(3)對(duì)應(yīng)1~256突發(fā)長(zhǎng)度的有效帶寬數(shù)組Bandwidth[256](MB/s)。
輸出:時(shí)延Latency(s)。
初始化時(shí)延Latency=0.0
計(jì)算以最大突發(fā)長(zhǎng)度傳輸?shù)拇螖?shù)Nummax∶
計(jì)算剩余項(xiàng)的突發(fā)長(zhǎng)度BurstLengthRm:
BurstLengthRm=Length%BurstLengthmax
計(jì)算以最大傳輸長(zhǎng)度傳輸?shù)膫鬏敃r(shí)延:
若剩余項(xiàng)不為0,計(jì)算剩余項(xiàng)的傳輸時(shí)延:
否則,LatencyRm=0
Latency=Latencymax+LatencyRm
下文以MM(Length,BurstLengthmax)來(lái)表示在最大突發(fā)長(zhǎng)度為BurstLengthmax的前提下,傳輸連續(xù)Length個(gè)32位數(shù)據(jù)的傳輸時(shí)延。
大多數(shù)卷積神經(jīng)網(wǎng)絡(luò)中,卷積層占90%以上的計(jì)算量,而全連接層占據(jù)90%以上的參數(shù)量[8]。由于全連接層也可看作特殊的卷積層,因此針對(duì)CNN 計(jì)算和帶寬瓶頸的優(yōu)化主要是對(duì)卷積層加速策略的研究,一般分為展開(kāi)和分塊兩種[10]。
(1)展開(kāi)(unroll)
在不考慮訪存時(shí)延的前提下,如果計(jì)算單元無(wú)法快速地計(jì)算所給數(shù)據(jù),那么計(jì)算將成為瓶頸。當(dāng)前的大部分研究通過(guò)對(duì)卷積循環(huán)中的多維度展開(kāi),設(shè)計(jì)多個(gè)并行乘法和加法計(jì)算單元來(lái)提高計(jì)算能力[7-14]。本文對(duì)輸出特征圖數(shù)M和輸入特征圖數(shù)N兩維進(jìn)行部分展開(kāi),形成Tm×Tn個(gè)并行乘法單元和Tm個(gè)lbTn深度的加法樹(shù),并行流水地計(jì)算卷積中的乘法和加法。其中,Tm為輸出特征圖數(shù)M維度的并行度/展開(kāi)度,Tn為輸入特征圖數(shù)N維度的并行度。
(2)分塊(tile)
由于FPGA的片上存儲(chǔ)資源相對(duì)于CNN計(jì)算所需的存儲(chǔ)空間來(lái)說(shuō)是極其不足的(一般小于10 MB),因此當(dāng)前大部分研究主要利用卷積計(jì)算的數(shù)據(jù)局部性,對(duì)卷積循環(huán)進(jìn)行多維劃分,使得在進(jìn)行卷積計(jì)算時(shí),多次復(fù)用片上數(shù)據(jù)。從而,某些數(shù)據(jù)只需要從片外存儲(chǔ)中讀取或?qū)懭肷倭看螖?shù),極大地降低了訪存次數(shù)和訪存數(shù)據(jù)量,使得訪存不至于成為CNN 加速的瓶頸。
本文加速器設(shè)計(jì)所對(duì)應(yīng)的卷積層分塊與展開(kāi)策略的偽代碼如下所示:
其中I、O、W分別代表輸入特征圖、輸出特征圖和卷積核參數(shù),一般存放于片外存儲(chǔ)DRAM中。Ibuf、Obuf、Wbuf分別代表在FPGA加速器上設(shè)計(jì)的片上輸入緩存、輸出緩存和參數(shù)緩存。偏置參數(shù)由于數(shù)據(jù)量較少,在進(jìn)行卷積計(jì)算前可以全部讀取到片上存儲(chǔ)bias中。
每次從片外DRAM 讀取Tn張輸入特征圖的((Tr-1)×S+K)×((Tc-1)×S+K)大小的像素塊以及對(duì)應(yīng)的Tm×Tn×K2大小的權(quán)重參數(shù),復(fù)用片上輸入特征圖像素塊和權(quán)重參數(shù),將中間結(jié)果保留在片上緩存中,只有得到最終的輸出像素塊后,向片外寫(xiě)出Tm張輸出特征圖的Tr×Tc大小的像素塊。
本章主要描述從CNN模型到FPGA加速的完整流程,如圖3所示。
Fig.3 Flow chart from CNN model to FPGA acceleration圖3 從CNN模型到FPGA加速的流程圖
(1)模型分析與任務(wù)劃分:首先,需要對(duì)模型進(jìn)行深入分析,理解模型算法的原理和數(shù)據(jù)流。其次,根據(jù)模型在不同階段所做的運(yùn)算,考慮FPGA和CPU的特點(diǎn),將任務(wù)劃分給FPGA和CPU。CPU適合做控制性、串行、計(jì)算量較少的任務(wù),而FPGA適合做并行度高、計(jì)算密集型的任務(wù)。
(2)針對(duì)分配到FPGA 上的任務(wù):通過(guò)量化可以降低計(jì)算復(fù)雜度,減少計(jì)算單元所耗費(fèi)的資源,從而設(shè)計(jì)出更多的并行計(jì)算單元,提高加速器性能。此外,需要設(shè)計(jì)對(duì)應(yīng)的加速器模塊來(lái)加速各層的處理,加速器的優(yōu)化策略包括參數(shù)重排序、雙緩沖設(shè)計(jì)和多通道數(shù)據(jù)傳輸?shù)取?/p>
(3)針對(duì)分配到CPU上的任務(wù):可利用CPU的浮點(diǎn)運(yùn)算單元加快浮點(diǎn)計(jì)算。同時(shí),在編譯時(shí)可采用編譯優(yōu)化加速任務(wù)處理。此外,還有諸如多線程并行、cache緩存優(yōu)化等優(yōu)化策略。基于CPU的性能優(yōu)化已非常成熟,這里不再詳細(xì)敘述。
3.1.1 模型分析
通過(guò)對(duì)文獻(xiàn)[1]及YOLOv2源碼分析可知,YOLOv2的目標(biāo)檢測(cè)步驟如下:
(1)圖像預(yù)處理:輸入任意分辨率的RGB 圖片,除以256轉(zhuǎn)化到[0,1]區(qū)間,按原圖長(zhǎng)寬比調(diào)整到416×416大小,不足處填充0.5。
(2)網(wǎng)絡(luò)檢測(cè):輸入預(yù)處理得到的416×416×3 的圖像數(shù)組,經(jīng)YOLOv2網(wǎng)絡(luò)檢測(cè)后,輸出包含檢測(cè)目標(biāo)信息的13×13×425大小的數(shù)組。
(3)圖像后處理:對(duì)輸出的13×13×425 數(shù)組進(jìn)行處理,得到檢測(cè)邊框的中心、長(zhǎng)寬、邊框可信度和物體的預(yù)測(cè)概率等,根據(jù)原圖長(zhǎng)寬比,將得到的邊框調(diào)整到原圖尺度,完成檢測(cè)。
3.1.2 任務(wù)劃分
由于圖像預(yù)處理和后處理部分計(jì)算量不大且在圖像處理總延時(shí)中占比極少,同時(shí)考慮到后處理涉及指數(shù)計(jì)算,而FPGA實(shí)現(xiàn)指數(shù)擬合的資源耗費(fèi)較大,因此將圖像的預(yù)處理和后處理部分放在CPU端處理。
YOLOv2 網(wǎng)絡(luò)中一共涉及4 類(lèi)層:卷積層、池化層、路由層和重排序?qū)?。卷積層占據(jù)模型的大部分計(jì)算量,已有的研究表明使用FPGA加速卷積運(yùn)算是非常有效的[7-14]。最大池化與卷積類(lèi)似,只是缺少輸入特征圖數(shù)維度,并使用比較運(yùn)算代替乘加運(yùn)算。因此,將卷積層和池化層的處理放在FPGA端[18]。路由層可通過(guò)預(yù)先設(shè)置內(nèi)存偏移地址來(lái)實(shí)現(xiàn)。重排序?qū)拥某闃又嘏排cDMA(direct memory access)類(lèi)似,但與傳統(tǒng)DMA不同,因此也在FPGA端處理。
CNN 對(duì)于數(shù)據(jù)精度有很強(qiáng)的魯棒性,在保持準(zhǔn)確度不變的前提下,可以通過(guò)降低數(shù)據(jù)位寬來(lái)減少計(jì)算耗費(fèi)的資源[7]。并且,隨著數(shù)據(jù)位寬降低,傳輸數(shù)據(jù)量也隨之降低。本文采用與文獻(xiàn)[8]和文獻(xiàn)[19]類(lèi)似的流程對(duì)權(quán)重參數(shù)和輸入輸出特征圖進(jìn)行動(dòng)態(tài)定點(diǎn)16位量化。
定點(diǎn)數(shù)xfixed可由以下公式表示:
其中,bw表示定點(diǎn)數(shù)的位寬,exp表示階碼,Bi∈{0,1}。定點(diǎn)數(shù)xfixed采用補(bǔ)碼表示,最高位為符號(hào)位。
浮點(diǎn)數(shù)xfloat與定點(diǎn)數(shù)xfixed的相互轉(zhuǎn)化如下:
由于定點(diǎn)數(shù)位寬有限且階碼固定,因此將浮點(diǎn)數(shù)xfloat轉(zhuǎn)換為定點(diǎn)數(shù)xfixed,再轉(zhuǎn)換回新浮點(diǎn)數(shù)x′float后,可能會(huì)有精度誤差。
動(dòng)態(tài)定點(diǎn)數(shù)據(jù)量化由3步組成:
(1)權(quán)重參數(shù)量化
首先,找到每層的權(quán)重最優(yōu)階碼expw:
其中,Wfloat表示某層的任意權(quán)重參數(shù)原始浮點(diǎn)值,W(bw,expw)表示在給定位寬bw和階碼expw下將Wfloat定點(diǎn)化后轉(zhuǎn)換回浮點(diǎn)的新浮點(diǎn)數(shù)W′float。通過(guò)式(10),希望找到最優(yōu)階碼expw使得原始權(quán)重與定點(diǎn)化后的權(quán)重絕對(duì)誤差和最小。偏置參數(shù)的量化與其類(lèi)似,在此不過(guò)多敘述。
(2)輸入輸出特征圖量化
按網(wǎng)絡(luò)的前向順序?qū)斎胼敵鎏卣鲌D進(jìn)行量化,使每一層的輸出特征圖像素有共同的階碼expout。階碼expout滿(mǎn)足以下公式:
其中,Pxfloat表示某層的原輸出特征圖浮點(diǎn)像素值,Out(bw,expo)表示給定位寬bw和階碼expo下定點(diǎn)化后轉(zhuǎn)換回浮點(diǎn)的浮點(diǎn)數(shù)Px′float。其余與權(quán)重參數(shù)量化類(lèi)似。此外,由于在預(yù)處理時(shí)將RGB 像素值轉(zhuǎn)化到[0,1]區(qū)間,因此當(dāng)位寬bw為16時(shí),可將第一層的輸入特征圖階碼定為14。
(3)中間結(jié)果量化
雖然前兩步已將權(quán)重和輸入輸出特征圖定點(diǎn)化,但在處理時(shí)還是先轉(zhuǎn)換成浮點(diǎn)進(jìn)行計(jì)算,并且中間結(jié)果以浮點(diǎn)存儲(chǔ)。
通過(guò)量化中間結(jié)果可以用定點(diǎn)數(shù)的乘加和移位來(lái)擬合浮點(diǎn)乘加運(yùn)算,使得推斷過(guò)程除預(yù)處理和后處理階段外,在FPGA 端都以定點(diǎn)數(shù)進(jìn)行計(jì)算和傳輸。中間結(jié)果階碼expinter滿(mǎn)足以下公式:
另外,使用動(dòng)態(tài)定點(diǎn)量化時(shí),激活函數(shù)Leaky ReLU 也要進(jìn)行相應(yīng)的量化操作。當(dāng)位寬bw為16時(shí),使用與0xccc相乘和右移15位的定點(diǎn)運(yùn)算擬合與0.1相乘的操作。量化后的公式如下所示:
除路由層外,其他層都是將上一層的輸出作為當(dāng)前層的輸入,輸出結(jié)果作為下一層的輸入,串行順序處理。如圖4(a)所示,將路由層的功能通過(guò)預(yù)先設(shè)置存取地址偏移實(shí)現(xiàn)后,F(xiàn)PGA加速器只需根據(jù)相關(guān)參數(shù)讀取內(nèi)存數(shù)據(jù)、處理數(shù)據(jù)和將數(shù)據(jù)寫(xiě)回內(nèi)存即可。
如圖4(b)所示,每次讀取或?qū)懭攵鄩K數(shù)據(jù),對(duì)FPGA片上緩存的數(shù)據(jù)塊復(fù)用結(jié)束后,再進(jìn)行下一次讀取,保證每塊數(shù)據(jù)只從片外讀取少量次數(shù)以減少訪存次數(shù)和傳輸數(shù)據(jù)量。
對(duì)于每次取到的分塊數(shù)據(jù),根據(jù)圖4(c)的控制流處理:將從片外讀取到的數(shù)據(jù)發(fā)送到片上緩存,根據(jù)層的類(lèi)別交由CONV、POOL、REORG 模塊進(jìn)行處理。處理后的數(shù)據(jù)寫(xiě)回輸出緩沖,待得到最終結(jié)果后寫(xiě)回片外。
加速器總體架構(gòu)如圖5所示,加速器對(duì)外有多個(gè)AXI master 接口和一個(gè)AXILite slave 接口。通過(guò)AXILite slave接口讀寫(xiě)控制、數(shù)據(jù)和狀態(tài)寄存器。多個(gè)AXI master 接口并發(fā)讀取輸入特征圖和寫(xiě)回輸出特征圖,一個(gè)獨(dú)立的AXI master接口負(fù)責(zé)讀取每層權(quán)重參數(shù)。
Data scatter模塊生成對(duì)應(yīng)寫(xiě)入地址,并將從片外讀到的輸入特征圖像素塊分發(fā)到片上緩存。Data gather生成寫(xiě)回地址,將輸出緩存中的輸出特征圖像素塊寫(xiě)回片外。
紅色處理模塊分別負(fù)責(zé)卷積層(CONV 和Leaky ReLU)、最大池化層(POOL)及重排序?qū)樱≧EORG)的處理。用于讀寫(xiě)特征圖的AXI master 接口數(shù)由以下公式?jīng)Q定:
Fig.4 Execution schedule圖4 執(zhí)行調(diào)度流
Fig.5 Accelerator overall architecture圖5 加速器總體架構(gòu)
其中,NCin表示并發(fā)讀取特征圖的AXI master 接口數(shù),NCout表示并發(fā)寫(xiě)回DRAM 的AXI master 接口數(shù)。由于AXI4協(xié)議本身讀寫(xiě)通道獨(dú)立,讀寫(xiě)操作并發(fā),因此實(shí)際用于數(shù)據(jù)傳輸?shù)腁XI master接口數(shù)由并發(fā)通道多的一側(cè)決定。再加上用于權(quán)重讀取的接口,實(shí)際AXI master接口數(shù)NAXIM=NChannel+1。
另一方面,HLS 生成的AXI4 master 接口模塊內(nèi)部讀寫(xiě)通道都擁有類(lèi)似DMA的硬件結(jié)構(gòu),可以看作(NCin+NCout+1)個(gè)獨(dú)立的DMA并發(fā)訪存。
3.3.1 輸入輸出模塊
由于AXI4 master 接口讀寫(xiě)通道獨(dú)立,因此讀寫(xiě)操作可以并發(fā)執(zhí)行。通過(guò)讀通道從DRAM 讀取數(shù)據(jù),由數(shù)據(jù)分發(fā)(data scatter)模塊控制多個(gè)讀通道的DMA 完成輸入特征圖像素塊的讀取,并將讀取的數(shù)據(jù)塊分發(fā)到對(duì)應(yīng)輸入緩存;由數(shù)據(jù)收集(data gather)模塊將輸出緩存中的像素塊寫(xiě)回DRAM,控制多個(gè)寫(xiě)通道的DMA完成輸出特征圖像素塊的寫(xiě)入,如圖6所示。
圖6(a)中的TRow和TCol由輸出特征圖像素塊的寬度Tr和高度Tc、卷積核大小K和步長(zhǎng)S決定,公式如下:
如圖6(a)所示,數(shù)據(jù)分發(fā)模塊從內(nèi)存順序讀取Tn張TRow×TCol大小的輸入特征圖像素塊,每個(gè)像素塊按行優(yōu)先順序讀取并分發(fā)到Tn個(gè)獨(dú)立的片上輸入緩存。與此類(lèi)似,圖6(b)中的數(shù)據(jù)收集模塊從Tm個(gè)獨(dú)立的片上輸出緩存中順序讀取Tr×Tc大小的像素塊寫(xiě)回片外。
Fig.6 Single channel data transmission圖6 單通道數(shù)據(jù)傳輸
為了減少數(shù)據(jù)的傳輸時(shí)延,在數(shù)據(jù)分發(fā)和收集模塊中還添加了額外的行緩沖,并且進(jìn)行了雙緩沖設(shè)計(jì)。輸入輸出模塊的雙緩沖時(shí)序如圖7所示。
(1)對(duì)于數(shù)據(jù)分發(fā)模塊從片外DRAM 讀取輸入特征圖像素塊到片上緩存的過(guò)程
如圖7(a)所示,數(shù)據(jù)分發(fā)模塊的雙緩沖的設(shè)計(jì)使得訪存地址、片上緩存偏移的計(jì)算、將輸入特征圖像素塊從DRAM讀取到行緩沖的時(shí)延和像素從行緩沖寫(xiě)入輸入緩存的時(shí)延重疊,減少數(shù)據(jù)的傳輸時(shí)延。
輸入行緩沖所需的存儲(chǔ)資源NLoadLineBRAM為:
其中,行緩沖大小LineBufferSizeLoad滿(mǎn)足:
ConeBRAM表示單塊BRAM(block RAM)的存儲(chǔ)能力(典型值為18 Kb),Bitwidth表示當(dāng)前的數(shù)據(jù)寬度,Tcmax表示各層的最大Tc值,Smax和Kmax以此類(lèi)推。NCin表示多通道并發(fā)輸入數(shù),此處無(wú)多通道數(shù)據(jù)傳輸情況下為1。
根據(jù)片上緩存和特征圖的寬度盡可能長(zhǎng)地連續(xù)傳輸數(shù)據(jù),提高帶寬效率。行緩沖每次傳輸?shù)妮斎胩卣鲌D行數(shù)NTRowOneLine如下所示:
Fig.7 Timing graph for double buffered design圖7 雙緩沖設(shè)計(jì)時(shí)序圖
只有當(dāng)讀取的輸入特征圖的寬度小于TCol時(shí),每次行緩沖才會(huì)讀取連續(xù)的多行像素。
①訪存地址、片上緩存偏移的計(jì)算、將輸入特征圖像素塊從DRAM 讀取到行緩沖的時(shí)延LatencyLoad1公式如下:
其中,Const為模塊相關(guān)常數(shù)(流水線初始化時(shí)鐘等),F(xiàn)req為加速器工作的時(shí)鐘頻率,BitwidthInterface為AXI Master 接口數(shù)據(jù)位寬,BurstLengthmax為設(shè)置的最大突發(fā)長(zhǎng)度。
②將行緩沖中的像素寫(xiě)入輸入緩存的時(shí)延LatencyLoad2如下:
上述兩個(gè)處理過(guò)程雙緩沖的循環(huán)次數(shù)InputPing-PongLoops(IPPL)如下所示:
使用雙緩沖設(shè)計(jì)后,輸入特征圖讀取時(shí)延LatencyLoadIFM為:
(2)對(duì)于數(shù)據(jù)接收模塊從片上輸出緩存寫(xiě)出像素塊到片外DRAM的過(guò)程
如圖7(b)所示,數(shù)據(jù)接收模塊將訪存地址、片上緩存偏移的計(jì)算、像素從輸出緩存搬移到行緩沖的時(shí)延和將行緩沖中的像素寫(xiě)回內(nèi)存的時(shí)延重疊。
輸出行緩沖所需存儲(chǔ)資源NStoreLineBRAM為:
NCout表示多通道并發(fā)輸出數(shù),此處為1。輸出行緩沖大小LineBufferSizeStore滿(mǎn)足以下約束:
行緩沖每次傳輸?shù)妮敵鎏卣鲌D行數(shù)NTrOneLine如下所示:
①訪存地址、片上緩存偏移的計(jì)算、從輸出緩存搬移到行緩沖的時(shí)延LatencyStore1如下所示:
②將行緩沖中的像素寫(xiě)回內(nèi)存的時(shí)延LatencyStore2如下所示:
上述兩個(gè)處理過(guò)程雙緩沖的循環(huán)次數(shù)Output-PingPongLoops(OPPL)如下:
使用雙緩沖設(shè)計(jì)后,輸出時(shí)延LatencyStore為:
3.3.2 卷積模塊
對(duì)卷積循環(huán)中輸出特征圖數(shù)M和輸入特征圖數(shù)N兩維部分展開(kāi),形成Tm×Tn個(gè)并行乘法計(jì)算單元和Tm個(gè)lbTn深度的加法樹(shù),流水地處理乘加運(yùn)算[20]。其中,Tm為輸出并行度,Tn為輸入并行度。以Tm=2,Tn=4為例,如圖8所示。
Fig.8 Convolution module(Tm=2,Tn=4)圖8 卷積模塊(Tm=2,Tn=4)
充滿(mǎn)流水線后,每個(gè)時(shí)鐘周期卷積模塊從對(duì)應(yīng)的Tn個(gè)獨(dú)立輸入特征圖緩存中讀入Tn個(gè)相同位置的像素,與此同時(shí)從Tm×Tn個(gè)獨(dú)立的卷積核緩存中讀入相同位置的權(quán)重,Tm×Tn個(gè)并行乘法單元復(fù)用Tn個(gè)輸入像素進(jìn)行乘法計(jì)算。Tm個(gè)加法樹(shù)將乘積兩兩相加,得到的結(jié)果和部分和累加后,寫(xiě)回對(duì)應(yīng)輸出緩存或局部寄存器中。
卷積模塊對(duì)應(yīng)的計(jì)算時(shí)延LatencyCompute:
卷積模塊的資源大部分用于乘法器和加法器的設(shè)計(jì)。單一乘法器和加法器的資源耗費(fèi)與數(shù)據(jù)精度息息相關(guān)。由文獻(xiàn)[7]和實(shí)際評(píng)估可知,乘法器和加法器主要耗費(fèi)DSP(digital signal processing)和LUT(look-up table)資源。不同精度下,乘法器和加法器的資源耗費(fèi)如表1所示。
Table 1 Resource consumption comparison表1 資源耗費(fèi)比較
浮點(diǎn)32 位精度時(shí),設(shè)計(jì)單個(gè)乘法器和加法器的DSP 和LUT 的耗費(fèi)較大。與浮點(diǎn)32 位時(shí)相比,定點(diǎn)16位精度的加法器只耗費(fèi)少量LUT,不耗費(fèi)DSP;乘法器和移位電路耗費(fèi)的資源也大大降低。因此,在保證數(shù)據(jù)精度的前提下,定點(diǎn)計(jì)算具有較大的優(yōu)勢(shì)。
在輸出并行度為T(mén)m,輸入并行度為T(mén)n的條件下,卷積模塊的主要DSP 資源耗費(fèi)NDSP和LUT 資源耗費(fèi)NLUT如下:
其中,CostMul和CostAdd分別對(duì)應(yīng)不同精度下,乘法器和加法器的對(duì)應(yīng)資源耗費(fèi)。CostSelect對(duì)應(yīng)圖8 中的2選1選擇電路和累加器的LUT耗費(fèi),本設(shè)計(jì)中典型值為8。
3.3.3 池化模塊
YOLOv2 中的池化層都為K=S=2 的最大池化層。對(duì)單一輸入特征圖,以2×2 大小且步長(zhǎng)S=2 的窗口滑動(dòng),取其中的最大像素作為輸出。最大池化操作與卷積操作類(lèi)似,不同之處在于:(1)只需要對(duì)單一輸入特征圖進(jìn)行抽樣;(2)運(yùn)算單元不是乘法器和加法器,而是比較器。硬件結(jié)構(gòu)如圖9所示。
充滿(mǎn)流水線后,每個(gè)時(shí)鐘周期,池化模塊從Tpool個(gè)獨(dú)立的輸入特征圖緩存中讀取相同位置的像素與當(dāng)前最大值比較,同時(shí)有Tpool個(gè)比較器在進(jìn)行不同輸入特征圖的比較運(yùn)算。比較K2次后,將得到的最大值寫(xiě)入輸出緩存中。由于在加速器整體架構(gòu)中(圖5),各層共用輸入和輸出模塊,池化模塊的并行度Tpool≤min(Tnmax,Tmmax)。
池化模塊的計(jì)算時(shí)延LatencyCompute:
Fig.9 Pooling module圖9 池化模塊
池化模塊主要耗費(fèi)LUT 資源用于多路選擇器、比較器和寄存器的設(shè)計(jì)??紤]到其所耗費(fèi)資源較少,這里不再過(guò)多說(shuō)明。
3.3.4 重排序模塊
重排序?qū)拥奶幚磉^(guò)程與最大池化層類(lèi)似,都是對(duì)單一輸入特征圖的像素進(jìn)行抽樣。不同之處在于,最大池化層輸出K×K鄰域內(nèi)的最大像素到單一輸出特征圖,而重排序?qū)訉×K鄰域內(nèi)的輸入像素輸出到K×K張的輸出特征圖相同位置。因此,針對(duì)YOLOv2中K=S=2 的重排序?qū)?,重排序模塊只使用1 塊輸入緩存和4 塊輸出緩存,并設(shè)計(jì)一個(gè)4 路選擇器,每次從輸入緩存讀取1 個(gè)像素寫(xiě)入對(duì)應(yīng)的輸出緩存。
重排序模塊的處理時(shí)延LatencyCompute如下:
3.4.1 參數(shù)重排序
參數(shù)重排序,將卷積層所需參數(shù)預(yù)先重排,使得每次傳輸?shù)膮?shù)在DRAM 中連續(xù)存儲(chǔ),可以以較大的突發(fā)長(zhǎng)度進(jìn)行傳輸,有效提高了帶寬的利用效率[13]。
對(duì)于權(quán)重參數(shù),由于只跟當(dāng)前層相關(guān),因此根據(jù)當(dāng)前層的塊劃分(這里指各層的Tn和Tm)對(duì)各層權(quán)重預(yù)先進(jìn)行重排序,以減少訪存次數(shù)和增大突發(fā)長(zhǎng)度。以Layer 0為例,如圖10所示。
Fig.10 Weight arrangement in DRAM圖10 在DRAM中的參數(shù)排序
第0 層的核權(quán)重為32×3×3×3(M×N×K×K)也可看作32×3×9(M×N×K2),其中M=32,N=3,K=3。如圖10(a)所示,原始參數(shù)在內(nèi)存中按行優(yōu)先順序存儲(chǔ)。如果將卷積循環(huán)按Tm=16 和Tn=1劃分,那么需要按箭頭順序從DRAM 中讀取16×1×9 大小的參數(shù)6次。但由于參數(shù)不連續(xù),共需訪存32×3=96 次,每次的突發(fā)長(zhǎng)度為9。
如圖10(b)所示,參數(shù)重排序后,由于讀取參數(shù)連續(xù)存放,只需訪存6 次,每次突發(fā)長(zhǎng)度為16×9=144。增大突發(fā)長(zhǎng)度并且減少大量的訪存次數(shù),使得有效帶寬大大增加。
參數(shù)讀取模塊與輸入模塊類(lèi)似,也添加了行緩沖并進(jìn)行雙緩沖設(shè)計(jì)。不同排序下的參數(shù)讀取模塊的傳輸次數(shù)NumTrans和連續(xù)傳輸?shù)膮?shù)長(zhǎng)度LengthTrans,如下所示:
其中,Normal 表示不使用參數(shù)重排時(shí),從DRAM 讀取Tm次Tn×K×K個(gè)連續(xù)參數(shù);而Rearrangement 表示經(jīng)過(guò)參數(shù)重排序后,從DRAM讀取K×K次Tm×Tn個(gè)連續(xù)參數(shù)。
行緩沖所需的存儲(chǔ)資源為:
每次從DRAM 讀取連續(xù)LengthTrans個(gè)權(quán)重參數(shù)到行緩沖中的時(shí)延如下:
將行緩沖中的LengthTrans個(gè)參數(shù)寫(xiě)入片上參數(shù)緩存中的時(shí)延:
從DRAM讀取NumTrans次LengthTrans個(gè)連續(xù)參數(shù)的讀取時(shí)延LatencyLoadW:
3.4.2 乒乓緩沖
通過(guò)乒乓緩沖的設(shè)計(jì),將從片外DRAM 讀取數(shù)據(jù)的時(shí)延LatencyLoad、在片上數(shù)據(jù)處理的時(shí)延LatencyCompute和將處理完的數(shù)據(jù)寫(xiě)回片外DRAM的時(shí)延LatencyStore重疊,減少總時(shí)延[7-8]。
由于讀取權(quán)重和輸入特征圖像素塊的過(guò)程可以并發(fā)執(zhí)行,從片外DRAM讀取數(shù)據(jù)的時(shí)延LatencyLoad由權(quán)重讀取時(shí)延LatencyLoad和輸入特征圖讀取時(shí)延LatencyLoadIFM中較大的一項(xiàng)決定:
沒(méi)有權(quán)重參數(shù)的最大池化層和重排序?qū)覮atencyLoadW為0。
如式(9)可知,卷積由六維乘加循環(huán)組成,與池化和重排序?qū)硬煌?,包括?duì)輸入特征圖數(shù)維度N的遍歷。故不使用乒乓時(shí),卷積層各部分時(shí)延不重疊,輸入特征圖數(shù)維度N的內(nèi)層循環(huán)需重復(fù)N/Tn次讀取和計(jì)算操作,才能輸出最終結(jié)果。此時(shí),內(nèi)層循環(huán)的時(shí)延LatencyInner:
卷積層處理的總時(shí)延Latency為:
若使用乒乓緩沖,則讀取時(shí)延LatencyLoad和卷積計(jì)算時(shí)延LatencyCompute重疊,讀取和計(jì)算操作經(jīng)(N/Tn+1)次循環(huán)后輸出最終結(jié)果,此時(shí)內(nèi)層循環(huán)時(shí)延LatencyInner為:
與卷積層相比,池化層和重排序?qū)尤鄙佥斎胩卣鲌D數(shù)N維度,故只考慮讀取、數(shù)據(jù)處理和寫(xiě)回三者是否兩兩重疊。不使用乒乓時(shí),三者線性進(jìn)行,在時(shí)間上不重疊,處理總時(shí)延Latency為:
使用乒乓緩沖設(shè)計(jì)后,三者的處理過(guò)程兩兩重疊,此時(shí)處理總時(shí)延Latency為:
使用乒乓時(shí),對(duì)應(yīng)輸入緩存和輸出緩存所耗費(fèi)的BRAM資源數(shù)如下:
其中,BitwidthInter表示中間結(jié)果的數(shù)據(jù)位寬,典型值為32。對(duì)于權(quán)重緩存,數(shù)據(jù)量較小時(shí)使用FF(flipflop)和LUT 資源設(shè)計(jì);數(shù)據(jù)量較大時(shí),使用BRAM資源設(shè)計(jì),BRAM的耗費(fèi)如下:
不使用雙緩沖時(shí),對(duì)應(yīng)BRAM資源耗費(fèi)減半。
3.4.3 多通道數(shù)據(jù)傳輸
3.3.1 節(jié)中的輸入輸出模塊每次順序地讀取或?qū)懭攵嗵卣鲌D的像素塊。考慮到DRAM實(shí)際帶寬大于單接口的總線帶寬,可通過(guò)多通道數(shù)據(jù)傳輸,減少傳輸時(shí)延[11]。如圖11所示。
Fig.11 Multi-channel data transmission圖11 多通道數(shù)據(jù)傳輸
圖11 與圖6 類(lèi)似,但是圖11(a)中數(shù)據(jù)分發(fā)模塊變?yōu)镹Cin個(gè)子輸入模塊,每個(gè)子輸入模塊從DRAM讀取張輸入特征圖的像素塊到片上緩存。圖11(b)中數(shù)據(jù)收集模塊變?yōu)镹Cout個(gè)子輸出模塊,每個(gè)子輸出模塊將張輸出特征圖的像素塊從片上緩存寫(xiě)回到片外。各輸入輸出子模塊間無(wú)依賴(lài)性,并發(fā)地完成數(shù)據(jù)傳輸。此時(shí),在式(20)、式(23)和式(24)中NCin>1,式(24)、式(27)和式(28)中NCout>1。同時(shí),由于讀寫(xiě)通道的增加,式(17)和式(24)中行緩沖占用的BRAM數(shù)目也會(huì)隨之增加。
CNN 模 型:YOLOv2 和YOLOv2-Tiny(416×416),模型對(duì)應(yīng)的數(shù)據(jù)集為COCO數(shù)據(jù)集[21]。
FPGA平臺(tái):Xilinx Zedboard開(kāi)發(fā)板(Dual-coreARMA9+FPGA),其中FPGA 的BRAM_18Kb、DSP48E、FF和LUT資源數(shù)分別為280、220、106 400和53 200。
CPU平臺(tái):服務(wù)器CPU Intel E5-2620 v4(8 cores)工作頻率2.1 GHz,256 GB內(nèi)存。Zedboard上的雙核ARM-A9,時(shí)鐘頻率667 MHz,512 MB內(nèi)存。
使用Vivado HLS 2018.2 HLS 進(jìn)行加速器設(shè)計(jì),Vivado v2018.2 進(jìn)行綜合和布局布線。功耗采用VC470 功耗測(cè)量?jī)x外部測(cè)量板級(jí)系統(tǒng)功耗。對(duì)于E5-2620 v4,采用散熱設(shè)計(jì)功耗(thermal design power,TDP)作為總功耗(實(shí)際功耗大于TDP)。由于Zedboard是ARM+FPGA異構(gòu)SoC平臺(tái),F(xiàn)PGA的計(jì)算功耗通過(guò)計(jì)算時(shí)系統(tǒng)的峰值功耗減去FPGA 復(fù)位后系統(tǒng)的空閑功耗得到。
選擇動(dòng)態(tài)定點(diǎn)16 位精度下的加速器架構(gòu),采用參數(shù)重排序、乒乓緩沖和多通道數(shù)據(jù)傳輸三種優(yōu)化策略,其中Tmmax=32,Tnmax=4,Trmax=26,Tcmax=26,Kmax=3,Smax=2,NCin=4,NCout=2。給定以上硬件設(shè)計(jì)參數(shù)后,實(shí)際加速器設(shè)計(jì)已確定。此時(shí),還需確定各層在當(dāng)前加速器設(shè)計(jì)下對(duì)應(yīng)的Tm、Tn、Tr和Tc。
各層的Tr和Tc由以下公式得出:
其中,OH和OW分別表示輸出特征圖的高度和寬度。通過(guò)式(49)和式(51),可以得出各層輸入和輸出緩存能夠存儲(chǔ)的像素塊的最大寬高。對(duì)于YOLOv2中的池化層和重排序?qū)?,S=K=2。
對(duì)于卷積層,Tm和Tn由以下公式得出:
當(dāng)Tmmax和Tnmax給定后,已確定卷積計(jì)算模塊的設(shè)計(jì)。因此,各卷積層的輸入并行度Tn和輸出并行度Tm不能超過(guò)相應(yīng)最大值。
對(duì)于池化層,Tm和Tn由以下公式得出:
由于各計(jì)算模塊復(fù)用輸入輸出模塊,因此池化層的并行度Tpool≤Tm,實(shí)驗(yàn)中Tpool=Tm。
S=2 的重排序?qū)訉⒁粡堓斎胩卣鲌D抽樣重排為4張輸出特征圖,因此Tn=1,Tm=4。
4.2.1 資源耗費(fèi)評(píng)估
如表2所示,結(jié)合給定參數(shù)和上文中對(duì)各模塊資源耗費(fèi)的公式,將估計(jì)資源耗費(fèi)與實(shí)際資源耗費(fèi)進(jìn)行對(duì)比。
DSP 主要用于卷積模塊中加法器和乘法器的設(shè)計(jì)。根據(jù)式(32),DSP 耗費(fèi)128 個(gè),實(shí)際設(shè)計(jì)中多出的DSP用于其他模塊的設(shè)計(jì)。
BRAM_18Kb主要用于實(shí)現(xiàn)存儲(chǔ)量大的緩存,除上文中所提及的各模塊對(duì)BRAM 的耗費(fèi)外,AXI Master 接口也會(huì)耗費(fèi)BRAM 來(lái)實(shí)現(xiàn)接口緩存(在當(dāng)前設(shè)計(jì)下,耗費(fèi)NAXIM×2=10 BRAM)。偏置參數(shù)的緩存耗費(fèi)額外的兩個(gè)BRAM。此外,根據(jù)式(49)、式(50)、式(17)、式(38)和式(24),加上輸入緩存(3×4×2)、輸出緩存(2×32×2)、片上輸入行緩沖(2)、權(quán)重行緩沖(2)和輸出行緩沖(2×2)所耗費(fèi)的BRAM 資源,共耗費(fèi)BRAM_18Kb 170 個(gè),即85 個(gè)BRAM_36Kb,與實(shí)際BRAM耗費(fèi)接近。
由于單個(gè)權(quán)重緩存的存儲(chǔ)量過(guò)?。↘2×Bitwidth=9×16=144 bit),無(wú)法充分利用BRAM資源。在設(shè)計(jì)時(shí)考慮使用LUT和FF來(lái)實(shí)現(xiàn)權(quán)重緩存(在當(dāng)前設(shè)計(jì)下,單個(gè)權(quán)重緩存耗費(fèi)約43 個(gè)LUT)。因此,當(dāng)前權(quán)重緩存共耗費(fèi)43×Tmmax×Tnmax×2=11 008 個(gè)LUT。由式(33)可知,此時(shí)16 位定點(diǎn)精度的卷積模塊耗費(fèi)19 968 個(gè)LUT。因此,共耗費(fèi)約30 976 個(gè)LUT。剩余LUT用于其他模塊的設(shè)計(jì)。
4.2.2 性能與能效評(píng)估
YOLOv2模型除路由層、圖像的預(yù)處理和后處理外,剩余29層。其中包括23層卷積層、5層池化層和1 層重排序?qū)?。由于篇幅原因,? 僅列出其中部分層的評(píng)估結(jié)果。列中的R(Real)表示該列數(shù)據(jù)為實(shí)測(cè)值,E(Estimated)表示該列數(shù)據(jù)是根據(jù)上文公式得到的估計(jì)值。
以相對(duì)誤差對(duì)時(shí)延模型進(jìn)行評(píng)價(jià),相對(duì)誤差δ公式如下:
即測(cè)量的絕對(duì)誤差與被測(cè)量的真值之比。
以表中最后一行總延時(shí)為例,YOLOv2模型的總時(shí)延誤差約為,總計(jì)算時(shí)延誤差約為0.8%,總輸入時(shí)延誤差約為10.7%,總輸出時(shí)延誤差約為10.4%。雖然本模型的主要誤差仍集中于傳輸時(shí)延部分約為10%,但已遠(yuǎn)小于文獻(xiàn)[8]中的誤差47%。并且加速后卷積層的時(shí)延仍占總時(shí)延的95%(930.560/977.485 ≈95.2%)。
當(dāng)前的工作在性能上也超過(guò)之前的工作,如表4所示。文獻(xiàn)[22]設(shè)計(jì)了一個(gè)7×7的行緩沖,能夠適應(yīng)3×3 和7×7 的卷積核。由于分別設(shè)計(jì)卷積模塊和全連接模塊處理對(duì)應(yīng)層,計(jì)算單元的利用率并不高。雖然工作頻率很高,但性能僅達(dá)到18.82 GOP/s。文獻(xiàn)[23]基于Intel的OpenCL采用通用矩陣乘法對(duì)矩陣分塊,塊間并行乘加的方式加速。然而,此方法需要每次將輸入特征圖和卷積核參數(shù)重排序,增加了預(yù)處理時(shí)延和復(fù)雜度。
如表5所示,與CPU相比,CPU+FPGA的異構(gòu)系統(tǒng)是雙核ARM-A9 能效的86 倍左右,Xeon 的120.4倍。速度是雙核ARM-A9 的112.9 倍,Xeon 的7.3 倍左右。其中,將FPGA 復(fù)位后測(cè)量板級(jí)電源功耗,得到只使用雙核ARM-A9計(jì)算時(shí)的功耗。此時(shí)的功耗較低,但是由于計(jì)算能力弱,使得計(jì)算時(shí)延過(guò)長(zhǎng),能效低。Xeon恰恰與其相反,計(jì)算性能強(qiáng),使得計(jì)算時(shí)延很短,但是由于功耗過(guò)高,導(dǎo)致能效低下。與前兩者不同,使用CPU+FPGA的異構(gòu)系統(tǒng),功耗略高于雙核ARM-A9,但使用FPGA 加速,大幅度提高計(jì)算性能,在計(jì)算時(shí)延和能效上都獲得了不錯(cuò)的表現(xiàn)。
Table 2 FPGA resource consumption表2 FPGA資源耗費(fèi)
Table 3 Actual and estimated delay(partial)表3 實(shí)際與估計(jì)時(shí)延(部分) ms
Table 4 Comparison with other FPGA work表4 與其他的FPGA工作比較
Table 5 Comparison with CPU表5 與CPU的比較
基于Xeon CPU 的評(píng)估由YOLOv2 源碼編譯(-Ofast)后執(zhí)行得到,數(shù)據(jù)精度為float32(同條件下,F(xiàn)ixed16執(zhí)行時(shí)間約為15.78 s)。動(dòng)態(tài)定點(diǎn)16位數(shù)據(jù)量化得到的模型,在準(zhǔn)確度上與原模型接近,COCO數(shù)據(jù)集上mAP(mean average precision)達(dá)到約48.1%。
本文以YOLOv2 目標(biāo)檢測(cè)算法為例,設(shè)計(jì)并實(shí)現(xiàn)了一種在卷積輸入和輸出特征圖數(shù)二維展開(kāi)的SIMD卷積神經(jīng)網(wǎng)絡(luò)加速器架構(gòu),介紹將卷積神經(jīng)網(wǎng)絡(luò)模型映射到FPGA 上的完整流程。對(duì)加速器的性能和所需資源進(jìn)行分析和建模,將實(shí)際傳輸延時(shí)考慮在內(nèi),極大地縮小了加速器理論與實(shí)際時(shí)延的誤差。同時(shí),改進(jìn)了加速器架構(gòu)中的輸入和輸出模塊,有效提高了總線帶寬的利用效率。
未來(lái)進(jìn)一步的改進(jìn)方向主要有4個(gè)方面:
(1)考慮多種數(shù)據(jù)復(fù)用模式,適應(yīng)不同維度“形狀”下的訪存需求,平衡計(jì)算與傳輸時(shí)延;(2)降低數(shù)據(jù)精度;(3)使用Winograd等快速矩陣乘法提高計(jì)算性能;(4)設(shè)計(jì)更細(xì)粒度的加速器或通過(guò)多層融合以減少總時(shí)延。