鞏 杰,趙 爍,何 虎,鄧 寧
(清華大學(xué)微電子學(xué)研究所,北京 100084)
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)憑借強(qiáng)大的圖像處理能力,被廣泛應(yīng)用于圖像識(shí)別、目標(biāo)檢測(cè)[1-2]等多個(gè)領(lǐng)域,但同時(shí)其網(wǎng)絡(luò)規(guī)模、參數(shù)量與計(jì)算量不斷增加,如何將CNN 高效地部署至硬件平臺(tái)成為當(dāng)下重要的研究課題。
目前多數(shù)CNN 都是在CPU/GPU 平臺(tái)以32 位的浮點(diǎn)數(shù)形式進(jìn)行運(yùn)算,但CPU 在并行計(jì)算方面存在缺陷,并不適用于CNN 的計(jì)算,GPU 雖然在并行計(jì)算方面有巨大優(yōu)勢(shì),但是高能耗的特點(diǎn)導(dǎo)致其在便攜式移動(dòng)設(shè)備環(huán)境下也不適用?,F(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)不僅能滿足并行計(jì)算與低功耗的需求,而且還具有高度的靈活性,可適用于不同場(chǎng)景,因此,F(xiàn)PGA 可為CNN 部署提供有效的解決方案[3]。
在研究CNN 硬件加速方法的過程中,學(xué)者們一直力求于低功耗、高能效[4-5]。一種常見的方法是通過壓縮模型來達(dá)到減小模型體積和降低硬件資源消耗的目的。目前,使用更低位寬如8 位、16 位的定點(diǎn)數(shù)來表示原始的32 位浮點(diǎn)數(shù)進(jìn)行推理計(jì)算已經(jīng)被證明有效且得到廣泛應(yīng)用[6-8]。將高精度參數(shù)替換為低精度參數(shù)能有效降低存儲(chǔ)、內(nèi)存帶寬等硬件資源需求且?guī)缀醪挥绊懩P蜏?zhǔn)確率。在模型壓縮方面,學(xué)者們還使用網(wǎng)絡(luò)剪枝[9]、模型蒸餾[10]等方法來達(dá)到減少模型參數(shù)、提高計(jì)算效率的目的。另一種常見方法是通過面向CNN 中占比大的計(jì)算操作如卷積計(jì)算、全連接層計(jì)算、激活函數(shù)計(jì)算等設(shè)計(jì)專門的硬件進(jìn)行計(jì)算加速[11],主要有面向并行計(jì)算、針對(duì)數(shù)據(jù)通路的加速器設(shè)計(jì)等[12-14]。
針對(duì)目前浮點(diǎn)數(shù)CNN 模型規(guī)模和硬件資源消耗大的問題,本文設(shè)計(jì)一種通用的CNN 動(dòng)態(tài)定點(diǎn)量化方法及加速系統(tǒng),并以VGG-16 與ResNet-50 網(wǎng)絡(luò)為例部署至FPGA 平臺(tái)進(jìn)行實(shí)驗(yàn)驗(yàn)證。
CNN 的主要計(jì)算有卷積計(jì)算、全連接計(jì)算、批歸一化(Batch Normalization,BN)、激活函數(shù)、池化計(jì)算等。本文所選用的VGG-16 網(wǎng)絡(luò)包含13 層卷積層與3 層全連接層,ResNet-50 網(wǎng)絡(luò)包含49 層卷積層與1 層全連接層。對(duì)網(wǎng)絡(luò)參數(shù)與計(jì)算量進(jìn)行統(tǒng)計(jì)分析,由表1 可以看出,本文所選用的2 個(gè)網(wǎng)絡(luò)參數(shù)量都非常大,VGG-16 對(duì)一張圖片的推理所需乘加操作達(dá)到10G 級(jí),雖然ResNet-50 中的殘差連接一定程度上減少了計(jì)算量,但是對(duì)于通用處理器來說這樣的規(guī)模同樣巨大,因此,必須設(shè)計(jì)專用加速器。
表1 網(wǎng)絡(luò)參數(shù)與計(jì)算量Table 1 Parameters quantity and calculation quantity of the networks
為使加速器設(shè)計(jì)更有針對(duì)性,對(duì)網(wǎng)絡(luò)中各層所占用的運(yùn)行時(shí)間進(jìn)行分析。使用C 語言搭建2 個(gè)模型,選用單張3×224×224 像素大小的圖像作為輸入,分別進(jìn)行前向推理計(jì)算并統(tǒng)計(jì)運(yùn)算時(shí)間。由表2 可知,在CNN 中,絕大部分的計(jì)算操作都是卷積計(jì)算以及全連接層的計(jì)算,而全連接層實(shí)際上可以看作是特殊的卷積操作,本文重點(diǎn)在于對(duì)卷積參數(shù)做有效量化并結(jié)合硬件設(shè)計(jì)進(jìn)行加速計(jì)算。
表2 網(wǎng)絡(luò)各層計(jì)算量與運(yùn)行時(shí)間Table 2 Calculation quantity and running time of each layer in the networks
目前絕大多數(shù)的CNN 卷積操作都是按照卷積、BN、ReLU 的順序進(jìn)行的,引入BN 層的目的是在訓(xùn)練時(shí)加快模型收斂速度以及避免過擬合[15]。BN 的計(jì)算公式如式(1)所示:
其中:γ為縮放因子;μ和σ2為當(dāng)前Batch 的均值和方差;xi為卷積計(jì)算結(jié)果;ε為防止分母為0 所添加的十分小的正數(shù);β為偏置。由式(1)可以看出,在前向推理計(jì)算時(shí),BN 層增加了不必要的參數(shù)量,同時(shí)還會(huì)消耗一定的硬件資源。為了加快計(jì)算速度,本文將卷積與BN 層的參數(shù)進(jìn)行融合。卷積計(jì)算公式如式(2)所示:
其中:Wconv為卷積核參數(shù);bconv為偏置。同時(shí),將式(1)改寫為式(3)所示形式:
BN 的輸入實(shí)際為卷積計(jì)算的輸出,因此,將式(2)、式(3)合并,得到卷積和歸一化融合后的式(4):
量化這一方法在神經(jīng)網(wǎng)絡(luò)加速運(yùn)算的研究領(lǐng)域很常見,目前常用的量化方法主要分為基于碼本的量化與定點(diǎn)量化兩種[16-18]?;诖a本的量化是將張量中的每個(gè)值通過縮放因子與零值映射到一個(gè)有限集合的某個(gè)元素,此集合即為碼本。定點(diǎn)量化是將單精度浮點(diǎn)網(wǎng)絡(luò)參數(shù)以低位定點(diǎn)數(shù)來替代。以VGG-16 為例,其網(wǎng)絡(luò)參數(shù)與層間結(jié)果分布如圖1 所示。
圖1 VGG-16 網(wǎng)絡(luò)數(shù)據(jù)分布Fig.1 Data distribution of VGG-16 network
從圖1 可以看出,VGG-16 網(wǎng)絡(luò)中不同層的參數(shù)范圍有較大出入,并且層間結(jié)果相對(duì)于網(wǎng)絡(luò)參數(shù)來說都過大。因此,本文采用動(dòng)態(tài)定點(diǎn)量化方法,即針對(duì)不同結(jié)構(gòu)選擇合適的參數(shù)分別對(duì)其進(jìn)行量化以達(dá)到最優(yōu)效果。為了避免量化位寬不夠的情況,通過式(5)的方法尋找合適的整數(shù)位:
其中:x為待量化數(shù);lint為整數(shù)位長(zhǎng)度。由此可以得到小數(shù)位長(zhǎng)度lfloat=lbw-lint,其中,lbw為量化后位寬。
圖2 為2 個(gè)8 位定點(diǎn)數(shù)的例子。上半部分的小數(shù)位為4,其表示的數(shù)為22+21+2-1+2-2+2-4=6.812 5。下半部分的小數(shù)位為-1,其表示的數(shù)為27+26+24+23+21=218。通過小數(shù)位所在位置,能夠有效地將定點(diǎn)數(shù)還原至其十進(jìn)制數(shù)值,同時(shí)在后續(xù)過程中使用定點(diǎn)8 位數(shù)替代浮點(diǎn)數(shù)運(yùn)算。
圖2 8 位定點(diǎn)數(shù)結(jié)構(gòu)Fig.2 Structure of 8 bit fixed-point
對(duì)待量化參數(shù)進(jìn)行量化處理,如式(6)所示:
其中:s為符號(hào)位值;x為有效位值。
基于上文提出的動(dòng)態(tài)定點(diǎn)量化方法設(shè)計(jì)加速器結(jié)構(gòu),如圖3 所示。加速器主要包含控制器、片上緩存、傳輸單元、計(jì)算核4 個(gè)部分,其中:控制器通過總線從CPU 獲取數(shù)據(jù)傳輸、緩存、計(jì)算的相關(guān)配置信息并分別進(jìn)行配置,保證整個(gè)計(jì)算流程穩(wěn)定、準(zhǔn)確;片上緩存暫存來自DDR 的輸入和網(wǎng)絡(luò)權(quán)重以及計(jì)算輸出數(shù)據(jù);傳輸單元用于傳輸內(nèi)存與偏上緩存間的數(shù)據(jù);計(jì)算核則完成整個(gè)加速過程的核心計(jì)算。
圖3 加速器計(jì)算結(jié)構(gòu)Fig.3 Computing structure of accelerator
片上緩存主要分為輸入、輸出和權(quán)重的緩存,計(jì)算核中同時(shí)還有暫存卷積計(jì)算中間結(jié)果的緩存和暫存定點(diǎn)處理模塊輸入數(shù)據(jù)的緩存。數(shù)據(jù)緩存能有效地降低DDR 和加速器的數(shù)據(jù)傳輸頻率,不但能滿足卷積核參數(shù)復(fù)用的需求,而且還能降低數(shù)據(jù)搬運(yùn)的能耗。
輸入輸出與權(quán)重的緩存分別使用2 個(gè)不同的傳輸單元控制以提高數(shù)據(jù)傳輸?shù)牟⑿卸?,其中?quán)重的數(shù)據(jù)傳輸采用ping-pong 模式進(jìn)行,即同時(shí)進(jìn)行DDR 到緩存的數(shù)據(jù)傳輸和計(jì)算核的加速計(jì)算,提高了加速效率。
計(jì)算核是加速器的核心模塊,包含3 個(gè)子模塊,分別為MAC 模塊、量化處理模塊(Quantization Process Module,QPM)和激活函數(shù)模塊,其結(jié)構(gòu)如圖4 所示。
圖4 計(jì)算核結(jié)構(gòu)Fig.4 Structure of computing core
MAC 模塊主要由乘加陣列構(gòu)成,其作用為將卷積核與對(duì)應(yīng)輸入特征映射的部分乘加結(jié)果與其對(duì)應(yīng)通道的部分乘加結(jié)果累加,通過提高卷積計(jì)算并行度和陣列循環(huán)展開計(jì)算來提高計(jì)算效率。
QPM 為量化處理模塊,主要負(fù)責(zé)量化運(yùn)算,具體由移位、加偏置、舍入和截?cái)? 個(gè)部分組成。QPM計(jì)算過程如圖5 所示,為了避免溢出,卷積乘加結(jié)果以32 位形式暫存,與偏置求和時(shí),因?yàn)槎c(diǎn)數(shù)小數(shù)點(diǎn)位置不同,所以需要先進(jìn)行移位操作使兩者小數(shù)位相同,再進(jìn)行加操作,隨后判斷是否有進(jìn)位產(chǎn)生,最后移位至小數(shù)點(diǎn)位置與輸出小數(shù)點(diǎn)位置相同并截?cái)嘀? 位位寬,完成一次卷積計(jì)算,這樣整個(gè)計(jì)算流程都是以定點(diǎn)數(shù)形式進(jìn)行,而不需要將定點(diǎn)數(shù)反量化為浮點(diǎn)數(shù)再進(jìn)行計(jì)算。
圖5 加速器量化計(jì)算流程Fig.5 Quantization computing process of accelerator
激活函數(shù)運(yùn)算模塊由控制信號(hào)決定進(jìn)行ReLU、LeakyReLU 和ByPass 中的一種操作。其中:ReLU由選擇器實(shí)現(xiàn),當(dāng)輸入小于0 時(shí),輸出為0,否則保持不變;LeakyReLU 由選擇器與移位器實(shí)現(xiàn),即輸入小于0 時(shí),將數(shù)據(jù)右移3 位得到輸出值。
最終設(shè)計(jì)的CNN加速器片上系統(tǒng)(System on Chip)結(jié)構(gòu)SoC如圖6所示,主要包含DDR,Zynq系統(tǒng)和可擴(kuò)展的加速器等模塊,其中,數(shù)據(jù)通過AXI4-Full總線傳輸,控制信號(hào)通過AXI4-Lite總線傳輸。為了提高計(jì)算效率,將計(jì)算核的數(shù)量擴(kuò)展至4個(gè),SRAM 的大小也相應(yīng)提高為原來的2倍,總算力相較于單核加速器提升近4倍。
圖6 多核擴(kuò)展加速器SoC 結(jié)構(gòu)Fig.6 SoC structure of multi-core expansion accelerator
使用基于caffe深度學(xué)習(xí)框架的VGG-16與ResNet-50 預(yù)訓(xùn)練模型,以ImageNet ILSVRC2012 為數(shù)據(jù)集,單張圖片大小設(shè)置為3×224×224 像素進(jìn)行量化,得到不同位寬下網(wǎng)絡(luò)Top-1 準(zhǔn)確率,如圖7 所示。
圖7 Top-1 準(zhǔn)確率隨量化位寬的變化趨勢(shì)Fig.7 Change trend of Top-1 accuracy with quantization bit
從圖7 可以看出,將卷積權(quán)重和中間結(jié)果量化為8 位,全連接層權(quán)重量化為4 位,可以在Top-1 準(zhǔn)確率損失較小的情況下實(shí)現(xiàn)更大的壓縮率,因此,實(shí)驗(yàn)采用上述量化方案,量化結(jié)果見表3??梢钥闯?,2 個(gè)網(wǎng)絡(luò)的Top-1 準(zhǔn)確率損失均在1%以內(nèi),VGG-16 和ResNet-50分別壓縮為原來的13.8%和24.8%,表明本文量化方法效果顯著。
表3 量化結(jié)果Table 3 Quantization results
提取量化后的模型參數(shù),使用C 語言搭建前向推理計(jì)算網(wǎng)絡(luò)模型,輸入量化后的ImageNet ILSVRC2012 驗(yàn)證集。使用Vivado 搭建本實(shí)驗(yàn)的仿真環(huán)境并將生成的bitstream 文件導(dǎo)入XilinxZCU102開發(fā)板,處理器與加速器的工作頻率分別為100 MHz 和300 MHz。之后在VivadoSDK 中實(shí)現(xiàn)網(wǎng)絡(luò),輸入圖像進(jìn)行預(yù)測(cè)。
加速器SoC 各資源利用情況如表4 所示。本文加速系統(tǒng)運(yùn)行VGG-16 的性能與其他加速器的比較如表5 所示??梢钥闯?,在300 MHz 工作頻率下,VGG-16 和ResNet-50 完成單張圖片推理所需時(shí)間分別為166.2 ms 與109.6 ms,與其他FPGA 的實(shí)現(xiàn)相比,本文系統(tǒng)在峰值性能和能效上均有較大提升,其中峰值性能最高可達(dá)614.4 GOPs,提升了4.5 倍,能耗比達(dá)113.99 GOPs/W,提升了4.7 倍。
表4 加速器SoC 各資源利用情況Table 4 Utilization of each resource in accelerator SoC
表5 加速性能對(duì)比Table 5 Acceleration performance comparison
本文通過對(duì)CNN 的參數(shù)結(jié)構(gòu)和計(jì)算特性進(jìn)行分析,設(shè)計(jì)一種通用的動(dòng)態(tài)定點(diǎn)量化與計(jì)算加速系統(tǒng),并對(duì)計(jì)算核進(jìn)行4 核擴(kuò)展以提高加速性能。在ImageNet ILSVRC2012 數(shù)據(jù)集上進(jìn)行性能測(cè)試,結(jié)果表明,量化后網(wǎng)絡(luò)的Top-1 準(zhǔn)確率損失在1%以內(nèi),VGG-16 和ResNet-50 網(wǎng)絡(luò)模型分別壓縮至原來的13.8%和24.8%。與其他加速系統(tǒng)相比,本文設(shè)計(jì)的加速系統(tǒng)峰值性能達(dá)614.4 GOPs,最高提升4.5 倍,能耗比達(dá)到113.99 GOPs/W,最高提升4.7 倍。后續(xù)將優(yōu)化量化方法,并將計(jì)算核擴(kuò)展至8 核,進(jìn)一步提升加速系統(tǒng)的整體性能。