雷小康,尹志剛,趙瑞蓮
(1.北京化工大學信息科學與技術(shù)學院,北京 100029;2.中國科學院自動化研究所,北京 100190)
(*通信作者電子郵箱zhigang.yin@ia.ac.cn)
近年來,人工神經(jīng)網(wǎng)絡在日常生活中的應用越來越廣泛,卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)是一種源自人工神經(jīng)網(wǎng)絡的機器學習算法,它簡化了傳統(tǒng)識別算法中復雜的特征提取和數(shù)據(jù)重建的過程,在視頻監(jiān)控、機器視覺、圖像搜索、模式識別等領(lǐng)域得到越來越廣泛的應用。
隨著深度學習的普及和Caffe、Tensorflow、Torch 等深度學習框架的成熟,卷積神經(jīng)網(wǎng)絡模型的識別精度越來越高。比較有名的有:LeNet-5[1]手寫數(shù)字識別卷積神經(jīng)網(wǎng)絡,精度達99%以上;AlexNet[2]模型和VGG-16[3]模型的提出突破了傳統(tǒng)圖像識別的精度;GooLeNet[4]和ResNet[5]推動了卷積神經(jīng)網(wǎng)絡的應用,但是卷積神經(jīng)網(wǎng)絡參數(shù)也隨之越來越多,龐大的計算量導致CNN 模型很難移植到手機端或嵌入式芯片中。因此,如何在保證卷積神經(jīng)網(wǎng)絡模型精度的前提下,對深度卷積神經(jīng)網(wǎng)絡進行壓縮和加速,并在嵌入式設備上部署,已成為一個重要的研究課題。
早期有學者提出了一些CNN 模型壓縮方法,如:Denil等[6]使用低秩分解的方法減少了深層網(wǎng)絡模型的動態(tài)參數(shù)數(shù)量;Sainath 等[7]研究了深度神經(jīng)網(wǎng)絡中最終加權(quán)層的低階矩陣分解方法以進行聲學建模。但是低秩分解方法計算成本高昂,并且需要大量的重新訓練來達到收斂。自2016 年以來Han 等[8-10]提出通過設定閾值來修剪權(quán)值參數(shù),結(jié)合K-Means聚類和霍夫曼編碼進一步壓縮網(wǎng)絡,達到網(wǎng)絡稀疏化的目的;Iandola 等[11]提出Fire Module 模型結(jié)構(gòu),用更小的卷積核代替較大的卷積核,通過減少參數(shù)數(shù)量進行模型壓縮。這兩種方法雖然減少了網(wǎng)絡參數(shù),但是卷積計算仍然采用浮點數(shù)卷積運算,計算復雜度并沒有降低。
Gysel[12]提出一種對卷積神經(jīng)網(wǎng)絡定點化仿真的工具Ristretto,將浮點數(shù)仿真表示為定點數(shù),采用一系列CNN 模型定點化方法,研究不同定點化模型與精度損失之間的關(guān)系;Rajasegaran 等[13]提出膠囊網(wǎng)絡,采用3D 動態(tài)路由卷積算法,雖然一定程度上減少了參數(shù)數(shù)量,但是CNN 模型參數(shù)依然使用浮點數(shù)存儲,卷積計算采用浮點數(shù)卷積運算,模型參數(shù)的存儲大小不變,無法在嵌入式硬件上實現(xiàn)。Zhao 等[14-16]提出基于現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)的卷積神經(jīng)網(wǎng)絡加速方法,將CNN 參數(shù)定點量化,但是沒有考慮成本較低的硬件資源的限制。
FPGA 是一種集成電路,包含大量的定點計算單元,與圖形處理器(Graphics Processing Unit,GPU)相比,F(xiàn)PGA 具有低功耗低成本的特點,并且在大多數(shù)情況下能達到GPU 相近的加速效果。
綜合上述研究,本文針對傳統(tǒng)浮點數(shù)卷積計算復雜度高、浮點模型占用存儲空間大以及運行速度慢的問題,提出一種基于FPGA 的優(yōu)化定點卷積計算方法。本文的主要工作包括以下幾個方面:
1)本文通過設計動態(tài)定點量化方法,將浮點CNN 模型的權(quán)值參數(shù)和各層特征圖參數(shù)動態(tài)量化為定點模型;
2)考慮數(shù)據(jù)的存儲方式及卷積核的特點,將參數(shù)量化為7-bit,設計參數(shù)復用和流水線卷積計算方法,在精度損失很小的情況下,卷積計算速度加速比達到18.69。
為提高訓練結(jié)果的準確性,卷積神經(jīng)網(wǎng)絡在訓練過程中一般會使用多種優(yōu)化方法,但是,在模型訓練完成之后的前向推理過程,預先對卷積神經(jīng)網(wǎng)絡模型參數(shù)進行處理,可以減少前向推理的計算量,有利于對模型定點量化,提高運算速度。
卷積神經(jīng)網(wǎng)絡一般包含輸入層、卷積層、激活層和全連接層。本文采用的CNN 模型包括輸入和權(quán)值參數(shù)的卷積計算、批量歸一化、激活層和池化層,最后一層使用YOLO[17]層檢測目標的坐標位置。
卷積計算本質(zhì)上是大量數(shù)據(jù)的乘累加操作,公式如下:
其中:m為輸入特征圖個數(shù);n為卷積計算后輸出特征圖個數(shù);為第l層的第j個特征圖;wij為第i通道的第j個權(quán)值參數(shù)矩陣。
目前大多數(shù)CNN 模型在訓練時都會在每個卷積層后面增加批量歸一化(Batch Normalization,BN)層[18]。BN 層用于將數(shù)據(jù)歸一化,可以有效解決梯度爆炸問題,加速網(wǎng)絡收斂,并且可以解決過擬合的問題,一般放在卷積層之后,計算公式如下:
其中:γ為縮放因子;μ為均值;σ2為方差;φ為很小的正數(shù),本文取值為10-6;β為偏置;為式(1)中卷積計算結(jié)果;為經(jīng)過BN計算后的結(jié)果。
激活層本文采用ReLU 函數(shù)作為激活函數(shù),計算公式如下:
本文池化層使用最大值池化。
BN 層在訓練時起到了積極作用,但是會導致在網(wǎng)絡前向推理時多了一層運算,占用了更多的計算資源,在一定程度上會降低運算速度。因此,本文將BN 層的參數(shù)合并到卷積層的權(quán)值參數(shù)中,來提升模型前向推理的計算速度。依據(jù)式(1)~(2)可得:
展開后得到:
經(jīng)過變換,卷積計算和BN 計算由式(1)~(2)轉(zhuǎn)化為式(6),每一次的卷積計算都減少了開方和除法操作,一定程度上可以加速卷積計算。
參數(shù)預處理將卷積神經(jīng)網(wǎng)絡簡化為只包含卷積層、池化層和激活層,主要計算量在卷積層,本文針通過對卷積層的權(quán)值和輸入特征參數(shù)定點量化,將卷積層的浮點卷積計算轉(zhuǎn)換為高效的定點卷積計算,提高運算速度。
在FPGA 中浮點運算相較于定點運算要耗費數(shù)倍的資源和時間,統(tǒng)計不同網(wǎng)絡模型權(quán)值參數(shù)的分布可以發(fā)現(xiàn),不同CNN 模型的權(quán)值大致對稱分布在零值兩側(cè),且不同卷積層的權(quán)值參數(shù)具有顯著的動態(tài)范圍,在對其定點量化[12]時,若將所有層的參數(shù)量化為同一個范圍,會造成較大的精度損失。
本文設計動態(tài)指數(shù)定點量化的方式對權(quán)值參數(shù)進行量化,在對每一層參數(shù)進行量化時,將每層參數(shù)分組為具有指數(shù)為常數(shù)fl的組中,分配給小數(shù)部分的位數(shù)在該組內(nèi)是恒定的,但與其他組相比是不同的。每個網(wǎng)絡層分為三組,分別用于層輸入、權(quán)重、層輸出,可以更好地覆蓋每層輸入?yún)?shù)和權(quán)重參數(shù)的動態(tài)范圍。
圖1 權(quán)值參數(shù)動態(tài)定點量化Fig.1 Dynamic fixed-point quantization of weight parameters
動態(tài)定點量化計算公式如式(7)所示:
其中:B是量化的位寬長度;s是符號位;fl是不同卷積層的量化指數(shù)位長度;是定點數(shù)的尾數(shù)部分。
卷積計算時使用定點化后的CNN 模型,卷積計算轉(zhuǎn)化為定點數(shù)的尾數(shù)部分進行乘累加運算,將運算的結(jié)果使用每層的量化尺度再進行量化,之后參與下一層的卷積計算,依此類推,直到完成所有的卷積計算。
在對輸入層數(shù)據(jù)量化時,由于每次傳入的圖片數(shù)據(jù)不一樣,每一層計算的輸出差異很大,因此每次的輸入不能直接確定量化范圍。卷積計算時,每層的輸入都計算量化位寬會增加前向推理運算時間。為了減少計算量并且保證精度損失不大,本文采用Kullback-Leibler(KL)散度來計算輸入?yún)?shù)定點化的尺度[19]。
首先構(gòu)建一種由32-bit 數(shù)據(jù)向n-bit 定點數(shù)的映射關(guān)系,該映射中的邊界并不是兩種數(shù)據(jù)類型的最大值(圖2(a)),而是設置一個閾值T(圖2(b)),將這個閾值與n-bit 定點數(shù)的最大值(例如8-bit 定點數(shù)最大為127)構(gòu)建映射關(guān)系,計算輸入尺度fl_in。
確定這種映射關(guān)系的閾值T和尺度采用KL 散度。不同的網(wǎng)絡閾值T和每層的尺度是不同的,32-bit 浮點數(shù)映射到n-bit 定點數(shù)相當于重新編碼信息,在選擇閾值T和尺度時應盡量保證減少信息的丟失,設置一個矯正數(shù)據(jù)集來進行輸入尺度的選取,計算最小化KL 散度來確定最佳尺度,如式(8)所示:
其中:P[x]和Q[x]是兩個離散概率分布;x為量化到不同位寬長度的參數(shù)個數(shù)。
當式(8)中KL 取最小值時,得到閾值T,通過式(9)計算得出每層參數(shù)的尺度fl_in:
圖2 輸入定點化閾值選擇策略Fig.2 Fixed-point threshold selection strategy of inputs
針對第2 章提出的CNN 定點化方法,考慮Arm 處理器與FPGA 之間的交互,設計了基于FPGA 的CNN 加速計算模型,如圖3 所示。本文提出的定點計算模型主要分為五個模塊,分別為參數(shù)量化模塊、參數(shù)加載模塊、輸入模塊、卷積計算模塊和輸出模塊。
圖3 定點計算模型Fig.3 Fixed-point computation model
參數(shù)量化模塊是預先計算定點CNN 模型,將定點后的參數(shù)存儲在文件中,卷積計算時,直接使用定點化后的參數(shù)文件。該模塊由三部分構(gòu)成:第一部分是卷積核(權(quán)值參數(shù))經(jīng)過量化器進行量化,量化方法使用2.1 節(jié)中的方法,計算出n-bit權(quán)值參數(shù)以及每層參數(shù)的尺度fl_w;第二部分是使用2.2節(jié)中的方法確定輸入量化尺度fl_in,經(jīng)過矯正數(shù)據(jù)集(k張圖片)計算出fl_in;第三部分使用2.1 節(jié)中的方法對偏置進行int-32量化,得到定點化后的偏置。根據(jù)fl_w和fl_in計算每層整體尺度fl,計算方法如式(10)所示:
其中:l指第l層卷積。
最后將定點化后的權(quán)值參數(shù)、尺度fl以及偏置存儲在文件中,得到定點化后的CNN模型。
在卷積運算時,需要將定點化后的CNN 模型參數(shù)文件加載到FPGA 內(nèi)部存儲器Block-RAM 中。本文使用vivado HLS工具設計讀取參數(shù)文件的接口,使用AXI(Advanced eXtensible Interface)高速總線接口,如圖4所示。
圖4 數(shù)據(jù)加載接口設計Fig.4 Data loading interface design
首先ARM 處理器將參數(shù)文件中的參數(shù)讀取到雙倍數(shù)據(jù)率同步動態(tài)隨機存取存儲器(Double Data Rate Synchronous Dynamic Random Access Memory,DDR)中,再將輸入?yún)?shù)、權(quán)值參數(shù)和輸出參數(shù)的地址通過AXI 總線配置到FPGA 中,F(xiàn)PGA 將數(shù)據(jù)讀取到Block RAM 中,一些接口配置信息存儲在Inf中,中間層計算結(jié)果存儲在Temp中。
輸入模塊是對輸入圖像像素值的預處理,RGB 三通道的圖像作為輸入,將圖像像素值利用2.2 節(jié)介紹的方法進行定點化,得到定點化后的輸入數(shù)據(jù)。
本文使用vivado HLS 高層次綜合工具完成FPGA 硬件編程部分,根據(jù)卷積計算特性,設計了一種卷積加速計算的方法。
首先考慮數(shù)據(jù)的復用。由于FPGA 內(nèi)部存儲資源有限,每個卷積核(權(quán)重參數(shù))會多次與特征圖進行卷積,所以在卷積計算前,將特征圖矩陣進行拆分,分批加載數(shù)據(jù),將大矩陣拆分為小的矩陣,再將小矩陣依次加載到FPGA的Block-RAM中緩存。本文使用的模型每一層的特征圖的長和寬均為16的倍數(shù),因此將每一層的特征圖拆分為邊長為16 的小矩陣,分批對16×16 的特征圖與3×3 的卷積核進行卷積計算,最終將計算結(jié)果合并在一起。
其次考慮卷積計算的流水線操作。加速卷積計算采用將3×3卷積核及拆分后的16×16小特征圖矩陣,循環(huán)展開及流水線卷積計算,偽代碼如下所示:
該模塊將3.4 節(jié)中卷積計算的結(jié)果合并到一個大矩陣中,作為下一層的輸入?yún)?shù),循環(huán)計算得到最后一層的計算結(jié)果,最后一層計算的結(jié)果返回到ARM 中參與YOLO 層的分類和檢測計算。
考慮本文方法需要在硬件FPGA 上實現(xiàn)加速計算,因此選擇C語言編寫的基于YOLO-V3深度學習框架Darknet,利用Xilinx的HLS工具將C語言綜合為硬件描述語言,縮短硬件開發(fā)周期。
本文在人臉數(shù)據(jù)集和船舶數(shù)據(jù)集兩個數(shù)據(jù)集上驗證,兩個數(shù)據(jù)集為Pascal VOC 格式的標準數(shù)據(jù)集。人臉數(shù)據(jù)集包含1 665 張1 280×720 的高清圖像,分別為5 個人不同角度的圖片,其中隨機選取1 278 張作為訓練集,剩余387 張作為測試集;船舶數(shù)據(jù)集包含7 618 張圖片,分為帆船、航母、貨船、游輪、游艇和戰(zhàn)艦六類,隨機選取5 484 張圖片作為訓練集,2 134 張圖片作為測試集。本文設計的CNN 模型為15 層的卷積網(wǎng)絡,模型大小為1 545 KB。
實驗分為兩部分:
第一部分使用不同量化位寬對參數(shù)定點化,分析不同量化位寬對精度的影響,計算模型的精度、召回率和平均準確率(mean Average Precision,mAP)。mAP 評價的是目標預測位置的準確率,mAP越大,預測的坐標位置越接近真實位置。
第二部分,針對定點化后的CNN 模型使用FPGA 加速前向推理計算,分析加速效果。該部分使用第一部分定點化效果較好的模型,使用vivado SDK 工具測試CNN 模型在ARM 上的運行速度,使用vivado HLS 綜合工具,設計FPGA 加速方法,測試CNN模型的加速效果。
針對實驗的第一部分,考慮不同量化位寬對精度、召回率和mAP的影響,針對人臉數(shù)據(jù)集進行驗證,結(jié)果如表1所示。
表1 不同量化位寬下的人臉數(shù)據(jù)集識別結(jié)果精度Tab.1 Recognition accuracy results under different quantization bit widths on face dataset
在船舶數(shù)據(jù)集上的驗證結(jié)果如圖5~6 所示。圖5 僅對權(quán)值進行定點化,圖5(a)為保持每層的輸入特征值原始位寬(32-bit)不變,每類平均準確率(Average Precision,AP)值隨量化位寬的變化情況;圖5(b)為mAP 值、精度和召回率隨量化位寬的變化情況。圖6 對輸入特征值和權(quán)值都進行定點化,圖6(a)為每層的輸入特征值和權(quán)值同時定點化,每類AP值隨量化位寬的變化情況;圖6(b)為每層的輸入特征值和權(quán)值同時定點化,mAP值、精度和召回率隨量化位寬的變化情況。
圖5 權(quán)值定點化結(jié)果Fig.5 Results of fixed-point processing of weights
由圖5~6可看出:本文方法在僅對權(quán)值定點化和對權(quán)值、輸入特征值同時定點化兩種方式下差異很小,可以滿足兩種不同的量化方式,具有較好的魯棒性。綜合表1 還可看出:權(quán)值和輸入?yún)?shù)量化位寬大于7-bit 時,精度和mAP 影響不大;量化位寬小于7-bit時,精度和mAP影響較大。
當權(quán)值參數(shù)壓縮到8-bit 或者7-bit 時,壓縮比率較大,且精度損失很小。考慮到使用的卷積核大小為3×3,一個卷積核占用63-bit,可以用一個64-bit 的數(shù)據(jù)類型一次性讀取一個完整的卷積核的數(shù)據(jù)進行運算,充分利用FPGA 資源,高效讀取數(shù)據(jù)。因此本文最終采用7-bit的定點模型作為FPGA 的加速目標,針對人臉檢測的CNN 模型定點量化后的CNN 模型大小由1 545 KB 壓縮為344 KB,壓縮后的權(quán)重參數(shù)文件大小約為原來的22%。
使用2.3 節(jié)數(shù)據(jù)復用和流水線計算方法,將代碼綜合成電路,硬件資源利用情況與文獻[20-21]方法對比如表2 所示,LUT(Look-Up-Table)利用率為54.7%,Block RAM 利用率為65.3%,DSP(Digital Signal Processor)資源中的乘加器利用率高達94.5%,可以看出本文方法較為充分地利用了FPGA的資源。
表2 資源利用情況 單位:%Tab.2 Resource utilization conditions unit:%
針對人臉檢測模型,與文獻[20-21]方法相比,采用本文方法,在功耗增加很小的情況下,F(xiàn)PGA具有更高的運算峰值,加速效果更好,實驗結(jié)果如表3所示。
針對不同平臺人臉檢測模型量化前后CNN 前向推理計算耗時如表4所示。將模型量化前、量化后和FPGA加速的結(jié)果進行對比,可以看出本文提出的方法對CNN 計算速度有較大提升,加速比為18.69。
表3 FPGA加速效果Tab.3 FPGA acceleration effect
表4 定點量化卷積加速效果Tab.4 Fixed-point quantization convolution acceleration effect
本文提出了一種基于FPGA 的卷積神經(jīng)網(wǎng)絡定點化加速計算方法,設計了卷積計算策略,并在FPGA 上驗證本文提出的方法的有效性。通過與現(xiàn)有的兩個工作進行比較,本文的方法有更高的運算峰值,同時,F(xiàn)PGA 資源利用率較高。最后通過在人臉數(shù)據(jù)集和船舶數(shù)據(jù)集上進行精度和計算速度測試,精度損失在可接受的范圍內(nèi),模型壓縮為原來的22%,速度提升了17.69 倍,一定程度上可以滿足嵌入式設備的需求。本文提出的方法是基于特定大小的卷積核(3×3)對CNN 模型進行定點化加速研究,針對卷積核大小不是3×3 的CNN 模型并不適用,后續(xù)的研究將考慮更通用的CNN 模型,針對更加通用的CNN模型定點化進行研究。