李欽祚,肖燈軍
(1.中國(guó)科學(xué)院空天信息創(chuàng)新研究院,北京 100190;2.中國(guó)科學(xué)院大學(xué)電子電氣與通信工程學(xué)院,北京 100049)
深度學(xué)習(xí)在目標(biāo)檢測(cè)、圖像分類(lèi)、語(yǔ)義分割等方 面發(fā)揮著重要作用。在目標(biāo)檢測(cè)領(lǐng)域YOLO 算法[1]與其他算法[2-3]相比平衡了精度和速度。然而基于GPU 及ASIC 實(shí)現(xiàn)的YOLO 算法分別存在功耗高和設(shè)計(jì)周期長(zhǎng)的問(wèn)題。而FPGA 由于其功耗低、體積小、可編程性強(qiáng)等優(yōu)點(diǎn)通常被用來(lái)進(jìn)行神經(jīng)網(wǎng)絡(luò)加速計(jì)算。目前的研究主要針對(duì)卷積計(jì)算、模型、數(shù)據(jù)位寬等方面進(jìn)行優(yōu)化。文獻(xiàn)[4]和文獻(xiàn)[5]分別采用Winograd 及FFT 算法優(yōu)化卷積計(jì)算;文獻(xiàn)[6-7]利用神經(jīng)網(wǎng)絡(luò)參數(shù)稀疏性進(jìn)行FPGA 加速,文獻(xiàn)[8]采用XNOR 門(mén)優(yōu)化模型,但對(duì)模型的優(yōu)化容易影響檢測(cè)精度;文獻(xiàn)[9-10]使用16 bit 定點(diǎn)數(shù)部署YOLO 網(wǎng)絡(luò),而文獻(xiàn)[11]采用浮點(diǎn)數(shù)部署消耗了大量片上資源。該文基于FPGA 在Xilinx 的軟硬件平臺(tái)上實(shí)現(xiàn)了低功耗Tiny YOLOv3 加速器,對(duì)神經(jīng)網(wǎng)絡(luò)的加速計(jì)算做進(jìn)一步探索。
Tiny YOLOv3 網(wǎng)絡(luò)由13 個(gè)卷積層組成。輸入圖像大小默認(rèn)為416 pixel×416 pixel,通過(guò)卷積層進(jìn)行特征提取,最大池化層進(jìn)行數(shù)據(jù)降維和維持特征不變性,升采樣層可以增加特征圖的維數(shù),為26 pixel×26 pixel 的輸出特征圖提供更多的特征信息。隨著卷積層數(shù)的加深,卷積核的感受野隨之增大。為了檢測(cè)不同大小的目標(biāo),Tiny YOLOv3網(wǎng)絡(luò)分別采用13 pixel×13 pixel 和26 pixel×26 pixel 的YOLO層進(jìn)行大目標(biāo)和小目標(biāo)的檢測(cè)。Tiny YOLOv3 網(wǎng)絡(luò)可以提取的特征為W×H×(4+1+C)×B,其中W和H是輸出特征圖的寬度和高度,將輸入圖像分成W×H個(gè)網(wǎng)格單元,每個(gè)網(wǎng)格單元都有(4+1+C)×B個(gè)通道,分別包含坐標(biāo)信息、目標(biāo)置信度、不同類(lèi)別置信度(C)以及邊界框數(shù)量(B)。
1.2.1 行寄存器設(shè)計(jì)
如圖1所示,在實(shí)現(xiàn)卷積計(jì)算的過(guò)程中,F(xiàn)PGA 不需要存儲(chǔ)所有輸入信息,只需要存儲(chǔ)當(dāng)前卷積窗所在行的所有數(shù)據(jù)即可。在一個(gè)通道維度上,設(shè)輸入圖像寬度為fw,高度為fh,卷積窗尺寸為kw×kh,此時(shí)行寄存器的尺寸為kh×fw。在Tiny YOLOv3 的結(jié)構(gòu)中,行寄存器的尺寸可以設(shè)置為418×3。行寄存器是一個(gè)移位寄存器數(shù)組,當(dāng)有新的輸入數(shù)據(jù)進(jìn)入行寄存器時(shí),對(duì)應(yīng)列中的舊數(shù)據(jù)向上移位,新的輸入數(shù)據(jù)便會(huì)插入。行寄存器區(qū)只會(huì)保存最近的kh行數(shù)據(jù)。
圖1 行緩存區(qū)示意圖
1.2.2 通道交錯(cuò)設(shè)計(jì)
圖2 卷積數(shù)據(jù)流操作順序
在多通道并行執(zhí)行的過(guò)程中,寫(xiě)入操作發(fā)生的次數(shù)比讀取操作更加頻繁。由于網(wǎng)絡(luò)的輸出通道數(shù)量普遍大于輸入通道,將在輸出端口產(chǎn)生數(shù)據(jù)擁塞。故在卷積輸出和AXI4 流端口之間引入First-in Firstout(FIFO)來(lái)優(yōu)化流水線(xiàn)結(jié)構(gòu)。設(shè)輸入通道數(shù)量為8,輸出通道數(shù)量為16,由于該設(shè)計(jì)中采用16位定點(diǎn)數(shù)和64 位DMA,所以當(dāng)Initial Interval(II)等于1 時(shí),需要兩個(gè)時(shí)鐘周期來(lái)獲取八個(gè)通道的輸入數(shù)據(jù)。當(dāng)新的八個(gè)輸入通道到來(lái)時(shí),由上一次輸入產(chǎn)生的16 個(gè)輸出通道將被清除,為了避免這種情況,輸入流必須暫停三個(gè)額外的周期來(lái)完成一次完整的輸入輸出操作,故共需五個(gè)周期。若加入FIFO 優(yōu)化,產(chǎn)生的輸出數(shù)據(jù)會(huì)逐步被發(fā)送,這樣便可以在任務(wù)層級(jí)流水化傳輸加速器的輸入和輸出數(shù)據(jù)。圖3 以三個(gè)任務(wù)為例,進(jìn)行該設(shè)計(jì)采用的流水化結(jié)構(gòu)與傳統(tǒng)設(shè)計(jì)的時(shí)序?qū)Ρ取?/p>
圖3 流水化與傳統(tǒng)設(shè)計(jì)時(shí)序?qū)Ρ?/p>
圖3 中,在任務(wù)級(jí)完成一次操作的時(shí)間(Ttask)包括從輸入寄存器讀取數(shù)據(jù)時(shí)間(Tin),在Processing Elements(PE)中進(jìn)行計(jì)算的時(shí)間(Tout)以及從PE 中讀取計(jì)算結(jié)果的時(shí)間(Tcmp),故傳統(tǒng)設(shè)計(jì)結(jié)構(gòu)完成三次任務(wù)需要的總時(shí)間(Tsum)如式(1)所示:
流水化之后完成三次任務(wù)的總時(shí)間(Tpip_sum)如式(5)所示:
顯然,Tpip_sum<Tsum。
在卷積IP 運(yùn)行過(guò)程中,首先加載輸入權(quán)重?cái)?shù)據(jù);其次進(jìn)行輸入圖像數(shù)據(jù)加載,數(shù)據(jù)進(jìn)入行緩存區(qū)等待卷積計(jì)算;然后卷積計(jì)算按照滑窗的形式進(jìn)行,隨著滑動(dòng)窗口的移動(dòng)進(jìn)行乘累加運(yùn)算,計(jì)算完畢之后,進(jìn)行輸出通道的整合。在算法的設(shè)計(jì)中,引入輸入輸出通道折疊因子,以此適應(yīng)不同層的通道參數(shù),卷積IP 設(shè)計(jì)的偽代碼如算法1:
算法1 卷積層優(yōu)化偽代碼
該節(jié)對(duì)卷積層優(yōu)化算法的資源占用和延遲進(jìn)行估計(jì)。首先,由算法1 可以看出在設(shè)計(jì)中引入了流水線(xiàn)優(yōu)化。其initial interval(II)主要受三方面因素的影響:卷積操作的折疊因子(factor)、輸入輸出比(ratio)以及包括行緩存等其他操作(other)。II的數(shù)學(xué)表達(dá)式如式(6)所示:
式(7)為factor的計(jì)算公式,其中,P代表內(nèi)存分區(qū),輸出通道為N。由于HLS 工具會(huì)將行寄存器區(qū)綜合為2-portBRAM形式,在計(jì)算卷積的過(guò)程中會(huì)使能2×P個(gè)并行卷積核,但是64 bit 的DMA 一次只能夠處理四個(gè)輸入通道,所以需要4×N個(gè)卷積濾波器的通道,由此計(jì)算出factor:
As the PRN code-phase observables ofand,the mean and standard deviation of the carrier-phase observablesandgenerated by the PLL can be expressed as:
在上述II計(jì)算的基礎(chǔ)上,采用式(8)計(jì)算,可對(duì)卷積IP 的資源占用進(jìn)行估計(jì):
其中,M(x)為總的資源占用量。首先,進(jìn)行BRAM占用量的估計(jì)。以第一層卷積的分析為例,卷積窗的大小被設(shè)置為3,故行寄存器區(qū)一共有12 行,每一個(gè)BRAM能夠存儲(chǔ)1 000 個(gè)16 bit 的定點(diǎn)數(shù),故針對(duì)輸入圖像數(shù)據(jù)的BRAM占用如式(9)所示。針對(duì)權(quán)重?cái)?shù)據(jù)的存儲(chǔ),如式(10)所示;因此總的BRAM占用如式(11)所示:
其次,進(jìn)行DSP資源占用的分析。3×3 卷積需要9個(gè)DSP,所以在算法1 所示的卷積操作中,DSP的占用可以由式(12)得出:
數(shù)據(jù)處理的延遲由權(quán)重?cái)?shù)據(jù)處理延遲和輸入圖像數(shù)據(jù)處理延遲兩部分組成。在權(quán)重?cái)?shù)據(jù)處理階段,需要3 個(gè)周期來(lái)加載3×3 的權(quán)重?cái)?shù)據(jù);在輸入圖像數(shù)據(jù)處理階段,延遲與輸入圖像尺寸有關(guān),通常需要補(bǔ)零操作。此外,在算法的設(shè)計(jì)中,需要額外的一行延遲來(lái)使輸出的讀寫(xiě)達(dá)到流水線(xiàn)的效果,故關(guān)于延遲的計(jì)算如式(13)-(15)所示:
基于FPGA 的低功耗YOLO 加速器的整體架構(gòu)設(shè)計(jì)如圖4 所示。系統(tǒng)的軟件部分可分為PL(Programmable Logic)和PS(Processing System)兩部分。在PL 端,輸入特征圖和權(quán)重存儲(chǔ)在片外DDR 中,通過(guò)FPGA 的AXI4 接口傳入片上緩存,然后片上緩存的數(shù)據(jù)會(huì)傳入FPGA 的并行處理單元進(jìn)行計(jì)算,最后處理單元的計(jì)算結(jié)果會(huì)同樣通過(guò)AXI4 接口傳回片外DDR;在PS 端,集成的ARM CPU 將輸入輸出特征圖輸入到DDR 中,并且PS 端通過(guò)AXI4-Lite 總線(xiàn)下達(dá)DMA 與DDR 之間的數(shù)據(jù)傳輸命令,由DMA 控制器承擔(dān)著YOLO 加速器與片外DDR 間的數(shù)據(jù)搬運(yùn)工作[12-13]。CPU 通過(guò)AXI 總線(xiàn)讀取加速器的運(yùn)算結(jié)果,并在PS 端進(jìn)行圖像預(yù)處理和顯示。綜合PL 和PS 兩部分便形成了YOLO 加速器的整體架構(gòu)。
圖4 低功耗YOLO加速器整體架構(gòu)
在圖2(b)中給出了通道交錯(cuò)的整體數(shù)據(jù)流順序,為了進(jìn)一步說(shuō)明,圖5 中給出了卷積層流設(shè)計(jì)的具體結(jié)構(gòu)。在圖5 所示的結(jié)構(gòu)中,輸入寄存器包含四行數(shù)據(jù),額外的一行用于緩存上次計(jì)算產(chǎn)生的數(shù)據(jù),其他的三行數(shù)據(jù)傳入PE 中進(jìn)行計(jì)算,滑動(dòng)立方體按通道維度滑動(dòng),更新的數(shù)據(jù)進(jìn)入PE 進(jìn)行計(jì)算,Ti個(gè)3×3 的數(shù)據(jù)與3×3 的卷積核進(jìn)行計(jì)算,通過(guò)加法器計(jì)算出卷積結(jié)果,卷積的輸出結(jié)果進(jìn)入經(jīng)過(guò)簡(jiǎn)化的批歸一化層進(jìn)行量化和激活,最后將量化的結(jié)果傳入下一層進(jìn)行計(jì)算。
圖5 卷積層流設(shè)計(jì)具體結(jié)構(gòu)
此外,為了有效地獲取權(quán)重?cái)?shù)據(jù)來(lái)適應(yīng)通道折疊的計(jì)算,將權(quán)重?cái)?shù)據(jù)按照?qǐng)D6 的方式進(jìn)行預(yù)處理。權(quán)重塊的維度按照輸出通道、輸入通道、卷積內(nèi)核分布,需要To數(shù)量的卷積塊在To數(shù)量的PE 中進(jìn)行計(jì)算,其中每一個(gè)卷積塊又適用了Ti個(gè)輸入通道。因此,權(quán)重塊將按照卷積處理的方式進(jìn)行連續(xù)存儲(chǔ),進(jìn)而進(jìn)行后續(xù)的卷積加速運(yùn)算。
圖6 權(quán)重?cái)?shù)據(jù)預(yù)處理
為了減輕FPGA 片上資源的壓力,將權(quán)重?cái)?shù)據(jù)以及圖像數(shù)據(jù)存儲(chǔ)在DDR 中,但各層頻繁讀取DDR會(huì)導(dǎo)致數(shù)據(jù)傳輸?shù)难舆t。如圖7 所示,依據(jù)Tiny YOLOv3 網(wǎng)絡(luò)結(jié)構(gòu)中卷積層后面不同層的類(lèi)型對(duì)所有的層進(jìn)行分組。具體的分組操作,在Vivado SDK(Software Design Kit)軟件中通過(guò)編程實(shí)現(xiàn),將所有的層分成四組,通過(guò)開(kāi)關(guān)選擇對(duì)應(yīng)的組。通過(guò)層分組操作,可以降低頻繁讀取DDR 導(dǎo)致的數(shù)據(jù)延遲。
圖7 CNN層分組示意圖
通道折疊設(shè)計(jì)適用于資源有限的情況,在IP 設(shè)計(jì)過(guò)程中,最大通道數(shù)的設(shè)定通常會(huì)小于輸入輸出通道數(shù),將原始層分成子層將會(huì)更好地適應(yīng)IP 設(shè)計(jì),即進(jìn)行通道折疊。如圖8 所示,為了避免后續(xù)再次進(jìn)行通道交錯(cuò),所有的層都將分成子層進(jìn)行通道折疊。
圖8 通道折疊示意圖
軟件設(shè)計(jì)主要包含對(duì)ZYNQ 系統(tǒng)進(jìn)行初始化(對(duì)封裝好的IP 進(jìn)行初始化)和IP 核參數(shù)的設(shè)置,通過(guò)開(kāi)關(guān)設(shè)定層的連接關(guān)系,導(dǎo)入輸入數(shù)據(jù)以及導(dǎo)出輸出數(shù)據(jù)。系統(tǒng)軟件設(shè)計(jì)偽代碼如算法2 所示:
算法2 軟件設(shè)計(jì)偽代碼
該設(shè)計(jì)主要采用Vivado HLS 2019.1 進(jìn)行低功耗的YOLO 加速器的IP 設(shè)計(jì),高層次綜合可以將C/C++語(yǔ)言轉(zhuǎn)化成FPGA 需要的RTL 語(yǔ)言。加速器硬件模塊化設(shè)計(jì)在Vivado 2019.1 中進(jìn)行,最后,通過(guò)Xilinx SDK 軟件完成YOLO 加速器的軟硬件協(xié)同設(shè)計(jì)?;贔PGA 的低功耗YOLO 加速器設(shè)計(jì)部署在Xilinx Zedboard FPGA 平臺(tái)上,該平臺(tái)的主芯片是Zynq XC7Z020-CLG484-1,包 含512 MB 的DDR 和220個(gè)DSP。
如表1 所示,在完成相同設(shè)計(jì)功能的情況下,該設(shè)計(jì)與Intel CPU 相比加速了17 倍,與ARM CPU 相比加速了289 倍,具有良好的加速效果。
表1 該設(shè)計(jì)與CPU運(yùn)行分析比較
該文的計(jì)算性能和功耗比實(shí)驗(yàn)結(jié)果如表2 所示,實(shí)驗(yàn)表明,該文設(shè)計(jì)的功耗為3.4 W,總體的性能功耗比為10.45 GOPS/W。與此同時(shí)表2 也展示了與前人研究成果的比較。文獻(xiàn)[1]的功耗為170 W,性能功耗比為8.89 GOPS/W,該文的性能功耗比相對(duì)于原始GPU 設(shè)計(jì)提升了1.17 倍。該設(shè)計(jì)的功耗低于其他文獻(xiàn)方法。此外,文獻(xiàn)[15]的BRAMs、DSPs 和LUT-FF 的資源消耗分別為1 026、168、60k~86k,文獻(xiàn)[5]的BRAMs、DSPs和LUT-FF 的資源消耗分別為1 706、377、135k~370k,而該設(shè)計(jì)的BRAMs、DSPs 和LUT-FF 的資源消耗分別為185、160、26k~46k,顯著降低了硬件資源的消耗。
表2 研究性能比較
該文提出了一種基于FPGA 的低功耗YOLO 加速器設(shè)計(jì)。通過(guò)軟硬件協(xié)同優(yōu)化完成YOLO 加速器部署:運(yùn)用通道交錯(cuò)方法優(yōu)化卷積計(jì)算;使用層分組方法減少數(shù)據(jù)傳輸?shù)难舆t;利用通道折疊方式降低硬件資源消耗。在Xilinx 平臺(tái)上的驗(yàn)證結(jié)果表明,該設(shè)計(jì)在較低功耗和硬件資源消耗的情況下,具有良好的性能。因此,該文對(duì)有限資源情況下YOLO加速器邊緣部署的實(shí)現(xiàn)具有重要意義。