*
(1.西安交通大學電子與信息學部,西安 710049;2.西安交通大學人工智能學院,西安 710049)
隨著人工智能和云計算技術的快速發(fā)展,物體檢測技術逐漸應用到人們生活的方方面面。例如,車輛檢測在交通運輸和安防[1]、自動駕駛[2]等領域有著廣泛的應用。近年來卷積神經(jīng)網(wǎng)絡在物體檢測領域取得了許多重大的進展,新的網(wǎng)絡結構不斷涌現(xiàn),如R-CNN(Region-based Convolutional Neural Network)[3]、Faster-RCNN(Faster Region-based Convolutional Neural Network)[4]、SSD(Single Shot multibox Detection)[5]、YOLO(You Only Look Once)[6]等。這些新型的網(wǎng)絡不斷提升物體檢測的精度,但它們的參數(shù)和計算量也在急劇升高。受制于計算、訪存、功耗等諸多因素,通常很難將它們直接應用到車輛和無人機等移動嵌入式環(huán)境中。而將圖像上傳到云端進行檢測則需要高速穩(wěn)定的無線網(wǎng)絡支持,系統(tǒng)的可用性直接受制于通信的質量[7],而現(xiàn)有的網(wǎng)絡環(huán)境很難支撐這一方案。因此,神經(jīng)網(wǎng)絡的參數(shù)量和計算量逐漸成為衡量算法性能的重要指標,它們決定了算法能否部署于端側。
為了解決基于神經(jīng)網(wǎng)絡的物體檢測技術在端設備實際應用中的計算負荷和性能問題,現(xiàn)有方法主要采用兩類思路:一類是從網(wǎng)絡設計開始,采用例如可分離卷積或者組卷積等技術來降低模型的參數(shù),例如曠視的ShuffleNet[8]和Google 提出的MobileNet 系列[9-11];另一類是通過對已有網(wǎng)絡進行模型壓縮,從而降低網(wǎng)絡的參數(shù)與計算量。本文屬于第二類,從模型壓縮[12-25]和計算加速[26-33]兩方面入手研究YOLOv3(You Only Look Once v3)[34]在端側設備上的部署。Cheng 等[35]對這兩者進行了綜述,指出模型壓縮的主要手段包括網(wǎng)絡裁剪[12-17]、量化[18-22]和模型蒸餾[23-25]等。網(wǎng)絡裁剪[12-17]通過分辨網(wǎng)絡中各個部分參數(shù)的重要程度調整網(wǎng)絡結構,剔除不重要的參數(shù)。網(wǎng)絡量化[18-22]從數(shù)據(jù)表示層面對神經(jīng)網(wǎng)絡進行壓縮。神經(jīng)網(wǎng)絡的參數(shù)通常只占用浮點數(shù)范圍較小的一部分,因此使用浮點數(shù)表示神經(jīng)網(wǎng)絡參數(shù)存在很大的冗余。同時與整型運算相比,浮點數(shù)運算會消耗更多的硬件資源和計算時鐘。網(wǎng)絡蒸餾[23-25]在預訓的教師模型基礎上使用簡單的學生模型來學習老師模型中的信息,從而減少模型的參數(shù)數(shù)量。
計算加速[26-33]方面主要結合硬件資源和神經(jīng)網(wǎng)絡的計算過程來進行模型加速:一方面根據(jù)計算的過程,可以適當?shù)厥褂糜布赜械膮f(xié)處理器和單指令多數(shù)據(jù)流指令集來增加計算吞吐量[26];另一方面可以結合現(xiàn)場可編程邏輯門陣列(Field Programmable Gate Array,F(xiàn)PGA)[27-29]和專用集成電路(Application Specific Integrated Circuit,ASIC)[30]等硬件資源結合計算過程的數(shù)據(jù)流設計相適應的計算模塊,提升計算過程的數(shù)據(jù)吞吐量。
本文從神經(jīng)網(wǎng)絡壓縮和加速兩個方面同時入手對YOLOv3 網(wǎng)絡[34]在端側的部署進行研究,所提壓縮方法可以推廣到一般具有殘差連接的神經(jīng)網(wǎng)絡。本文的主要工作有:1)提出了一種針對殘差網(wǎng)絡的模型壓縮方法;2)設計實現(xiàn)了與ZYNQ 平臺相適配的計算流程,實現(xiàn)了計算的加速。本文所提的壓縮方法包括網(wǎng)絡裁剪和量化兩個方面,首先提出了一種針對殘差網(wǎng)絡的裁剪策略,將網(wǎng)絡剪枝分為通道剪枝和殘差鏈剪枝兩個粒度,解決了通道剪枝無法裁剪殘差連接的局限性。實驗結果表明,該方法與通道剪枝相比能夠進一步減少模型的參數(shù)和計算量。網(wǎng)絡量化方面,本文引入并改進了一種基于相對熵KL散度(Kullback-Leibler Divergence)[36]的量化方法,能夠在訓練過程中統(tǒng)計模型的參數(shù)分布并在訓練過程中計算量化造成的信息損失,從而優(yōu)化量化區(qū)間減少精度損失。實驗表明本文的壓縮方法能夠進一步降低模型量化過程造成的精度損失。
在計算加速方面,本文結合一種現(xiàn)有的FPGA 加速模塊ZynqNet[29]設計并改進了針對Xilinx公司ZYNQ平臺的8 bit卷積加速模塊,通過使用8 bit 整型數(shù)據(jù)減少了片上存儲和計算資源的消耗;然后,依據(jù)算法流程優(yōu)化了片上緩存結構和流水線,進一步提升了硬件模塊的計算性能;最后,結合Winograd[31]共享卷積計算的中間結果大量減少了計算資源的消耗。實驗結果表明,本文的方案能夠極大地提高了硬件計算卷積操作的性能,實現(xiàn)了比處理器(Central Processing Unit,CPU)和圖形處理器(Graphics Processing Unit,GPU)等設備更高的平均能耗比,單位功耗下的計算能力更強。
近年來卷積神經(jīng)網(wǎng)絡[1-6,34]在物體檢測等領域取得了非常好的效果,解決了傳統(tǒng)圖像檢測算法特征處理過程復雜、場景局限性強等問題,逐漸成為解決物體檢測問題的主流方法。研究表明,一些神經(jīng)網(wǎng)絡通過極少的模型參數(shù)也能取得不錯的檢測精度,這表明深度神經(jīng)網(wǎng)絡普遍存在過量的參數(shù)和大量的冗余計算,隨后研究人員開始關注神經(jīng)網(wǎng)絡的壓縮和冗余計算的裁剪。另一方面,體系結構和硬件設備加工工藝的發(fā)展,也使得ASIC、FPGA 等平臺的計算性能不斷提升,如何結合硬件平臺和神經(jīng)網(wǎng)絡計算過程也是一個重要的研究課題。接下來,將從三個方面簡要綜述本文涉及的技術和方法。
在模型剪枝方面,Han 等[13]在2015 年首次提出將網(wǎng)絡的連接性和權重分開訓練,經(jīng)過多次迭代后逐步裁剪模型尺寸。隨后Li 等[14]在2016 年提出一種針對卷積核的神經(jīng)網(wǎng)絡剪枝方法,在每個卷積核中通過l1范數(shù)度量卷積核對網(wǎng)絡貢獻度,并根據(jù)貢獻度對卷積核進行裁剪。針對裁剪過程信息損失大的問題,2017 年He 等[15]提出了一種基于Lasso 回歸的通道稀疏化剪枝策略,通過回歸和優(yōu)化實現(xiàn)了與直接裁剪相比更低的信息損失。Liu 等[16-17]提出并改進了一種基于稀疏化訓練和通道剪枝的模型裁剪方法,通過在訓練過程中添加稀疏懲罰系數(shù)使得最終的模型信息在通道層面更加集中,最后根據(jù)批歸一化層的γ參數(shù)裁剪通道,在訓練時極大地減少了模型的信息損失和參數(shù)冗余。
在模型量化方面,2015 年Han 等[18]提出一種基于共享權值的壓縮方法,通過對訓練好的模型的權重進行聚類,每個類別共享同一個數(shù)值,而后使用低比特數(shù)據(jù)索引權重,減少了參數(shù)體積。2016 年Courbariaux 等[19]提出一種參數(shù)僅由-1、1 構成的二值神經(jīng)網(wǎng)絡,直接訓練不可微的量化模型,在簡單的識別任務中取得了不錯的結果。Rastegari 等[20]提出的XNORNet將特征和卷積的權重全部二值化,通過二值邏輯進行快速推理,也獲得了類似的結果。文獻[21]和文獻[22]的工作均提出了一種基于整數(shù)的神經(jīng)網(wǎng)絡量化和訓練方法。其中文獻[21]在網(wǎng)絡訓練中通過浮點數(shù)模擬整數(shù)量化過程,實現(xiàn)了通用的量化模型訓練方法,解決了量化模型不能直接訓練的問題,在減少模型體積的同時充分利用了成本更低的整數(shù)運算。
在卷積運算加速方面,Vasilache 等[30]在2014 年提出了一種通過離散傅里葉變換的卷積加速方法,通過快速傅里葉變換算法將特征圖和權重轉換為頻域表示并利用乘法操作實現(xiàn)卷積,極大地減少了大卷積核計算的計算量。針對小卷積核計算的加速,Lavin等[31]提出一種基于Winograd變換的卷積計算加速方法,通過對特征圖和權重以及輸出做Winograd 變換將卷積轉換為點乘操作,在增加少量加法運算的同時極大地減少了卷積運算的乘法運算,優(yōu)化了計算的性能。Liu等[32]挖掘特征稀疏性,提出了稀疏Winograd 算法,進一步加速卷積的運算。Ioffe 等[33]提出了批歸一化的折疊方法,在模型推理時將歸一化操作與卷積層融合,減少推理過程不必要的計算。
本章以YOLOv3 網(wǎng)絡[34]為例對殘差神經(jīng)網(wǎng)絡的壓縮進行研究,并給出針對殘差網(wǎng)絡的壓縮方法。YOLOv3 使用的特征提取網(wǎng)絡是Darknet-53,它由五個串聯(lián)的殘差鏈[37]模塊組成,在特征提取的基礎上進行多尺度的網(wǎng)格劃分,結合Anchor機制直接對目標的位置和類別進行回歸預測。本文研究包括網(wǎng)絡裁剪和量化兩個部分。在裁剪方面,本文提出一種針對殘差網(wǎng)路的裁剪策略,相較傳統(tǒng)剪枝進一步減少了YOLOv3網(wǎng)絡的計算量。在網(wǎng)絡量化方面,本文提出了一種基于KL散度的模擬量化策略,能夠在訓練過程中統(tǒng)計參數(shù)的分布,并在訓練過程中模擬量化造成的信息損失,從而減少量化過程的精度損失。
首先對網(wǎng)絡進行稀疏化訓練,如式(1)所示,在每個卷積層反向傳播過程中添加稀疏化懲罰項,使得訓練過程中稀疏通道不斷增多,稀疏化訓練過程由參數(shù)λ控制:
其中:Net 代表YOLOv3 神經(jīng)網(wǎng)絡;W是網(wǎng)絡的參數(shù);I是輸入的圖像;y是針對該圖像的真實物體標簽;C度量網(wǎng)絡的輸出和真實標簽之間的損失;γ是神經(jīng)網(wǎng)絡中所有批歸一化層的γ參數(shù);‖ · ‖1對應l1范數(shù)。在稀疏化訓練中,由于存在稀疏化懲罰項,訓練過程將會產(chǎn)生大量的稀疏通道,稀疏通道的數(shù)值趨近于零,批歸一化中的γ系數(shù)決定了該輸出通道對后續(xù)計算的重要程度。通過分位數(shù)篩選掉γ較小的通道即可完成稀疏化通道剪枝。
如圖1 所示,左側為第i層卷積的輸出通道,批歸一化層經(jīng)過稀疏化訓練可以得到一組權重,其中權重相對較小的通道可以視為冗余通道。圖中虛線代表對應的特征圖通道將會被裁剪,卷積核中的對應通道以及對應批歸一化參數(shù)可以直接從模型參數(shù)中移除。
其中:ic,oc分別是輸入、輸出通道的索引;F是高維特征圖,W是卷積神經(jīng)網(wǎng)絡的參數(shù),這里特指第i到第i+1層的卷積核;μic和分別是針對輸入特征的批歸一化處理的均值和方差;ε2是一個較小的數(shù)值,防止產(chǎn)生分母為0的情況;是批歸一化的γ系數(shù),?是卷積操作。
圖1 稀疏化通道裁剪示意圖Fig.1 Schematic diagram of sparse channel pruning
對于帶有殘差連接的神經(jīng)網(wǎng)絡,由于需要保證殘差連接的結構,殘差連接處的輸入和輸出通道需要保持一致,無法直接進行裁剪。Darknet-53中每個殘差塊由一個1× 1的卷積層和一個3× 3 的卷積層組成。如圖2 所示,1× 1 和3× 3 卷積層之間可以直接進行裁剪,這是通道內(nèi)的裁剪。如果直接對3× 3 的輸出通道進行裁剪,可能會使得它與圖2 右側殘差連接的通道數(shù)不一致,因此無法直接進行。
圖2 殘差連接中的通道剪枝Fig.2 Channel pruning in residual connection
雖然通道裁剪能夠一定程度上減少網(wǎng)絡的冗余參數(shù),但殘差連接中的通道仍然有許多冗余。通過本文提出的殘差鏈剪枝,能夠在通道剪枝的基礎上進一步減少模型的參數(shù)量。在殘差網(wǎng)絡中,殘差鏈可以看成是多個殘差塊輸出的累加,因此殘差鏈的輸出通道的權重取決于每一接入殘差塊輸出通道權重的疊加,對殘差連接的剪枝需要對最終各個殘差塊輸出的γ系數(shù)求和作為評估殘差鏈通道權重的依據(jù)。如圖3所示,本文的裁剪分為通道剪枝和殘差剪枝兩個粒度。
通道剪枝的對象為左側1× 1 卷積的輸出通道和3× 3 卷積的輸入通道。殘差鏈粒度包括右側殘差連接的輸出通道和左側3× 3 卷積的輸出通道。殘差剪枝需要協(xié)作各個殘差塊的輸出通道,因此比通道剪枝更為困難。在實際裁剪過程中首先進行通道粒度的裁剪,而后在殘差鏈粒度對每個殘差鏈的通道數(shù)進行裁剪。在裁剪過程中,一次裁剪掉大量的通道通常會造成嚴重的精度損失。本文采用多次迭代進行稀疏化剪枝、剪枝后引入精調來保證精度。
圖3 通道剪枝與殘差鏈接剪枝示意圖Fig.3 Schematic diagram of channel pruning and residual connection pruning
模型裁剪從結構上優(yōu)化網(wǎng)絡的冗余量,網(wǎng)絡量化則從數(shù)據(jù)表示方面著手,文中將神經(jīng)網(wǎng)絡參數(shù)量化為8 比特的整型。通過神經(jīng)網(wǎng)絡參數(shù)分布可知,相對于浮點數(shù)的表示范圍,卷積神經(jīng)網(wǎng)絡的輸出通常局限在非常小的范圍內(nèi),因此神經(jīng)網(wǎng)絡的數(shù)據(jù)表示中也存在冗余。通過將浮點數(shù)映射到低比特的整數(shù),一方面能夠使用低成本的整數(shù)計算單元,同時減少模型計算的訪存總量。對稱量化的計算過程如式(3)所示:
其中Δ為量化步長。對稱量化中如果Δ是根據(jù)最大值以及量化位數(shù)確定的,會導致式(3)中Δ數(shù)值過大,使得更多的浮點數(shù)值落入同一個整數(shù)值,存在著較大的信息損失。
借助KL 散度可以選擇出合適的Δ值使得最終的信息失真最小。KL散度的定義如下:
其中P和Q分別為量化前后參數(shù)的分布。
本文提出一種結合KL 散度[36]和模擬量化的模型量化策略,能夠在模型訓練過程結合KL 散度進行量化,在訓練過程中將量化造成的信息損失考慮在內(nèi),減少精度損失。首先,在訓練過程中統(tǒng)計網(wǎng)絡每層參數(shù)的l1范數(shù)的最大值hmax和參數(shù)分布的直方圖h,其中,直方圖將區(qū)間[0,hmax]劃分成2 048 等份并統(tǒng)計落在各區(qū)間參數(shù)的個數(shù)。如果在迭代過程中遇到更大的上限hmax,則重新統(tǒng)計直方圖,迭代一定輪數(shù)并獲得穩(wěn)定的直方圖作為P。
假設b是上述量化的中心點,量化需要確定一個區(qū)間[0,bj]其中j∈[129,2 048],根據(jù)8比特量化的需要,將這個區(qū)間劃分成128 個小區(qū)間(8 比特量化的區(qū)間為[-127,128],為了簡便認為負區(qū)間也量化為128 個等級,事實上僅有127 個等級)。
量化區(qū)間的選擇帶來了失真,如果j選擇過大,存在量化步長過大帶來KL 散度增大;但是如果j選擇較小,存在丟失l1范數(shù)值較大的參數(shù),也會帶來KL 散度的增大。因此,j的選擇應該是一個綜合了步長和區(qū)間的最佳值。求解最優(yōu)的j*使得量化后Q的分布與P分布的KL 散度最小,同時使得精度滿足一定要求。計算出對應的量化區(qū)間的上限H128=(hmax×j*)/2 048,式(3)中的步長則可以由這個上限確定。
在訓練過程中,分別對卷積權重的各個輸出通道以及卷積層輸出的激活值使用上述的模擬量化算法,在訓練過程中統(tǒng)計數(shù)值分布并在浮點數(shù)上模擬量化造成的精度損失。由于使用了KL 散度量化,統(tǒng)計出的H128值通常小于統(tǒng)計值的最大范圍,而且隨著模型的訓練,統(tǒng)計值的范圍也在不斷變化,因此對于超過界限的數(shù)值不能限定量化范圍,否則會使模型無法收斂,訓練過程中動態(tài)更新這個上界。
ZYNQ 平臺是Xilinx 公司推出的低功耗嵌入式平臺,包括PS(Processing System)和PL(Program Logic)兩個部分。PS 部分主要由處理器構成,通過編寫程序進行控制。PL 部分由可編程邏輯電路組成,通過編寫硬件邏輯實現(xiàn)計算和控制。PS部分和PL 部分通過AXI(Advanced eXtensible Interface)總線進行交互,包括通常用作控制總線的低速總線AXI-GP和用作高速數(shù)據(jù)傳輸?shù)腁XI-HP 總線。AXI-GP 總線通常由PS 端作為主設備控制外設運行,AXI-HP 總線由PL 端作為主設備,可以直接訪問動態(tài)隨機存取存儲器(Dynamic Random Access Memory,DRAM)和一致性緩存,在大量數(shù)據(jù)通過一致性緩存時會極大降低PS端的運行速度。
本文設計的系統(tǒng)結構如圖4所示,右上角為ZYNQ處理平臺,與DDR2(Double Data Rate 2)和處理器相連接;中間部分上面是AXI-HP 高速總線的交叉開關矩陣(Crossbar),負責處理加速模塊的內(nèi)存數(shù)據(jù)請求;下面是系統(tǒng)的時鐘和復位信號控制模塊,負責PL 端的時鐘分發(fā)和復位,系統(tǒng)PL 端的工作頻率是200 MHz;左側上邊是FPGA 加速模塊,主要使用ZYNQ平臺的DSP48E 和Block RAM 實現(xiàn)計算加速和片上緩存。由低速總線負責卷積參數(shù)的輸入和運行狀態(tài)的控制。下面是低速總線的Crossbar,負責下發(fā)PS端的控制指令和參數(shù)。
圖4 系統(tǒng)結構Fig.4 System architecture
計算模塊的設計是在ZynqNet[29]的基礎上修改的,ZynqNet 是在ZC7x045 平臺上實現(xiàn)的基于GoogleNet[38]的手寫數(shù)字識別的浮點計算加速模塊。本文在ZynqNet[29]的基礎上刪除與YOLOv3[34]計算無關的全局池化(Global Pooling)、存儲控制(Memory Controller)等模塊、使用8 bit整數(shù)作為推理的數(shù)據(jù)類型并使用AXI-Burst來提高硬件在讀寫DRAM 時的性能。在ZC7x020 平臺上重新設計并優(yōu)化了卷積計算模塊,優(yōu)化策略主要參考文獻[39]。
如圖5 所示,本文的設計模塊包括配置面板(Configure Board)、輸入緩存(Inputs Cache)、權重緩存(Weights Cache)、輸出緩存(Outputs Buffer)、處理單元(Processing Element)和后處理(Post-process)等幾個模塊,下面分別對各個模塊的劃分進行介紹。
配置面板:模塊存儲卷積計算的各個參數(shù),包括輸入特征圖的長寬、輸入輸出通道數(shù)、卷積核大小、卷積核移動步長、是否使用Leaky RELU[40]激活函數(shù)。
輸入緩存:由16 個塊狀隨機存取存儲器(Block Random Access Memory,Block RAM)并聯(lián)實現(xiàn),按照高度、寬度、通道的順序存儲輸入特征圖。16 個Block RAM 中每4 個存儲輸入特征圖的一行,按照輸入特征圖的行編號余4 選擇Block RAM。16個Block RAM 可以同時存儲輸入特征圖的4行。在列上面也是按照特征圖的列編號余4 選取存儲器。在讀取特征圖時允許最多對4 × 4 個端口同時讀取數(shù)據(jù)。在一個時鐘周期內(nèi)即可讀取計算所需的特征圖,減少了特征圖讀取的延遲。
權重緩存:由N_PE×3×3 個Block RAM 并聯(lián)實現(xiàn),按照輸入通道、輸出通道、卷積核高度、卷積核寬度的維度次序存儲特征圖,用以緩存處理單元所需要的權重系數(shù)。輸出通道按照余N_PE的次序依次映射到各組Block RAM 上。每個處理單元和9 個Block RAM 相關聯(lián),從而允許計算單元在一個周期內(nèi)讀取所需的權重數(shù)據(jù)。
輸出緩存:由N_PE個Block RAM 構成,保證每個處理單元計算之前能夠讀取輸出通道的數(shù)值并在計算后將累加的結果寫回存儲中。
處理單元:由9 個數(shù)字信號處理器(Digital Signal Processor,DSP)組成,負責對輸入的特征圖和權重進行乘加操作,并將最終結果累加到輸出緩存中。由于本文平臺資源的限制,這里選定N_PE=16。
后處理:模塊負責在寫回輸出特征圖通道數(shù)據(jù)之前對輸出進行批歸一化、激活和重量化操作。在完成后將結果寫回內(nèi)存。
圖5 加速模塊結構Fig.5 Acceleration module architecture
本文模塊結構根據(jù)YOLOv3 卷積層的計算過程實現(xiàn),算法1 描述了卷積模塊的計算過程。從中可知,特征圖的存儲形式是F[ih,iw,ic],其中ih、iw和ic分別是對特征圖像高度、寬度和通道數(shù)的索引;權重的存儲形式是W[ic,oc,fh,fw],其中ic、oc、fh和fw分別是對卷積核輸入通道、輸出通道、高度和寬度方向進行索引。這里重新調整了輸入通道的位置改變了加載數(shù)據(jù)的順序,同時增強了數(shù)據(jù)訪問的局部性,在計算過程中充分利用模塊的I/O端口。
算法1 樸素卷積算法。
經(jīng)過優(yōu)化,本文實現(xiàn)比從ZynqNet 移植的基準實現(xiàn)有了明顯的性能提升。在驗證算法計算結果正確后,本文結合Winograd算法對模塊結構進行調整,進一步增強硬件性能。
如算法2 所示,矩陣G、B和A分別是權重、輸入和點積結果的基變換矩陣[31]。借助Winograd 變換F(2,3)能夠在增加一些加法運算的同時將乘法操作從9 個減少到4 個。針對現(xiàn)有的設計結構,本文調整了權重緩存R的形狀,使用16 ×N_PE個Block RAM 存儲GRGT變換后的權重。在讀取輸入S后進行BTSB變換,由于硬件資源的限制,將N_PE從16 減小到8,在點乘輸出T后進行ATTA變換,能夠在增加少量加法計算資源同時的節(jié)省3/4的輸出緩存大小。
算法2 Winograd F(2,3)卷積算法。
本文用KITTI(Karlsruhe Institute of Technology and Toyota Technological Institute at Chicago)[41]數(shù)據(jù)集中的車輛和行人兩類數(shù)據(jù)對上述的壓縮算法進行了實驗驗證。訓練數(shù)據(jù)集中包含了3 700 張大小相近圖片,測試數(shù)據(jù)集中包含了3 800 張圖片,主要包括行車和道路場景下的車輛、行人等物體的標注信息。圖6 中是數(shù)據(jù)集中的樣例圖片。在訓練之前首先要按照PASCAL VOC(Pattern Analysis,Statistical modelling,And Computational Learning Visual Object Classes challenge)的標注格式對數(shù)據(jù)集的標注進行轉換。
1)模型裁剪結果對比。
模型剪枝實驗首先進行稀疏化訓練,訓練使用1E-4的學習率和1E-5的稀疏化懲罰系數(shù),再分別進行通道剪枝和殘差鏈剪枝,最后進行精調。表1 中對不同的裁剪方法進行了對比,由表1 可知,模型裁剪能夠極大地減少模型的計算量,而本文提出的方法能夠進一步地減少模型計算量。這里使用平均精度(Average Precision,AP)度量模型性能。由表1 可知,與直接通道剪枝相比,本文的方法能夠在略微降低精度的情況下進一步減小模型的尺寸和計算量。
圖6 KITTI數(shù)據(jù)集示例數(shù)據(jù)Fig.6 KITTI dataset sample
表1 模型裁剪結果對比Tab.1 Comparison of model pruning results
圖7 給出一些通道剪枝+殘差鏈剪枝85%模型對應的檢測結果圖,由圖7 可見,裁剪后的模型能夠較為準確地預測出車輛的大小和位置。
圖7 裁剪后模型的檢測結果Fig.7 Detection results of pruned model
2)模型量化結果對比。
模型量化在Darknet-53 上分別實現(xiàn)了不同的量化方法,并以表1中通道剪枝+殘差鏈剪枝85%為基準進行驗證,實驗結果如表2所示。
表2 模型量化結果對比Tab.2 Comparison of model quantization results
由表2 可以看出,由于存在離群值,使得最大最小值量化過程存在較大的信息損失,精度降低嚴重。結合KL散度量化能夠一定程度上減少信息損失,再結合模擬量化對模型進行微調,能夠有效地減少模型的精度損失。其中,由于使用了批歸一化,激活值的分布關于零點基本對稱,因此使用對稱量化前后的精度損失較小。最后,本文嘗試了使用每通道量化的方式,對每個卷積輸出通道分別進行量化,增加了模型參數(shù)數(shù)量,但可以進一步減少精度損失。
在表3 中,將本文所提的壓縮算法與經(jīng)典的YOLOv3 tiny進行對比,這是YOLOv3 提供的一個壓縮版本,實驗使用基本操作數(shù)(Basic OPerationS,BOPS)比較卷積操作的計算量,其單位為109(Billion)。本文所提壓縮方法獲得的模型與YOLOv3 tiny 的BOPS 接近,但獲得了超過YOLOv3 tiny 的7 個百分點的性能,同時模型尺寸約為YOLOv3 tiny 的六分之一。此外,相較于其他裁剪與量化方法,本文所提方法在保持高性能的前提下也具有較高的壓縮比,實驗驗證了本文所提壓縮方法的有效性。
表3 不同壓縮算法的模型尺寸、計算量與精度對比Tab.3 Comparison of model size,computational cost and accuracy for different compression algorithms
3)加速模塊性能對比。
對本文涉及的幾個加速模塊的實現(xiàn)進行比較,包括ARM(Advanced RISC Machine)處理器版本的實現(xiàn)、從ZynqNet 移植的基準實現(xiàn)、本文設計和優(yōu)化的沒有集成Winograd 算法的實現(xiàn)和集成Winograd算法的實現(xiàn),結果如表4所示。
由表4 可見,在端設備上直接使用ARM 處理器進行推理是不現(xiàn)實的,借助FPGA 進行8比特推理能夠有效提升計算速度,在ZynqNet 的基準實現(xiàn)上,本文的設計和優(yōu)化能夠提升模塊的平均性能,有力地支持神經(jīng)網(wǎng)絡的端側推理。表4 中,平均性能通過迭代200 輪進行統(tǒng)計,性能的度量單位是每秒十億計算數(shù)(Giga Operations Per Second,GOPS)。
表4 不同計算加速模塊的功耗、資源利用率與性能對比Tab.4 Comparison of power consumption,resource utilization rate and performance for different computation acceleration modules
接下來,本文結合現(xiàn)有的包括CPU、GPU、FPGA 等多個平臺的實現(xiàn)結果[42-43]對本文在ZYNQ 平臺上的計算加速算法進行評估,結果如表5 所示,通過單位功耗實現(xiàn)的操作總數(shù)評估各實現(xiàn)的能耗比。本文實現(xiàn)的非Winograd 加速模塊的平均性能與GPU 樣本相近,比FPGA 樣本略高。具有Winograd 的加速方案能夠在無Winograd 加速的基礎上提升一倍多的能耗比;與其他平臺相比,本文集成了Winograd 的方案能夠在更低的功耗下取得較高的計算性能。
表5 不同平臺的性能、功耗以及能耗比對比Tab.5 Comparison of performance,energy consumption and energy consumption ratio on various platforms
本文圍繞YOLOv3 網(wǎng)絡在低功耗場景下的應用進行研究,通過模型壓縮與適配端側設備的計算加速實現(xiàn)了網(wǎng)絡在ZYNQ 平臺的部署,達到了較高的能耗比。一方面,本文設計了針對殘差網(wǎng)絡的裁剪方法,通過引入針對殘差鏈的剪枝和按通道的量化實現(xiàn)了以較低的精度損失獲得較高壓縮比的目的。另一方面,本文在ZynqNet 的基礎上設計實現(xiàn)了卷積加速模塊,優(yōu)化了片上緩存,集成了Winograd 算法,極大地提高了低功耗場景下ZYNQ 平臺的卷積性能。與不同平臺的比較表明,本文研究獲得了較高的能耗比,能夠加速推進YOLOv3以及其他殘差網(wǎng)絡在ZYNQ端側的部署。
關于神經(jīng)網(wǎng)絡的壓縮與部署,仍有很多值得探索的地方。例如,將本文所提壓縮方案推廣到具有池化等模塊的網(wǎng)絡,探討適用更復雜結構的網(wǎng)絡壓縮方案是未來一個有價值的研究方向。另外,在加速模塊部分,結合Chisel(Constructing hardware in a scala embedded language)等敏捷硬件開發(fā)工具,實現(xiàn)更細粒度的硬件結構控制,從而提高硬件資源的利用率、降低平均功耗也是值得考慮的一個研究點。