趙 洋,靳永強(qiáng),王藝鋼
(沈陽(yáng)化工大學(xué),遼寧 沈陽(yáng) 110142)
隨著各種深度學(xué)習(xí)算法在邊緣計(jì)算中的廣泛使用,多種深度神經(jīng)網(wǎng)絡(luò)硬件部署平臺(tái)應(yīng)運(yùn)而生[1-4]。當(dāng)前使用較為普遍的部署平臺(tái)包括:圖形處理單元(Graphics Processing Unit, GPU)、專用集成電路(Application Specific Integrated Circuit, ASIC)和現(xiàn)場(chǎng)可編程門(mén)陣列(Field Programmable Gate Array, FPGA)[5-8]。GPU 因具有優(yōu)秀的計(jì)算性能,在深度學(xué)習(xí)中有著較為廣泛的應(yīng)用[9-11]。優(yōu)秀的計(jì)算性能是建立在不考慮功耗、算力成本、部件散熱等因素的前提條件下的,因此GPU 在深度學(xué)習(xí)的訓(xùn)練過(guò)程以及云端部署中被廣泛使用。當(dāng)將GPU 作為邊緣計(jì)算平臺(tái)部署深度學(xué)習(xí)模型時(shí),功耗、成本、散熱等因素的影響使其難以應(yīng)用到嵌入式端。ASIC因具備高性能和低功耗的優(yōu)勢(shì),在嵌入式系統(tǒng)中有廣泛的使用[12-15]。但其靈活性低、開(kāi)發(fā)周期長(zhǎng)和成本較高等方面的缺點(diǎn)并不適于快速迭代的卷積神經(jīng)網(wǎng)絡(luò)。與ASIC 相比,F(xiàn)PGA同樣具有高性能、低功耗的優(yōu)勢(shì),而FPGA 成本較低,并且具有較強(qiáng)的可重構(gòu)性,能夠很好地適應(yīng)卷積神經(jīng)網(wǎng)絡(luò)的快速發(fā)展,因此更適合在嵌入式領(lǐng)域作為深度學(xué)習(xí)網(wǎng)絡(luò)部署的平臺(tái)[16-18]。
FPGA 具有可重構(gòu)、高性能、低功耗以及高性能產(chǎn)品的快速發(fā)展和更加靈活的架構(gòu)設(shè)計(jì)等特點(diǎn)。近年來(lái),越來(lái)越多的研究人員將注意力集中在基于FPGA 的深度學(xué)習(xí)硬件加速實(shí)現(xiàn)上。Yu 等[19]提出使用Winograd 快速算法,可在FPGA上實(shí)現(xiàn)加速卷積計(jì)算。雖然可以有效地降低片上資源的消耗,但該算法只適用于卷積核較小的卷積網(wǎng)絡(luò),對(duì)卷積核較大的卷積網(wǎng)絡(luò)的加速效果并不明顯。梅志偉等[20]提出了一種融合乘加樹(shù)與脈動(dòng)陣列的乘加陣列來(lái)加速卷積層的計(jì)算。該算法節(jié)省了硬件資源,并提高了計(jì)算性能,但對(duì)于數(shù)字信號(hào)處理單元DSP 的資源利用率并不高,并沒(méi)有充分使用硬件資源。上述研究所提出的各種方法,雖然實(shí)現(xiàn)了FPGA 的深度學(xué)習(xí)硬件加速的功能,但存在著不適用于卷積核較大的卷積網(wǎng)絡(luò)以及對(duì)片上資源利用率不高的現(xiàn)象。因此,針對(duì)以往在FPGA 硬件加速的過(guò)程中出現(xiàn)的這兩種現(xiàn)象,本文設(shè)計(jì)了一種基于輸入輸出通道并行組合的硬件加速器的方案。該方案中包括的標(biāo)準(zhǔn)卷積、點(diǎn)卷積、池化等硬件加速內(nèi)核模塊(Intellectual Property, IP)均采用流水線架構(gòu),對(duì)模型參數(shù)進(jìn)行參數(shù)量化處理,有效地節(jié)省片上資源,提高資源的利用率,并以YOLOv4-tiny 模型為例在FPGA 上部署實(shí)現(xiàn)。
目標(biāo)檢測(cè)在邊緣計(jì)算過(guò)程中應(yīng)用十分廣泛。目前,基于深度學(xué)習(xí)應(yīng)用在目標(biāo)檢測(cè)領(lǐng)域的主流算法有:SSD、RCNN、Fast RCNN、YOLO 等模型。這些網(wǎng)絡(luò)的模型計(jì)算規(guī)模大、參數(shù)多、計(jì)算復(fù)雜,不適合在資源較小的硬件加速平臺(tái)部署。YOLO 模型的精簡(jiǎn)版本YOLOv4-tiny 使用了13×13、26×26兩種尺度預(yù)測(cè)網(wǎng)絡(luò)對(duì)目標(biāo)進(jìn)行分類和回歸預(yù)測(cè)。YOLOv4-tiny 的網(wǎng)絡(luò)層數(shù)僅有38 層,其模型規(guī)模較小、參數(shù)量較少且檢測(cè)精度尚可,對(duì)硬件要求低,適合在硬件平臺(tái)資源較小的情況下進(jìn)行部署,提高了將目標(biāo)檢測(cè)方法部署在嵌入式系統(tǒng)或移動(dòng)設(shè)備上的可行性。
YOLOv4-tiny 的網(wǎng)絡(luò)結(jié)構(gòu)由主干特征提取網(wǎng)絡(luò)CSPDarknet53-tiny 和特征金字塔網(wǎng)絡(luò)(Feature Pyramid Networks, FPN)兩部分組成。YOLOv4-tiny 的模型結(jié)構(gòu)如圖1 所示。
圖1 YOLOv4-tiny 的模型結(jié)構(gòu)
CSPDarknet53-tiny 作為主干特征提取網(wǎng)絡(luò),由DarknetConv2D_BN_Leaky模塊和Resblock_Body模塊堆疊形成。其中,DarknetConv2D_BN_Leaky 模塊由二維卷積層DarknetConv2D、歸一化層BN 和激活函數(shù)LeakyReLU 三部分組成。Resblock_Body 模塊分為兩部分:一部分是模塊主干部分對(duì)殘差塊進(jìn)行堆疊得到輸出Feat1;另一部分是引入較大的殘差邊,經(jīng)過(guò)少量的處理后連接到Concat 模塊,對(duì)兩部分的輸出進(jìn)行通道維度上的堆疊,再經(jīng)過(guò)池化處理得到模塊的輸出Feat2。Resblock_Body 模塊結(jié)構(gòu)如圖2 所示。
圖2 Resblock_Body 模塊結(jié)構(gòu)
FPN 作為特征增強(qiáng)網(wǎng)絡(luò),主要解決的是目標(biāo)檢測(cè)中的多尺度問(wèn)題,一般分兩個(gè)步驟來(lái)構(gòu)建特征金字塔:(1)Feat2經(jīng)過(guò)1×1point-wish 卷積處理之后得到FPN 模塊的第一個(gè)輸出P1;(2)P1 再經(jīng)過(guò)1×1point-wish 卷積和上采樣處理與Feat1 在通道維度上進(jìn)行堆疊,得到FPN 模塊的第二個(gè)輸出P2。最后,將得到的兩個(gè)模塊P1 和P2 進(jìn)行卷積處理便可得到兩個(gè)用于邊界框預(yù)測(cè)的特征層YOLO Head1 和YOLO Head2。
ZYNQ 平臺(tái)是賽靈思公司推出的新一代的全可編程片上系統(tǒng)(All-Programmable SOC, APSOC)。相較于傳統(tǒng)的FPGA 平臺(tái),ZYNQ 平臺(tái)除了傳統(tǒng)的可編程邏輯(Programmable Logic, PL)部件外,還包括了以ARM CorteX-A9 為核心的處理系統(tǒng)(Processing System, PS)。ZYNQ 平臺(tái)將ARM 處理器的軟件可編程性與FPGA 的硬件可編程性進(jìn)行完美整合,使其既能夠在ARM 上部署操作系統(tǒng)和運(yùn)行軟件程序,也能夠利用FPGA 的并行性特點(diǎn)對(duì)軟件中需要并行加速的部分進(jìn)行加速,提高整個(gè)系統(tǒng)的性能;此外,也保留了嵌入式平臺(tái)的體積小、能耗低、靈活性強(qiáng)的特點(diǎn)。
高層次綜合(High-Level Synthesis, HLS)是賽靈思公司推出的FPGA 設(shè)計(jì)工具,它可以將高層次語(yǔ)言描述的邏輯結(jié)構(gòu)轉(zhuǎn)換成寄存器傳輸級(jí)(Register-Transfer Level, RTL)的電路模型。開(kāi)發(fā)者可以使用C、C++或SystemC 等高級(jí)語(yǔ)言對(duì)FPGA 進(jìn)行系統(tǒng)建模,極大地提升了其工作效率,緩解了設(shè)計(jì)復(fù)雜度。當(dāng)前FPGA 里有著大量成熟的、有固定功能和位置的IP 單元可以被HLS 工具充分利用,十分適合深度學(xué)習(xí)算法的快速驗(yàn)證。
本文設(shè)計(jì)的FPGA 端的硬件架構(gòu),主要由卷積模塊、池化模塊、重排序模塊、輸入輸出緩沖區(qū)、權(quán)重緩沖區(qū)、控制器模塊以及AXI4 接口組成。其結(jié)構(gòu)如圖3 所示。其中Feature Data Router 是緩沖區(qū)的數(shù)據(jù)路由邏輯。
圖3 硬件架構(gòu)
完成一次完整的加速過(guò)程,首先需要從外界通過(guò)AXI4接口總線向輸入緩存區(qū)讀寫(xiě)輸入特征圖數(shù)據(jù),向權(quán)重緩沖區(qū)讀寫(xiě)權(quán)重?cái)?shù)據(jù);控制器在接收到AXI4 接口總線開(kāi)始的信號(hào)后,加速器中的運(yùn)算模塊被激活。加速器將根據(jù)網(wǎng)絡(luò)模型架構(gòu)層次來(lái)順序激活各層的控制邏輯;在一層的計(jì)算被激活后,控制器通過(guò)控制信號(hào)控制讀取相應(yīng)的數(shù)據(jù),提供給運(yùn)算邏輯進(jìn)行對(duì)應(yīng)的運(yùn)算,再將運(yùn)算結(jié)果通過(guò)數(shù)據(jù)路由邏輯寫(xiě)入到輸出緩沖區(qū);一層計(jì)算結(jié)束時(shí),下一層計(jì)算被激活,依次進(jìn)行;最后將計(jì)算結(jié)果和運(yùn)算模塊結(jié)束信號(hào)通過(guò)AXI4 接口總線傳送到外界。
由于深度神經(jīng)網(wǎng)絡(luò)的參數(shù)量較大,F(xiàn)PGA 的片內(nèi)緩存空間難以將全部數(shù)據(jù)載入,因此本文通過(guò)雙緩存乒乓結(jié)構(gòu)的設(shè)計(jì),將參數(shù)分配到片外存儲(chǔ)器上;對(duì)圖像進(jìn)行識(shí)別時(shí),再?gòu)钠獯鎯?chǔ)器上讀取所需的數(shù)據(jù),即構(gòu)建兩塊存儲(chǔ)緩存區(qū),利用流水線的方式,交替進(jìn)行讀取操作,如圖4 所示。其中,t1為加速器讀取輸入數(shù)據(jù)的時(shí)間;t2為加速器獲取輸出數(shù)據(jù)的時(shí)間;t3為加速器輸出數(shù)據(jù)寫(xiě)入緩存區(qū)的時(shí)間。
圖4 雙緩存流水結(jié)構(gòu)
目標(biāo)檢測(cè)中使用的卷積神經(jīng)網(wǎng)絡(luò)主要使用的基礎(chǔ)單元包括卷積單元和池化單元。將目標(biāo)檢測(cè)模型YOLOv4-tiny 部署在FPGA 上的過(guò)程中,主要就是針對(duì)這兩個(gè)部分進(jìn)行優(yōu)化設(shè)計(jì)。
2.3.1 卷積單元設(shè)計(jì)
對(duì)模型中的卷積部分采用輸入、輸出特征圖間組合并行的策略。輸入特征圖數(shù)為Mi,輸出特征圖數(shù)為Nj,卷積核的大小為K,對(duì)輸入特征圖和輸出特征圖進(jìn)行二維展開(kāi)并行,單個(gè)周期內(nèi)相同位置的卷積窗口需要Mi×Nj個(gè)乘積累加運(yùn)算單元以及Nj個(gè)加法器,并行度為Mi×Nj。每個(gè)計(jì)算周期內(nèi),卷積模塊從存儲(chǔ)輸入特征圖的緩沖區(qū)讀取Mi個(gè)輸入特征值,同時(shí)讀入Mi×Nj個(gè)卷積核中特征圖相同位置的權(quán)重,進(jìn)行Mi×Nj次并行乘法運(yùn)算;復(fù)用Mi個(gè)輸入特征圖進(jìn)行乘法運(yùn)算,經(jīng)過(guò)Nj個(gè)加法樹(shù)累加后得到的卷積結(jié)果,存入相對(duì)應(yīng)的輸出緩存區(qū)。
卷積單元設(shè)計(jì)中大部分使用的是乘法器和加法器資源。在進(jìn)行卷積運(yùn)算時(shí),運(yùn)算邏輯資源的消耗與網(wǎng)絡(luò)選擇的數(shù)據(jù)精度密不可分。不同精度下,運(yùn)算邏輯資源的消耗見(jiàn)表1所列。
表1 資源消耗對(duì)比
2.3.2 池化單元設(shè)計(jì)
池化單元的算法原理與卷積單元類似,但池化運(yùn)算單元往往負(fù)責(zé)完成單一的特征圖計(jì)算,并且使用的是比較器,而非乘法器和加法器。其原理如圖5 所示。
圖5 池化操作原理
在圖5 所示的結(jié)構(gòu)中,每個(gè)時(shí)鐘周期池化單元讀取一個(gè)輸入特征圖數(shù)據(jù)并與比較器中的寄存器值進(jìn)行比較,再將比較的最大值存入寄存器中。在YOLOv4-tiny 算法中池化層的大小和步長(zhǎng)都為2,即K=S=2,經(jīng)過(guò)K2個(gè)周期后得到池化結(jié)果,將結(jié)果寫(xiě)入輸出緩存區(qū)中??紤]到池化單元消耗的資源較少,在此不再過(guò)多敘述。
本實(shí)驗(yàn)使用的是Xilinx PYNQ-Z2 開(kāi)發(fā)板(ARM 雙核Cortex-A9+FPGA),主芯片為ZYNQ XC7Z020-1CLG400C,其中FPGA 上DSP、LUT、BRAM_18K 和FF 的可用資源數(shù)分別為220、53 200、280 和106 400。此外,板上還包括一個(gè)ARM 雙核處理器和一個(gè)大小為512 MB 的DDR3 內(nèi)存。采用的神經(jīng)網(wǎng)絡(luò)模型是YOLOv4-tiny,數(shù)據(jù)集為VOC 數(shù)據(jù)集。使用Vivado HLS 2019.2 進(jìn)行卷積運(yùn)算單元和池化運(yùn)算單元的設(shè)計(jì),并生成對(duì)應(yīng)的IP 核,使用Vivado 2019.2 進(jìn)行綜合布局布線。
本文采用軟硬件協(xié)同的方式對(duì)YOLOv4-tiny 網(wǎng)絡(luò)模型進(jìn)行加速設(shè)計(jì),整個(gè)加速系統(tǒng)如圖6 所示,分為PS(Processor System)和PL(Programming Logic)兩部分。PS 端的ARM處理器主要負(fù)責(zé)對(duì)整個(gè)執(zhí)行流程的控制,包括數(shù)據(jù)預(yù)處理、配置模型參數(shù)和初始化加速系統(tǒng)。PL 端的FPGA 邏輯資源主要用于卷積、池化等的運(yùn)算。DDR 為片外存儲(chǔ)器、Block_RAM 為片上存儲(chǔ)器,PS 和PL 通過(guò)AXI 總線接口進(jìn)行交互。
圖6 系統(tǒng)架構(gòu)示意圖
輸入數(shù)據(jù)流經(jīng)過(guò)PS 端的預(yù)處理,將待輸入特征圖和權(quán)重參數(shù)存入片外存儲(chǔ)器DDR 上,PL 端通過(guò)AXI 總線從片外存儲(chǔ)器DDR 讀取數(shù)據(jù)至片上存儲(chǔ)器Block_RAM 后,將數(shù)據(jù)輸入到硬件加速模塊,進(jìn)行卷積、池化運(yùn)算,計(jì)算完成后將結(jié)果返回給Block_RAM,繼續(xù)返回給DDR 作為下一層網(wǎng)絡(luò)的輸入或結(jié)果輸出。
使用Vivado2019.2 進(jìn)行綜合布局布線后,其給出的資源消耗情況見(jiàn)表2 所列。其中,DSP 主要用于卷積、池化運(yùn)算模塊中乘法器和加法器的設(shè)計(jì),使用率為99.09%;其他運(yùn)算邏輯和控制邏輯均使用LUT,使用率為76.26%;BRAM_18k 主要用于輸入輸出緩沖區(qū)和權(quán)重值較大的權(quán)重緩沖區(qū),使用率為68.57%;對(duì)于權(quán)重值較小的權(quán)重緩沖區(qū)不適合使用BRAM,而是使用LUTRAM 資源來(lái)存儲(chǔ),使用率為40.78%;寄存器FF 的使用率為47.22%。
表2 FPGA 資源消耗情況
將本文設(shè)計(jì)與其他平臺(tái)實(shí)現(xiàn)的加速效果進(jìn)行比較,見(jiàn)表3所列。文獻(xiàn)[21]設(shè)計(jì)的YOLOv2-tiny 加速器,將卷積和池化操作相結(jié)合,減少加速器的片外訪存時(shí)間,功率為11.8 W,是本文加速器功率的3.96 倍。文獻(xiàn)[22]中是針對(duì)YOLOv3-tiny 設(shè)計(jì)的一種可配置的硬件加速器,使用的是Ultrascale+XCKU040 平臺(tái),其可用資源數(shù)是本文使用平臺(tái)的8 倍,但其消耗的片上資源是本設(shè)計(jì)的3.89 倍。
表3 與其他FPGA 平臺(tái)加速器設(shè)計(jì)的比較
本文從網(wǎng)絡(luò)模型參數(shù)和結(jié)構(gòu)方面進(jìn)行分析,對(duì)YOLOv4-tiny 模型進(jìn)行硬件加速設(shè)計(jì),對(duì)參數(shù)進(jìn)行了16 位定點(diǎn)量化處理,使用了卷積輸入輸出并行組合策略進(jìn)行加速。此外,使用乒乓雙緩存機(jī)制,提高帶寬利用率,減少傳輸時(shí)延;并在PYNQ-Z2 平臺(tái)上進(jìn)行板級(jí)驗(yàn)證,經(jīng)過(guò)對(duì)資源、性能等方面的綜合評(píng)估,該加速器的功耗為2.98 W,有效算力達(dá)到10.96 GOPs。與已有文獻(xiàn)中提及的在FPGA 部署深度學(xué)習(xí)算法的實(shí)驗(yàn)結(jié)果進(jìn)行比較發(fā)現(xiàn),本文設(shè)計(jì)的深度學(xué)習(xí)模型在邊緣計(jì)算平臺(tái)上的加速設(shè)計(jì)方案檢測(cè)精度最高、反應(yīng)時(shí)間最短、檢測(cè)效率最優(yōu)。