陳浩敏,姚森敬,席 禹,張 凡,辛文成,王龍海,任 超
(1.南方電網(wǎng)數(shù)字電網(wǎng)研究院有限公司,廣東 廣州 510623;2.天津大學(xué)電氣自動(dòng)化與信息工程學(xué)院,天津 300072)
隨著人工智能浪潮的不斷迭起,各種網(wǎng)絡(luò)模型層出不窮,在圖像分類(lèi)領(lǐng)域有:AlexNet(Alex Network)[1]、VGGNet(Visual Geometry Group Network)[2]、GoogLeNet(Google LeNet)[3]和ResNet(Residual neural Network)[4]等,在目標(biāo)檢測(cè)領(lǐng)域有:RCNN(Regions with CNN features)[5]、Fast RCNN(Fast Regions with CNN features)[6]、SSD(Single Shot multibox Detector)[7]和YOLO(You Only Look Once)[8]等。表1列舉了幾種典型的圖像分類(lèi)網(wǎng)絡(luò)模型,從表1中可以看出,網(wǎng)絡(luò)模型的精度越來(lái)越高,但隨之而來(lái)的是網(wǎng)絡(luò)的結(jié)構(gòu)越來(lái)越復(fù)雜,網(wǎng)絡(luò)的規(guī)模越來(lái)越大,因此網(wǎng)絡(luò)模型的訓(xùn)練及前向推理過(guò)程也變得十分緩慢。表1中,GMACs表示每秒10億(=109)次的定點(diǎn)乘累加運(yùn)算。
Table 1 Typical image classification network models表1 典型圖像分類(lèi)網(wǎng)絡(luò)模型
網(wǎng)絡(luò)的性能越強(qiáng)其所需要的計(jì)算力也就越高,為了加速網(wǎng)絡(luò)的運(yùn)算通常使用專(zhuān)用的硬件,如現(xiàn)場(chǎng)可編程門(mén)陣列FPGA(Field Programmable Gate Array)。FPGA是一種半定制、可重構(gòu)的專(zhuān)用集成電路,具有功耗低、靈活性好、性能強(qiáng)的特點(diǎn)。Cloutier等人[9]使用FPGA進(jìn)行手寫(xiě)字母識(shí)別的相關(guān)加速工作,受制于當(dāng)時(shí)芯片的制造工藝沒(méi)能取得較好的結(jié)果。Zhang等人[10]使用HLS(High Level Synthesis)的設(shè)計(jì)方法,提出了基于Roofline的模型分析方法,在XILINX Virtex7 FPGA上實(shí)現(xiàn)了AlexNet網(wǎng)絡(luò)的卷積層設(shè)計(jì),消耗了較多硬件資源。Ghaffari等人[11]提出一種通用卷積神經(jīng)網(wǎng)絡(luò)加速框架,使用LeNet5對(duì)設(shè)計(jì)架構(gòu)進(jìn)行測(cè)試,未能取得較高的計(jì)算力。Lu等人[12]使用快速 Winograd 算法進(jìn)行卷積運(yùn)算的加速,提出了一個(gè)能夠在FPGA上運(yùn)行Winograd快速運(yùn)算的算法架構(gòu),設(shè)計(jì)較為復(fù)雜。Li等人[13]提出一種基于FPGA的端到端卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)方法,以此提高加速器的吞吐率,然而靈活性較差。Venieris等人[14]提出一種基于FPGA的動(dòng)態(tài)可重構(gòu)卷積神經(jīng)網(wǎng)絡(luò)加速框架,采用脈動(dòng)陣列的方式設(shè)計(jì)硬件加速單元,動(dòng)態(tài)可重構(gòu)的設(shè)計(jì)需要在使用時(shí)對(duì)FPGA反復(fù)燒寫(xiě),模型部署較為復(fù)雜。FPGA進(jìn)行硬件加速依然存在較多的挑戰(zhàn),硬件加速的性能與FPGA的片上資源有直接關(guān)系,如何使用有限的硬件資源設(shè)計(jì)出高效的硬件加速架構(gòu)是十分重要的研究問(wèn)題。YOLOv3-tiny[15]具有優(yōu)秀的目標(biāo)檢測(cè)能力,但模型所需的計(jì)算力依然較大,難以實(shí)現(xiàn)面向嵌入式領(lǐng)域的應(yīng)用。
本文設(shè)計(jì)一種YOLOv3-tiny的硬件加速方法,并在FPGA平臺(tái)上進(jìn)行實(shí)現(xiàn)。從定點(diǎn)化、并行化和流水化3個(gè)角度對(duì)模型進(jìn)行硬件加速設(shè)計(jì),使用XILINX Vivado開(kāi)發(fā)套件,在XILINX XC7Z020CLG400-1平臺(tái)上對(duì)上述研究?jī)?nèi)容進(jìn)行設(shè)計(jì)驗(yàn)證,分別設(shè)計(jì)了卷積、池化、上采樣和YOLO Detection硬件加速I(mǎi)P,在Vivado IDE上完成了基于Zynq7020的片上系統(tǒng)SOC(System On Chip)搭建,分別從計(jì)算速度、資源利用率和功耗效率等方面對(duì)設(shè)計(jì)進(jìn)行了綜合性能分析。
YOLOv3-tiny是YOLOv3網(wǎng)絡(luò)的精簡(jiǎn)版,其與YOLOv3模型性能的對(duì)比如表2所示。表2中FLOPS(FLoating-point Operations Per Second)表示每秒浮點(diǎn)運(yùn)算次數(shù),Bn表示Billion。在未對(duì)網(wǎng)絡(luò)進(jìn)行剪枝、壓縮等操作之前,YOLOv3-tiny所需的計(jì)算量和權(quán)重大小遠(yuǎn)小于YOLOv3的,但模型識(shí)別精度低于YOLOv3的。主要是因?yàn)槠渲鞲删W(wǎng)絡(luò)較淺,為了提升速度犧牲了一部分精度。
Table 2 Performance comparison between YOLOv3-tiny and YOLOv3 models表2 YOLOv3-tiny與YOLOv3網(wǎng)絡(luò)模型性能對(duì)比
Figure 1 YOLOv3-tiny network structure diagram圖1 YOLOv3-tiny網(wǎng)絡(luò)結(jié)構(gòu)圖
YOLOv3-tiny的主干網(wǎng)絡(luò)由卷積層、BN層[16]和池化層等構(gòu)成,預(yù)測(cè)分支網(wǎng)絡(luò)由卷積層、上采樣層和張量拼接層等組成,網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。模型特征圖輸入尺寸為416×416×3,輸出13×13×255,26×26×255 2個(gè)尺度的預(yù)測(cè)結(jié)果,主干網(wǎng)絡(luò)由7層卷積層構(gòu)成,卷積核尺寸均為3×3,步長(zhǎng)均為1,每個(gè)卷積層之后緊跟著一個(gè)步長(zhǎng)為2的最大池化層,池化單元尺寸為2×2,主干網(wǎng)絡(luò)是典型的直筒型卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),且卷積與池化計(jì)算統(tǒng)一,便于進(jìn)行硬件加速實(shí)現(xiàn)。
多尺度的預(yù)測(cè)是YOLOv3網(wǎng)絡(luò)的一大特點(diǎn),提高了網(wǎng)絡(luò)模型的泛化能力和檢測(cè)精度。不同尺度的網(wǎng)格單元相結(jié)合能夠增強(qiáng)網(wǎng)絡(luò)對(duì)目標(biāo)的預(yù)測(cè)能力。對(duì)于YOLOv3-tiny網(wǎng)絡(luò)來(lái)說(shuō),需要設(shè)計(jì)的硬件加速單元有:卷積計(jì)算單元、池化計(jì)算單元、上采樣計(jì)算單元和YOLO Detection計(jì)算單元。需要強(qiáng)調(diào)的是,YOLO Detection為網(wǎng)絡(luò)輸出的最后一層,作用是輸出邊框預(yù)測(cè)及類(lèi)別判斷信息,其輸出結(jié)果除tw、th(tw表示網(wǎng)絡(luò)預(yù)測(cè)邊框的寬,th表示網(wǎng)絡(luò)預(yù)測(cè)邊框的高)以外均需使用Sigmoid函數(shù)進(jìn)行處理。
定點(diǎn)化的計(jì)算能夠顯著提高計(jì)算效率,一個(gè)定點(diǎn)數(shù)由符號(hào)位、整數(shù)位和小數(shù)位組成,其總位寬為W,整數(shù)部分位寬為I,量化因子為W-I-1,本文使用S_float(32)、int(W)、I_float(32)分別表示原始浮點(diǎn)型數(shù)據(jù)、定點(diǎn)量化后的數(shù)據(jù)和定點(diǎn)數(shù)反量化的數(shù)據(jù),三者之間的關(guān)系可用式(1)表示:
int(W)=S_float(32)*2W-I-1
I_float(32)=int(W)/2W-I-1
(1)
當(dāng)總位寬與整數(shù)部分位寬固定時(shí),即可使用式(1)進(jìn)行數(shù)據(jù)的量化與反量化,將W-I-1稱(chēng)為量化因子,不同的量化因子具有不同的精度,量化因子越大相應(yīng)的數(shù)據(jù)精度就越高。為了衡量定點(diǎn)化后數(shù)據(jù)損失的精度,通常將定點(diǎn)化之后的樣本數(shù)據(jù)進(jìn)行反量化,并與原始樣本數(shù)據(jù)進(jìn)行對(duì)比,總體的量化精度損失[17]可使用式(2)進(jìn)行描述:
(2)
其中,N表示待量化的數(shù)據(jù)總個(gè)數(shù)。
定點(diǎn)化過(guò)程中數(shù)據(jù)整數(shù)部分位寬和量化因子的選擇十分重要,前者決定了定點(diǎn)數(shù)所能表示的數(shù)據(jù)范圍,后者決定了定點(diǎn)數(shù)據(jù)的精度。
文獻(xiàn)[18]對(duì)卷積神經(jīng)網(wǎng)絡(luò)中的并行性做了詳細(xì)介紹,本文在此基礎(chǔ)上對(duì)并行性進(jìn)行簡(jiǎn)單分析。卷積運(yùn)算是網(wǎng)絡(luò)計(jì)算中的主要計(jì)算單元,因此對(duì)并行性的分析主要針對(duì)卷積計(jì)算單元。
(1)卷積核間并行性:卷積核間并行是指每個(gè)卷積計(jì)算的卷積核是相互獨(dú)立的,所有的卷積核共享輸入特征圖。因此,卷積核間的計(jì)算不存在相互依賴(lài)的關(guān)系,可以同時(shí)進(jìn)行。
(2)特征圖間并行性:特征圖間的并行性是指對(duì)于輸入特征圖來(lái)說(shuō),每一組卷積核都有與之對(duì)應(yīng)的特征圖。當(dāng)進(jìn)行卷積計(jì)算時(shí),每個(gè)卷積核與對(duì)應(yīng)的輸入特征圖進(jìn)行乘加計(jì)算。實(shí)際計(jì)算時(shí)可將每個(gè)特征圖與對(duì)應(yīng)卷積核進(jìn)行并行計(jì)算,然后將計(jì)算得到的結(jié)果相加即可。
(3)特征圖內(nèi)并行性:一個(gè)特征圖共享一個(gè)卷積核,因此可以將特征圖上的卷積滑窗同時(shí)進(jìn)行運(yùn)算,在一個(gè)特征圖上的不同位置使用共享的卷積核進(jìn)行并行運(yùn)算,可減少循環(huán)的次數(shù)。
(4)卷積核內(nèi)并行性:以3×3的卷積核為例,整個(gè)計(jì)算過(guò)程需要進(jìn)行9次乘法與8次加法運(yùn)算,如果使用串行計(jì)算共需要循環(huán)9次;如果將卷積核與特征圖滑窗展開(kāi)為向量,可同時(shí)進(jìn)行9次乘法運(yùn)算,然后再進(jìn)行1次加法運(yùn)算即可完成整個(gè)計(jì)算。
流水化的設(shè)計(jì)思想被廣泛應(yīng)用于硬件設(shè)計(jì)中。本文以3級(jí)流水線對(duì)流水化的設(shè)計(jì)思想進(jìn)行簡(jiǎn)單分析,從圖2可以看出,對(duì)于3個(gè)任務(wù),串行設(shè)計(jì)需要耗時(shí)9個(gè)時(shí)鐘周期,并行設(shè)計(jì)需要耗時(shí)3個(gè)時(shí)鐘周期,流水化設(shè)計(jì)需要耗時(shí)5個(gè)時(shí)鐘周期。
橫向比較可知:并行化的計(jì)算速度最快,但并行化的過(guò)程需要將硬件資源加倍,圖2中所需的硬件資源為串行的3倍,流水化的設(shè)計(jì)無(wú)需將所有的硬件資源都加倍,但依然需要消耗額外的存儲(chǔ)單元和寄存器等。
Figure 2 Serial,parallel and pipeline structure 圖2 串行、并行和流水化結(jié)構(gòu)
縱向比較可知:串行設(shè)計(jì)1次僅能計(jì)算1個(gè)子任務(wù),并行化與流水化1次能夠計(jì)算3個(gè)子任務(wù),區(qū)別在于并行化是對(duì)彼此獨(dú)立的任務(wù)1次執(zhí)行多個(gè)相同的子任務(wù),流水化是對(duì)彼此獨(dú)立的任務(wù)1次執(zhí)行多個(gè)不同的子任務(wù)。
因此,并行化主要面向沒(méi)有數(shù)據(jù)依賴(lài)關(guān)系的任務(wù)間,流水化主要面向有相對(duì)數(shù)據(jù)依賴(lài)的任務(wù)內(nèi),流水與并行的同時(shí)應(yīng)用能夠大幅提高任務(wù)的運(yùn)行效率。本文將網(wǎng)絡(luò)模型的流水化抽象為2個(gè)層級(jí),宏觀上的流水化可在網(wǎng)絡(luò)的各層級(jí)之間進(jìn)行設(shè)計(jì),微觀上的流水化可在具體的層內(nèi)展開(kāi)設(shè)計(jì)。
(1)數(shù)據(jù)范圍。
數(shù)據(jù)進(jìn)行定點(diǎn)化之前需對(duì)數(shù)據(jù)范圍進(jìn)行統(tǒng)計(jì),以此確定定點(diǎn)數(shù)的位數(shù),本文對(duì)YOLOv3-tiny定點(diǎn)化前后的各層權(quán)重和偏置數(shù)據(jù)分布進(jìn)行統(tǒng)計(jì),并對(duì)定點(diǎn)化前后的數(shù)據(jù)精度損失進(jìn)行對(duì)比。YOLOv3-tiny共有13層卷積層,定點(diǎn)化前各層權(quán)重和偏置的總體分布如圖3和圖4所示,從圖中可知,各層權(quán)重與偏置數(shù)據(jù)主要集中分布在0附近。本文分別使用8位,16位以及32位定點(diǎn)數(shù)進(jìn)行定點(diǎn)化設(shè)計(jì),從精度損失和計(jì)算資源消耗2個(gè)方面對(duì)設(shè)計(jì)進(jìn)行評(píng)估。
Figure 3 Overall distribution of weights圖3 權(quán)重總體分布圖
Figure 4 Overall distribution of bias圖4 偏置總體分布圖
為了衡量定點(diǎn)化后的數(shù)據(jù)精度損失,本文使用式(1)對(duì)定點(diǎn)化后的數(shù)據(jù)進(jìn)行反量化,然后使用式(2)統(tǒng)計(jì)其精度損失,不同定點(diǎn)數(shù)定點(diǎn)化后各層的數(shù)據(jù)精度損失如表3所示。從表3可知,采用8位定點(diǎn)數(shù)(FP8)進(jìn)行定點(diǎn)化數(shù)據(jù)精度損失較大,16位定點(diǎn)數(shù)(FP16)數(shù)據(jù)精度損失較小,32位定點(diǎn)數(shù)(FP32)幾乎可達(dá)無(wú)損量化。因此,從數(shù)據(jù)精度角度來(lái)說(shuō),使用16位定點(diǎn)數(shù)能夠滿足設(shè)計(jì)要求。雖然采用8~16位的定點(diǎn)數(shù)也有可能滿足權(quán)重精度的要求,但考慮到定點(diǎn)化的統(tǒng)一性以及定點(diǎn)數(shù)對(duì)中間層數(shù)據(jù)范圍的覆蓋能力,更少位數(shù)的定點(diǎn)數(shù)可能導(dǎo)致數(shù)據(jù)精度的下降。
Table 3 Weights and biases accuracy loss of each layer表3 各層權(quán)重和偏置定點(diǎn)化精度損失
通常網(wǎng)絡(luò)模型中原始的數(shù)據(jù)類(lèi)型為float,其占用4個(gè)字節(jié)的內(nèi)存空間,32位定點(diǎn)數(shù)所需的內(nèi)存空間同樣為4個(gè)字節(jié),因此不能節(jié)省存儲(chǔ)空間,16位定點(diǎn)數(shù)所需的內(nèi)存空間為2個(gè)字節(jié),能夠節(jié)省50%的存儲(chǔ)空間,而8位定點(diǎn)數(shù)則能節(jié)省75%的存儲(chǔ)空間。結(jié)合表3與圖5可知,采用16位定點(diǎn)數(shù)進(jìn)行定點(diǎn)化設(shè)計(jì)能夠在數(shù)據(jù)的精度損失和資源消耗間取得平衡,因此本文使用16位定點(diǎn)數(shù)作為加速器整體的定點(diǎn)位數(shù)。
本文使用一個(gè)3×3的卷積運(yùn)算對(duì)不同定點(diǎn)數(shù)的資源消耗進(jìn)行仿真測(cè)試,結(jié)果如圖5所示。從圖5中可知,定點(diǎn)位數(shù)越高其所需的硬件資源也越多。
Figure 5 Resource consumption diagram圖5 資源消耗圖
(2)數(shù)據(jù)溢出處理。
對(duì)于YOLOv3-tiny網(wǎng)絡(luò)來(lái)說(shuō),數(shù)據(jù)溢出主要出現(xiàn)在卷積的計(jì)算過(guò)程以及計(jì)算結(jié)果的輸出中,各層的權(quán)重、偏置、輸入數(shù)據(jù)只參與計(jì)算過(guò)程,無(wú)需進(jìn)行數(shù)據(jù)的更新(此處指本層輸入數(shù)據(jù))。因此,權(quán)重、偏置、輸入數(shù)據(jù)的溢出處理直接使用舍去高位保留低位的方法。而卷積計(jì)算過(guò)程中的數(shù)據(jù)累加,則使用更大范圍的定點(diǎn)數(shù)據(jù)類(lèi)型暫存計(jì)算結(jié)果,設(shè)計(jì)中本文使用32位定點(diǎn)數(shù)。對(duì)于卷積計(jì)算的最終輸出結(jié)果,本文使用16位定點(diǎn)數(shù)進(jìn)行表示,當(dāng)發(fā)生數(shù)據(jù)溢出時(shí),直接使用定點(diǎn)數(shù)據(jù)的最大值代替該值,避免造成更大的精度損失。對(duì)于池化層、上采樣層和YOLO Detection層,其計(jì)算過(guò)程不存在數(shù)據(jù)累加、乘積等造成數(shù)據(jù)溢出的問(wèn)題,因此直接使用16位定點(diǎn)數(shù),當(dāng)發(fā)生數(shù)據(jù)溢出時(shí),直接使用定點(diǎn)數(shù)據(jù)的最大值代替該值。
(1)卷積計(jì)算單元。
卷積計(jì)算單元的結(jié)構(gòu)如圖6所示。卷積計(jì)算單元的數(shù)據(jù)輸入共有2種AXI4-Stream數(shù)據(jù)流:一種用于權(quán)重和特征圖數(shù)據(jù)的傳輸,記為INA Stream;一種用于偏置和中間計(jì)算結(jié)果的傳輸,記為INB Stream。
①I(mǎi)NA Stream。
Figure 6 Structure of convolution calculation unit圖6 卷積計(jì)算單元結(jié)構(gòu)
輸入與輸出通道的循環(huán)分塊因子分別記為q和p,通過(guò)改變q和p的大小即可實(shí)現(xiàn)對(duì)并行度的控制。對(duì)于權(quán)重?cái)?shù)據(jù),本文僅將本次計(jì)算所需的權(quán)重傳輸至片上BRAM,因此片上BRAM的大小為:p×q×k×k,其中k為卷積核尺寸。對(duì)于特征圖的輸入,本文設(shè)計(jì)q個(gè)3行的緩存結(jié)構(gòu),記為“Line Buffer”,通過(guò)移動(dòng)與插入即可實(shí)現(xiàn)輸入數(shù)據(jù)的緩存。對(duì)于卷積計(jì)算的滑窗,本文設(shè)計(jì)3×3的窗口,記為“Window”,將“Line Buffer”內(nèi)的數(shù)據(jù)不斷移動(dòng)到“Window”內(nèi)即可實(shí)現(xiàn)卷積滑窗計(jì)算的功能。對(duì)于卷積計(jì)算的特征圖輸出,本文使用可編程邏輯PL(Programmable Logic)內(nèi)部的AXI4-Stream協(xié)議設(shè)計(jì)FIFO結(jié)構(gòu),F(xiàn)IFO深度設(shè)置為2。
②INB Stream。
由于循環(huán)分塊因子的引入,本次卷積計(jì)算的結(jié)果需要和上次循環(huán)的計(jì)算結(jié)果累加,然后再作為本次計(jì)算的最終結(jié)果傳輸至片外存儲(chǔ)。因此,需要設(shè)計(jì)片上存儲(chǔ)結(jié)構(gòu),對(duì)本次循環(huán)所需要累加的數(shù)據(jù)進(jìn)行存儲(chǔ),緩存大小和輸出通道的循環(huán)分塊因子p相等;此外,當(dāng)完成一個(gè)輸出通道的卷積計(jì)算時(shí),需要將偏置與當(dāng)前計(jì)算結(jié)果相加,然后再進(jìn)行激活輸出,偏置的片上緩存大小也同輸出通道的循環(huán)分塊因子p相等。
③循環(huán)分塊因子。
本文使用“ARRAY_PARTITION”與“PIPLINE”指令對(duì)卷積計(jì)算單元進(jìn)行優(yōu)化。設(shè)置不同的循環(huán)分塊因子(AXI4-Stream位寬64,一次傳輸4個(gè)通道,因此循環(huán)分塊因子為4的倍數(shù)),進(jìn)而得到不同循環(huán)分塊因子下的資源消耗,結(jié)果如圖7所示。從圖7中可知,隨著循環(huán)分塊因子的增加,硬件資源的消耗幾乎也成倍增加,考慮到實(shí)驗(yàn)平臺(tái)Zynq7020的資源配置,本文最終將系統(tǒng)的循環(huán)分塊因子設(shè)置為32,即p=q=32。
Figure 7 Resource consumption of different cyclic blocking factors圖7 不同循環(huán)分塊因子資源消耗
(2)池化計(jì)算單元。
池化計(jì)算單元的設(shè)計(jì)相較于卷積計(jì)算單元要簡(jiǎn)單,池化層中不存在權(quán)重與偏置,也無(wú)需設(shè)計(jì)復(fù)雜的片上存儲(chǔ)結(jié)構(gòu)與計(jì)算流程,卷積計(jì)算單元中將循環(huán)分塊因子設(shè)置為32,為了保持系統(tǒng)設(shè)計(jì)的一致性,本文將池化層的循環(huán)分塊因子也設(shè)置為32。池化層中的輸入與輸出通道數(shù)相等,且各通道間的池化運(yùn)算不存在數(shù)據(jù)依賴(lài),池化計(jì)算單元的設(shè)計(jì)可用圖8描述。
池化計(jì)算單元的數(shù)據(jù)輸入與輸出均為AXI4-Srteam,由于YOLOv3-tiny中的池化步長(zhǎng)固定為2,本文設(shè)計(jì)32個(gè)2行的緩存結(jié)構(gòu),通過(guò)移動(dòng)與插入即可實(shí)現(xiàn)輸入數(shù)據(jù)的緩存;對(duì)于池化計(jì)算的滑窗,設(shè)計(jì)2×2的窗口,將“Line Buffer”內(nèi)的數(shù)據(jù)不斷移動(dòng)到“Window”內(nèi)即可實(shí)現(xiàn)池化滑窗計(jì)算的功能,每完成一次池化計(jì)算即可將計(jì)算結(jié)果輸出,無(wú)需進(jìn)行片上存儲(chǔ)。
Figure 8 Structure of pooled computing unit圖8 池化計(jì)算單元結(jié)構(gòu)
池化計(jì)算單元的優(yōu)化設(shè)計(jì)與卷積層相同,本文使用“PIPLINE”對(duì)輸入通道下的循環(huán)進(jìn)行優(yōu)化,使用“ARRAY_PARTITION”對(duì)行緩存數(shù)組進(jìn)行分割。
(3)上采樣計(jì)算單元。
YOLOv3-tiny中僅有一層上采樣層,上采樣層的輸入輸出特征圖尺寸固定,分別為13×13,26×26,因此上采樣層的設(shè)計(jì)僅針對(duì)這一組參數(shù)即可。上采樣的計(jì)算過(guò)程與下采樣剛好相反,上采樣計(jì)算單元的設(shè)計(jì)與池化層十分類(lèi)似,每完成一次上采樣計(jì)算即可將計(jì)算結(jié)果輸出,無(wú)需進(jìn)行片上存儲(chǔ),其優(yōu)化方式也與池化層相同,這里不再進(jìn)行贅述。
(4)YOLO Detection計(jì)算單元。
YOLO Detection為網(wǎng)絡(luò)輸出的最后一層,其作用是輸出邊框預(yù)測(cè)及類(lèi)別判斷信息,圖9是其輸出向量示意圖,輸出結(jié)果除tw、th以外均需使用Sigmoid函數(shù)進(jìn)行處理。圖9中,tx表示網(wǎng)絡(luò)預(yù)測(cè)邊框的橫向相對(duì)坐標(biāo),ty表示網(wǎng)絡(luò)預(yù)測(cè)邊框的縱向相對(duì)坐標(biāo)。YOLO Detection計(jì)算單元的數(shù)據(jù)輸入無(wú)需使用行緩存,也無(wú)需設(shè)計(jì)片上存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)以AXI4-Stream的形式輸入,計(jì)算單元直接對(duì)輸出數(shù)據(jù)進(jìn)行處理,然后將結(jié)果輸出,由于未涉及到片上存儲(chǔ),因此優(yōu)化設(shè)計(jì)只需使用“PIPLINE”即可。該計(jì)算單元的設(shè)計(jì)不同之處在于Sigmoid函數(shù)的定點(diǎn)化硬件實(shí)現(xiàn)以及如何對(duì)tw、th進(jìn)行特殊處理。Sigmoid函數(shù)可用式(3)表示:
(3)
Figure 9 YOLO Detection output vector圖9 YOLO Detection輸出向量
本文使用HLS中的“math.h”函數(shù)庫(kù)對(duì)Sigmoid函數(shù)進(jìn)行實(shí)現(xiàn)。從前文可知,16位定點(diǎn)數(shù)的整數(shù)位為7,小數(shù)位為8,符號(hào)位為1,因此對(duì)于一個(gè)16位定點(diǎn)數(shù),其所能表示的數(shù)據(jù)為[-128,128),最小數(shù)據(jù)精度為2-8,以最小數(shù)據(jù)精度為間隔,16位定點(diǎn)數(shù)所能表示的數(shù)據(jù)共有65 535個(gè)。因此,能夠得到等數(shù)量的Sigmoid計(jì)算輸出。本文將輸出結(jié)果與標(biāo)準(zhǔn)float型數(shù)據(jù)的運(yùn)算結(jié)果進(jìn)行對(duì)比并繪制輸出曲線圖,從圖10可知,除點(diǎn)p1(-128,1)與p2(-7.625,0.5625)外,定點(diǎn)化后的Sigmoid輸出曲線與原始曲線基本重合,將p1、p2 2個(gè)異常點(diǎn)剔除后,使其與標(biāo)準(zhǔn)輸出相等,得到修復(fù)后的輸出曲線,如圖11所示。
Figure 10 Output curve before repairing abnormal points圖10 異常點(diǎn)修復(fù)前輸出曲線
Figure 11 Output curve after repairing abnormal points圖11 異常點(diǎn)修復(fù)后輸出曲線
對(duì)于YOLO Detection計(jì)算單元,不需要片上存儲(chǔ)單元,因此本文僅使用“PIPLINE”對(duì)其進(jìn)行優(yōu)化。
層間流水化與層間數(shù)據(jù)的傳遞關(guān)系密不可分,對(duì)于ARM+FPGA架構(gòu)的神經(jīng)網(wǎng)絡(luò)加速器來(lái)說(shuō),網(wǎng)絡(luò)各層的數(shù)據(jù)傳遞可用圖12來(lái)描述。使用FPGA構(gòu)成卷積、池化等計(jì)算單元的加速器,同時(shí)常用AXI4總線進(jìn)行數(shù)據(jù)傳輸。圖12的結(jié)構(gòu)中只有當(dāng)卷積層或池化層的計(jì)算結(jié)束后才能開(kāi)始下一層的計(jì)算,計(jì)算開(kāi)始之前與計(jì)算完成之后均需要使用AXI4總線進(jìn)行片外存儲(chǔ)的數(shù)據(jù)訪存,頻繁的數(shù)據(jù)傳輸將會(huì)限制加速器的計(jì)算性能。
Figure 12 Structure of network data transmission 圖12 網(wǎng)絡(luò)數(shù)據(jù)傳輸結(jié)構(gòu)圖
由網(wǎng)絡(luò)各層的計(jì)算特性分析可知,標(biāo)準(zhǔn)卷積層的計(jì)算需要遍歷所有的輸入通道數(shù)據(jù)才能得到一個(gè)完整的特征輸出,因此卷積層的計(jì)算需要等上一層的計(jì)算完成之后才能進(jìn)行。池化層的計(jì)算是對(duì)各個(gè)輸入通道數(shù)據(jù)的下采樣,通道間的計(jì)算沒(méi)有數(shù)據(jù)依賴(lài)。理論上可將卷積與池化合并為一個(gè)計(jì)算單元,但此時(shí)會(huì)失去各個(gè)計(jì)算單元獨(dú)立運(yùn)算的靈活性。
如圖13所示,本文提出網(wǎng)絡(luò)各層間的流水化設(shè)計(jì)方法,依然設(shè)計(jì)不同的加速器計(jì)算單元,但在FPGA內(nèi)部使用硬件控制器將不同的加速單元連接起來(lái),可通過(guò)控制器選擇完成計(jì)算后的數(shù)據(jù)流向,對(duì)于卷積和池化來(lái)說(shuō),當(dāng)完成部分卷積計(jì)算后,可對(duì)計(jì)算完成后的數(shù)據(jù)直接進(jìn)行池化運(yùn)算,然后再將數(shù)據(jù)傳輸至片外存儲(chǔ),以此降低數(shù)據(jù)的傳輸次數(shù),提高加速器的整體性能。
Figure 13 Pipeline structure of each network layer 圖13 網(wǎng)絡(luò)各層流水化設(shè)計(jì)結(jié)構(gòu)
相對(duì)于層間來(lái)說(shuō),層內(nèi)的流水化設(shè)計(jì)具有更大的設(shè)計(jì)空間,本文以卷積層的流水化設(shè)計(jì)為例進(jìn)行詳細(xì)的分析。流水化的設(shè)計(jì)思想是將一個(gè)大的任務(wù)分割成幾個(gè)小的子任務(wù),每個(gè)子任務(wù)對(duì)應(yīng)著1級(jí)流水,任務(wù)執(zhí)行時(shí)不同任務(wù)的子任務(wù)能夠被同時(shí)執(zhí)行,從宏觀上來(lái)說(shuō)一個(gè)時(shí)鐘周期能夠完成一個(gè)大任務(wù)的運(yùn)算。如圖14所示,本文將卷積層的計(jì)算分為5個(gè)子任務(wù),分別為:行緩存、卷積滑窗、卷積計(jì)算、數(shù)據(jù)累加和計(jì)算輸出,因此整個(gè)流水線為5級(jí)流水設(shè)計(jì)。
Figure 14 Pipeline structure of convolutional layer 圖14 卷積層流水化設(shè)計(jì)結(jié)構(gòu)
流水線的工作流程如下:首先使用行緩存對(duì)輸入數(shù)據(jù)進(jìn)行讀取;然后卷積滑窗從行緩存提取需要進(jìn)行卷積運(yùn)算的特征數(shù)據(jù);接著卷積計(jì)算單元將提取出的特征數(shù)據(jù)與不同卷積核進(jìn)行卷積運(yùn)算,再將計(jì)算結(jié)果傳輸至數(shù)據(jù)累加單元,進(jìn)行不同卷積核計(jì)算結(jié)果的累加,從而得到本次計(jì)算的輸出結(jié)果;最后將輸出結(jié)果送入計(jì)算輸出單元的FIFO單元進(jìn)行臨時(shí)存儲(chǔ),同時(shí)將上一次計(jì)算的結(jié)果輸出至片外存儲(chǔ)單元。
顯然,整個(gè)流水線中卷積計(jì)算單元的計(jì)算復(fù)雜度和時(shí)間復(fù)雜度均最高,該單元需要完成大量的乘加計(jì)算,因此是限制整個(gè)流水周期的關(guān)鍵路徑。本文給出的解決方法是在卷積計(jì)算單元內(nèi)引入并行設(shè)計(jì),使用更多的硬件資源進(jìn)行計(jì)算,能夠大幅降低時(shí)間復(fù)雜度,同時(shí)使用定點(diǎn)數(shù)據(jù)降低計(jì)算復(fù)雜度。
加速器測(cè)試平臺(tái)使用Z-turn Board開(kāi)發(fā)板,Z-turn Board是深圳市米爾科技有限公司推出的一款以XILINX Zynq作為主處理器的嵌入式開(kāi)發(fā)板,核心芯片為Zynq7020,這里不作具體介紹。
本文使用Vivado軟件對(duì)各IP進(jìn)行綜合設(shè)計(jì),生成比特流文件,然后在軟件開(kāi)發(fā)包SDK(Software Development Kit)環(huán)境下進(jìn)行YOLOv3-tiny網(wǎng)絡(luò)的復(fù)現(xiàn)。實(shí)驗(yàn)平臺(tái)的資源配置如表4所示。表4中PS(Processing System)表示處理系統(tǒng)。
Table 4 Resource of experimental platform表4 實(shí)驗(yàn)平臺(tái)資源
實(shí)驗(yàn)設(shè)計(jì)分為:僅使用ARM、使用加速器但不引入層間流水化和使用加速器并引入層間流水化3部分。僅使用ARM進(jìn)行實(shí)驗(yàn)的設(shè)置比較簡(jiǎn)單,不作詳細(xì)設(shè)計(jì)分析。
Figure 15 IP connection of accelerator without interlayer pipeline system 圖15 加速器無(wú)層間流水系統(tǒng)IP連接
使用加速器不引入層間流水的實(shí)驗(yàn)設(shè)計(jì)中,系統(tǒng)各IP連接方式如圖15所示,AXI4 Stream數(shù)據(jù)流通過(guò)AXI Switch0選擇進(jìn)入相應(yīng)的計(jì)算單元內(nèi),待計(jì)算結(jié)束后再通過(guò)AXI Switch1將計(jì)算結(jié)果輸出,各IP并行排列,每進(jìn)行1次加速計(jì)算僅能使用其中1個(gè)加速器,待該計(jì)算完成后再開(kāi)始新的一輪加速運(yùn)算。
使用加速器引入層間流水的實(shí)驗(yàn)設(shè)計(jì)中,系統(tǒng)各IP連接方式如圖16所示,AXI4 Stream數(shù)據(jù)流通過(guò)AXI Switch0選擇進(jìn)入卷積計(jì)算單元內(nèi),并通過(guò)AXI Switch1將卷積計(jì)算結(jié)果輸出到池化等計(jì)算單元內(nèi),最后通過(guò)AXI Switch2將計(jì)算結(jié)果輸出。每進(jìn)行1次加速計(jì)算能使用其中2個(gè)加速器,無(wú)需進(jìn)行數(shù)據(jù)的二次傳輸。
Figure 16 IP connection of the accelerator with interlayer pipeline system圖16 加速器有層間流水系統(tǒng)IP連接
實(shí)驗(yàn)中FPGA端的時(shí)鐘頻率為100 MHz,ARM端的時(shí)鐘頻率為667 MHz,使用系統(tǒng)計(jì)時(shí)器記錄模型前向推理的時(shí)間段,用以評(píng)估計(jì)算延時(shí)。其中,不使用加速器的模型推理是基于Darknet框架在ARM-A9上進(jìn)行實(shí)現(xiàn)的。使用加速器的2種模型,本文在SDK中分別設(shè)計(jì)了各自的代碼框架。從YOLO官方網(wǎng)站可以知道,YOLOv3-tiny所需的GOPS(Giga Operations Per Second)為5.56,本文將從資源消耗、計(jì)算延時(shí)、功耗和GOPS 4個(gè)角度對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行分析。
對(duì)于GOPS,需要做相應(yīng)的轉(zhuǎn)換,轉(zhuǎn)換公式如式(4)所示:
(4)
其中,Ts為前向推理時(shí)間。
相關(guān)實(shí)驗(yàn)結(jié)果如表5所示,從表5中可知:對(duì)于資源消耗,引入層間流水前后并未造成較大幅度的資源消耗,兩者基本一致;對(duì)于計(jì)算延時(shí),使用加速器能夠大幅提升網(wǎng)絡(luò)的推理速度,且引入層間流水的加速器設(shè)計(jì)的推理速度最快,是僅使用PS端進(jìn)行模型推理的290.56倍,相較于未進(jìn)行流水化設(shè)計(jì)的方法,層間流水能夠減少48 ms的推理時(shí)間。對(duì)于片上功率,相較于未加速的設(shè)計(jì),使用加速器后的功率增加約1 W,且采用層間流水加速的設(shè)計(jì)其功耗相對(duì)更低,因此層間流水的設(shè)計(jì)在一定程度上既降低了功耗也提高了加速器的推理速度。對(duì)于GOPS,引入層間流水的加速器設(shè)計(jì)具有最大的GOPS,且能量效率最高。
總的來(lái)說(shuō),在Z-turn Board平臺(tái)上系統(tǒng)總體GOPS可達(dá)10.692,雖然并未達(dá)到實(shí)時(shí)推理的加速性能,但實(shí)現(xiàn)了高達(dá)290.56倍加速性能,對(duì)工程化實(shí)現(xiàn)具有一定的參考價(jià)值。此外,實(shí)驗(yàn)所用平臺(tái)的硬件資源較為緊張,若在硬件資源更為豐富的平臺(tái)上進(jìn)行設(shè)計(jì),增加網(wǎng)絡(luò)的輸入輸出并行度,并提高PL端的時(shí)鐘頻率,相信能夠獲得更高的加速性能。
Table 5 Experimental results表5 實(shí)驗(yàn)結(jié)果
下面對(duì)系統(tǒng)設(shè)計(jì)的綜合性能進(jìn)行評(píng)估,將本文與前人的相關(guān)工作進(jìn)行綜合對(duì)比分析。為了能夠全面地對(duì)系統(tǒng)設(shè)計(jì)性能進(jìn)行說(shuō)明,分別選取了采用不同設(shè)計(jì)思路的卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)方法的相關(guān)文獻(xiàn),并從多個(gè)角度對(duì)性能指標(biāo)進(jìn)行對(duì)比,相關(guān)結(jié)果如表6所示。
文獻(xiàn)[10]給出了一種專(zhuān)用的卷積神經(jīng)網(wǎng)絡(luò)加速器,針對(duì)AlexNet網(wǎng)絡(luò)的前5層卷積層進(jìn)行加速,并對(duì)每一層使用設(shè)計(jì)空間搜索的方法得到每層的最優(yōu)設(shè)計(jì)參數(shù)。與本文的工作相比,文獻(xiàn)[10]的加速器雖然取得了更高的GOPS,但使用了更多的計(jì)算資源,且從能量效率與GOPS/DSP來(lái)看,本文的設(shè)計(jì)要優(yōu)于文獻(xiàn)[10]的。與本文的設(shè)計(jì)目標(biāo)相同,文獻(xiàn)[11]設(shè)計(jì)了一種通用的卷積神經(jīng)網(wǎng)絡(luò)加速器,并使用LeNet5對(duì)加速器的設(shè)計(jì)進(jìn)行測(cè)試,在與本文相同的實(shí)驗(yàn)平臺(tái)上僅獲得了1.62 GOPS的計(jì)算力,得益于更低的計(jì)算數(shù)據(jù)位,其單位BRAM的利用率要高于本文的。文獻(xiàn)[19]采用混合設(shè)計(jì)的思路,對(duì)YOLOv1-tiny的第1層卷積與最后1層卷積設(shè)計(jì)專(zhuān)用的計(jì)算單元,其他中間層采用通用計(jì)算單元,在與本文相同的實(shí)驗(yàn)平臺(tái)上,雖然PL端時(shí)鐘頻率高于本文的,但加速器的整體性略低于本文的。針對(duì)YOLOv2-tiny,文獻(xiàn)[20]設(shè)計(jì)了一種專(zhuān)用的硬件加速系統(tǒng),并采用低位數(shù)據(jù)對(duì)網(wǎng)絡(luò)進(jìn)行量化與再訓(xùn)練,其在與文獻(xiàn)[10]相同的平臺(tái)下取得了高達(dá)464.67 GOPS的計(jì)算性能,各方面設(shè)計(jì)性能均要優(yōu)于本文的設(shè)計(jì),但其可拓展性能較差且需要對(duì)網(wǎng)絡(luò)進(jìn)行二次訓(xùn)練,時(shí)間成本更高。
Table 6 Comprehensive comparison of system design performance表6 系統(tǒng)設(shè)計(jì)性能綜合對(duì)比
本文對(duì)YOLOv3-tiny網(wǎng)絡(luò)進(jìn)行硬件加速設(shè)計(jì),從定點(diǎn)化、并行化和流水化的角度分別完成了卷積、池化、上采樣和YOLO Detection硬件加速I(mǎi)P的設(shè)計(jì)。并在Z-turn Board平臺(tái)上對(duì)加速器的整體性能進(jìn)行了測(cè)試,從資源消耗、計(jì)算延時(shí)、功耗和GOPS等方面對(duì)設(shè)計(jì)進(jìn)行了綜合性能分析。最終,本文方法獲得了10.69 GOPS的有效算力,實(shí)現(xiàn)了1.89 fps的YOLOv3-tiny前向推理速度,系統(tǒng)功耗僅為2.533 W。此外,層間流水的設(shè)計(jì)方法,在未引入額外硬件資源的情況下減少了48 ms的推理時(shí)間。