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