謝思璞,魏榕山
(福州大學(xué) 物理與信息工程學(xué)院,福建 福州 350108)
近年來,神經(jīng)網(wǎng)絡(luò)受到了廣泛熱議,成為了學(xué)術(shù)界和工業(yè)界的熱門議題,Google、Microsoft 和Facebook 等科技公司都建立了相關(guān)的研究小組,以探索CNN 的新架構(gòu)[1-3]。通過對(duì)CNN 架構(gòu)上的創(chuàng)新改善CNN 性能,利用空間和通道信息,結(jié)構(gòu)的深度和寬度以及多路徑信息處理等方法引起了廣泛的討論。
在眾多新型CNN 架構(gòu)中,基于寬度擴(kuò)展的多支并行的CNN 得到了國內(nèi)外學(xué)術(shù)屆的重視。KAWAGUCHI K等人提出網(wǎng)絡(luò)的寬度是影響網(wǎng)絡(luò)精度與準(zhǔn)確度的一個(gè)重要指標(biāo)[4]。通過在層中并行使用多個(gè)處理單元,可以得到比感知器更為復(fù)雜的映射。GoogLeNet 中的Inception模塊是一種典型的多支網(wǎng)絡(luò)架構(gòu),并使用了不同尺寸的卷積核[5]。2017 年,DEL COCO M 等人[6]利用多分支結(jié)構(gòu)引入了并行的多尺度分析,減小了神經(jīng)網(wǎng)絡(luò)的深度,克服了過擬合問題。拓寬網(wǎng)絡(luò)寬度的多支并行卷積神經(jīng)網(wǎng)絡(luò)在圖像分割以及識(shí)別等任務(wù)中,提高了網(wǎng)絡(luò)在不同尺度上的特征提取能力,受到了國內(nèi)外研究機(jī)構(gòu)的重視[7-9]。
如今,基于FPGA 的卷積神經(jīng)網(wǎng)絡(luò)加速器獲得越來越多的關(guān)注[10-13],目前大多數(shù)都以切片的方式,映射至加速器中逐一計(jì)算。如果使用相同配置的加速器對(duì)多分支網(wǎng)絡(luò)進(jìn)行加速,傳統(tǒng)映射多分支網(wǎng)絡(luò)計(jì)算會(huì)造成硬件資源的浪費(fèi)。沒有針對(duì)各分支網(wǎng)絡(luò)進(jìn)行差異化資源分配,多分支卷積神經(jīng)網(wǎng)絡(luò)在進(jìn)行時(shí)的并行效率也無法得到保證,這對(duì)整體網(wǎng)絡(luò)模型計(jì)算將造成影響。本文分析和探討了多分支卷積神經(jīng)網(wǎng)絡(luò)的性質(zhì)和特點(diǎn),并基于屋頂模型進(jìn)行設(shè)計(jì)空間的探索[14],設(shè)計(jì)出一種多分支卷積神經(jīng)網(wǎng)絡(luò)加速器。
本文將以應(yīng)用于HEVC 視頻編碼的幀內(nèi)劃分的多分支卷積神經(jīng)網(wǎng)絡(luò)ETH-CNN 為例,分析與探究多支卷積神經(jīng)網(wǎng)絡(luò)在參數(shù)差異影響下的硬件資源優(yōu)化問題[15]。如圖1 所示,該網(wǎng)絡(luò)由三支卷積神經(jīng)網(wǎng)絡(luò)協(xié)同工作,各分支的卷積神經(jīng)網(wǎng)絡(luò)經(jīng)過降采樣層、卷積層和全連接層后輸出。
圖1 ETH-CNN 圖示
由于各分支卷積層的輸入特征圖尺寸不同,那么各分支網(wǎng)絡(luò)卷積層的計(jì)算量也不同。以ETH-CNN 的各分支網(wǎng)絡(luò)參數(shù)(如表1 所示)進(jìn)行比較,經(jīng)計(jì)算后的結(jié)果可以看出各分支的操作數(shù)相差甚大,各分支網(wǎng)絡(luò)在進(jìn)行并行計(jì)算所需的I/O 帶寬以及硬件資源的分配需求不一樣。使用相同的加速器對(duì)多分支網(wǎng)絡(luò)進(jìn)行加速,各卷積層將依次調(diào)用加速器進(jìn)行計(jì)算,由于支與支之間卷積存在數(shù)據(jù)依賴,這將對(duì)整體網(wǎng)絡(luò)模型計(jì)算造成影響。為了提升整體算力,為多分支并行卷積神經(jīng)網(wǎng)絡(luò)專門定制一種加速平臺(tái)提供高性能計(jì)算是非常有必要的。
本文將選擇在卷積核的輸入輸出尺度上進(jìn)行循環(huán)拆分,拆分的因子為Tm、Tn。外部的循環(huán)則負(fù)責(zé)調(diào)度,主要的作用是控制數(shù)據(jù)從外部DDR 加載至FPGA 的BRAM 緩沖區(qū),將BRAM 數(shù)據(jù)寫入外部DDR,同時(shí)控制數(shù)據(jù)的復(fù)用。內(nèi)部的循環(huán)則負(fù)責(zé)生成FPGA 卷積計(jì)算單元。設(shè)計(jì)的卷積計(jì)算單元的并行度為Tm×Tn,并行Tm計(jì)算單元,每個(gè)計(jì)算單元中進(jìn)行Tn輸入數(shù)據(jù)與權(quán)重的乘累加操作,累加操作中采用加法樹結(jié)構(gòu)進(jìn)行累加。在本設(shè)計(jì)中利用卷積計(jì)算在輸入通道和輸出通道之間的獨(dú)立性,采用流水線操作,進(jìn)一步加大系統(tǒng)的吞吐量。
為了實(shí)現(xiàn)高并行度,神經(jīng)網(wǎng)絡(luò)加速器通常在大量計(jì)算單元之間重用數(shù)據(jù)。在本設(shè)計(jì)中,將數(shù)據(jù)路由到不同的計(jì)算單元,從而降低系統(tǒng)計(jì)算延遲,為此采取了“前-后-前”的調(diào)度模式,從而使輸入數(shù)據(jù)可以獲得更大的數(shù)據(jù)復(fù)用機(jī)會(huì)。原先輸入數(shù)據(jù)讀取遵循切分先后,調(diào)整后的訪問的次數(shù)將比原先少(Tn-1)次,從而可以減小數(shù)據(jù)的冗余訪問。在輸出復(fù)用的調(diào)度中,由于輸出的結(jié)果數(shù)組與輸入通道循環(huán)沒有相互依賴性,因此可以將寫入外部DDR 的輸出結(jié)果操作置于輸入通道循環(huán)外。此時(shí),計(jì)算單元無需先從外部DDR 讀取上次的輸出結(jié)果。輸出結(jié)果的中間值直接存儲(chǔ)在片上的BRAM 上,本次計(jì)算無需上一次的計(jì)算結(jié)果,直接從BRAM 上讀取數(shù)據(jù)進(jìn)行累加,從而可以將輸出數(shù)據(jù)的訪問次數(shù)減少。
在本設(shè)計(jì)中,還將采用雙緩沖機(jī)制,兩塊片上的緩存以乒乓機(jī)制進(jìn)行數(shù)據(jù)的讀取,從而可以讓數(shù)據(jù)的傳輸時(shí)間被計(jì)算單元的計(jì)算時(shí)間所覆蓋,使計(jì)算單元一直處在工作狀態(tài),提高系統(tǒng)的吞吐率。
圖2 加速器計(jì)算單元
圖3 雙緩沖機(jī)制
由于多支卷積神經(jīng)網(wǎng)絡(luò)計(jì)算是同時(shí)進(jìn)行的,計(jì)算和存儲(chǔ)訪問行為將變得更加復(fù)雜。在加速器的設(shè)計(jì)中,可以利用屋頂模型來解決多支網(wǎng)絡(luò)模型和硬件平臺(tái)相關(guān)的優(yōu)化問題。為了并行化循環(huán)的執(zhí)行,將循環(huán)展開,在硬件上并行化計(jì)算單元。硬件上并行化的參數(shù)稱為unroll參數(shù)。展開參數(shù)選擇不當(dāng)可能會(huì)導(dǎo)致嚴(yán)重的硬件未充分利用。以單循環(huán)為例,假設(shè)循環(huán)的循環(huán)邊界為M,并行度為m。硬件的利用率受的限制。
多支卷積結(jié)構(gòu)已在先前給出。本文為三支CNN 都設(shè)計(jì)了并行度不同的計(jì)算單元。在進(jìn)行一層計(jì)算時(shí),三個(gè)計(jì)算單元同時(shí)并行執(zhí)行,而對(duì)層與層之間的計(jì)算,則共用同一加速器,即加速器中含有三個(gè)并行的加速單元,分別對(duì)應(yīng)三支的CNN,而這個(gè)加速器是層與層之間的共用模塊。根據(jù)上文設(shè)計(jì)的卷積計(jì)算單元,分別對(duì)應(yīng)三支CNN 輸入輸出通道的拆分因子〈Tm,Tn〉進(jìn)行討論。從整個(gè)系統(tǒng)層面上來看,每次卷積的執(zhí)行周期與分支網(wǎng)絡(luò)中執(zhí)行周期最大的一支密切相關(guān)。
加速器的峰值性能的計(jì)算公式如式(1)所示。其中total operations 為多分支卷積神經(jīng)網(wǎng)絡(luò)計(jì)算總操作數(shù),execution cycles 為加速器的執(zhí)行周期,而在多分支CNN加速器中,卷積層的總執(zhí)行周期與分支網(wǎng)絡(luò)中執(zhí)行周期最大的一支密切相關(guān)。CTC Ratio 是單位內(nèi)存訪問可以執(zhí)行的操作數(shù),total data access 為片上計(jì)算的外部數(shù)據(jù)訪問量。在多分支CNN 加速器中,可以通過之前介紹的數(shù)據(jù)復(fù)用設(shè)計(jì),降低對(duì)片外訪存的次數(shù),從而提高系統(tǒng)的CTC Ratio。
確定了多分支網(wǎng)絡(luò)的并行策略后,要針對(duì)各項(xiàng)因素設(shè)立約束條件。由于加速器的計(jì)算峰值受到FPGA 片上DSP48E 計(jì)算資源的限制,因此其設(shè)計(jì)空間的限制條件為式(3)。此外,加速器的CTC Ratio 受到FPGA 片上BRAM的限制,所以其存儲(chǔ)空間的限制條件為式(4)。
此外,也需要對(duì)循環(huán)展開的利用率進(jìn)行約束,避免系統(tǒng)運(yùn)行時(shí)出現(xiàn)過多的硬件資源處于空閑狀態(tài)導(dǎo)致了硬件平臺(tái)的資源浪費(fèi),對(duì)系統(tǒng)執(zhí)行效率造成負(fù)面影響。為此,對(duì)各分支網(wǎng)絡(luò)的循環(huán)展開利用率進(jìn)行閾值約束,設(shè)α 為循環(huán)展開利用率,為其設(shè)定循環(huán)展開利用率閾值,舍去利用率值低的循環(huán)展開因子。
而在多分支卷積神經(jīng)網(wǎng)絡(luò)執(zhí)行過程中,雖然整體系統(tǒng)的執(zhí)行周期以各分支中執(zhí)行周期最長(zhǎng)的卷積神經(jīng)網(wǎng)絡(luò)為基準(zhǔn)。但是,為了協(xié)調(diào)各分支卷積神經(jīng)網(wǎng)絡(luò)層與層之間的計(jì)算與數(shù)據(jù)的交換,對(duì)分支網(wǎng)絡(luò)各卷積層的執(zhí)行時(shí)間進(jìn)行約束。根據(jù)式(6)可知,可以通過各分支計(jì)算操作數(shù)與展開因子作為評(píng)估條件,控制各分支網(wǎng)絡(luò)中最快執(zhí)行周期與最慢執(zhí)行周期的卷積神經(jīng)網(wǎng)絡(luò)差值,保證整體執(zhí)行效率處于最優(yōu)效果。
通過以上提出的峰值和CTC 率的計(jì)算方法,可以在屋頂模型中對(duì)不同的拆分因子〈Tm,Tn〉對(duì)系統(tǒng)造成的影響進(jìn)行量化以及比較,采用枚舉算法可以直觀地在屋頂模型中看到設(shè)計(jì)的性能優(yōu)劣。圖4 中的每一個(gè)點(diǎn)都代表三組拆分因子〈Tm,Tn〉,在FPGA 有限的資源和設(shè)計(jì)空間限制下對(duì)所有的合法的設(shè)計(jì)進(jìn)行了枚舉,從圖中可以直觀地看到每個(gè)設(shè)計(jì)所能達(dá)到的計(jì)算峰值、CTC 率以及當(dāng)前系統(tǒng)各分支并行度,每個(gè)點(diǎn)代表的是各分支網(wǎng)絡(luò)潛在展開因子。所有的設(shè)計(jì)被FPGA 平臺(tái)所能提供的計(jì)算峰值和帶寬所限制,即圖中的計(jì)算屋頂和帶寬邊界。
圖4 枚舉模型
由于本次設(shè)計(jì)的卷積計(jì)算單元是各卷積層之間通用的,即各分支的卷積層重復(fù)調(diào)用其特定的計(jì)算單元,因此需要統(tǒng)一的拆分因子。根據(jù)以上提出的方法,表1中列出了對(duì)于每個(gè)層來說最優(yōu)的解。根據(jù)執(zhí)行的周期數(shù),在本設(shè)計(jì)中對(duì)所有的有效設(shè)計(jì)進(jìn)行了枚舉以找到優(yōu)化的全局拆分因子。
表1 每層最優(yōu)解及統(tǒng)一拆分因子
圖5 是所設(shè)計(jì)的基于FPGA 的多支卷積神經(jīng)網(wǎng)絡(luò)加速器系統(tǒng)。由于FPGA 芯片的片上SRAM 不足以存儲(chǔ)所有權(quán)重及輸入輸出數(shù)據(jù),因此采用DDR 和片上存儲(chǔ)器的兩級(jí)存儲(chǔ)器層次結(jié)構(gòu),DDR4 DRAM 作為外部存儲(chǔ)器,用來存儲(chǔ)CNN 的輸入輸出數(shù)據(jù)及權(quán)重。
圖5 加速器整體架構(gòu)
通用CPU 用于初始化基于FPGA 的加速器和執(zhí)行時(shí)間的測(cè)量,通過AXI4Lite 總線配置FPGA 邏輯中的DMA,從而調(diào)度加速器的運(yùn)行,控制數(shù)據(jù)傳輸?shù)拇笮∨c格式。FPGA 中的DMA 則通過AXI4 總線讀取外部存儲(chǔ)DDR中的數(shù)據(jù)。為了提高數(shù)據(jù)的傳輸速率,DMA 與加速器之間的接口為FIFO,進(jìn)行數(shù)據(jù)的順序訪問,無需地址的判斷。由于是三支網(wǎng)絡(luò)同時(shí)進(jìn)行計(jì)算,因此并行了三個(gè)計(jì)算單元,UART模塊將加速器返回的結(jié)果傳送到主機(jī)。
為了評(píng)估本文的優(yōu)化策略,通過前面介紹的ETH-CNN模型在FPGA 平臺(tái)上構(gòu)建多分支CNN 加速器,并在FPGA上實(shí)現(xiàn)。系統(tǒng)設(shè)計(jì)使用Xilinx 公司的ZCU102 開發(fā)板進(jìn)行驗(yàn)證,芯片型號(hào)為XCZU9EG-2FFVB1156,F(xiàn)PGA 的工作頻率為200 MHz。作為對(duì)比,PC 平臺(tái)使用的是Intel i5-8300H CPU,主頻為2.3 GHz,并采用相同的網(wǎng)絡(luò)結(jié)構(gòu)及測(cè)試數(shù)據(jù)進(jìn)行仿真驗(yàn)證。實(shí)驗(yàn)結(jié)果如表2 所示。
表2 計(jì)算時(shí)間對(duì)比
最終的多分支CNN 加速器包含3 個(gè)加速單元,各單元并行計(jì)算不同分支的卷積輸出。輸入數(shù)據(jù)、輸出數(shù)據(jù)以及權(quán)重?cái)?shù)據(jù)的接口綜合為使用基于AXI 總線的HP 高性能接口,采用的是Scatter-gather模式的DMA。當(dāng)三支并行加速時(shí),總的資源利用率如表3 所示。
表3 多分支卷積神經(jīng)網(wǎng)絡(luò)加速器FPGA 資源利用率
此外,由于ETH-CNN模型較小,運(yùn)算量約為0.56 MOP,因此在FPGA 上實(shí)現(xiàn)的吞吐量有限。因此,也通過GoogLe-Net 的Inception3a 結(jié)構(gòu)來評(píng)估本文提出的多分支加速器映射方式,并與先前工作進(jìn)行了比較。LCP[18]通過模型參數(shù)和數(shù)據(jù)位置差異將其按層簇的方式進(jìn)行劃分,并行于FPGA 的不同分區(qū)實(shí)現(xiàn)加速。本文方法以支為界限劃分,將不同分支的卷積神經(jīng)網(wǎng)絡(luò)映射至FPGA 上并行執(zhí)行,通過資源互補(bǔ),采取不同的展開因子來配比各分支網(wǎng)絡(luò)。從表4 中可以看出,在32 bit 的測(cè)試基準(zhǔn)下,本文的工作取得了更有效的優(yōu)化,取得了257.01 GOPS 的性能表現(xiàn),性能為先前方法的1.31 倍。
表4 性能評(píng)估
本文提出了一種基于FPGA 的多分支CNN 加速器的綜合設(shè)計(jì)及優(yōu)化方法。在給定多分支CNN模型和FPGA 平臺(tái)下,鑒于加寬CNN 的結(jié)構(gòu)導(dǎo)致的計(jì)算量增大,數(shù)據(jù)流更為復(fù)雜,針對(duì)并行網(wǎng)絡(luò)進(jìn)行更仔細(xì)的優(yōu)化以及調(diào)度。利用屋頂模型進(jìn)行了設(shè)計(jì)空間的探索,充分運(yùn)用FPGA 中的資源,進(jìn)行并行性設(shè)計(jì)和流水線設(shè)計(jì)。實(shí)驗(yàn)結(jié)果表明,本文的工作相比先前方法進(jìn)一步提升了31%,取得了更有效的優(yōu)化。