呂文浩,支小莉,2+,童維勤,2
(1.上海大學 計算機工程與科學學院,上海 200444;2.上海智能計算系統工程技術研究中心 研發部,上海 200444)
過去幾年間,卷積神經網絡(convolutional neural network,CNN)的應用范圍從服務器集群上的圖像處理服務逐漸擴展到了對延遲更敏感的邊緣端實時應用[1,2]中。為了能夠適配資源受限的計算環境,輕量級CNN[2]往往會成為這類應用的最優選擇。
目前,關于輕量級CNN的硬件加速方法的研究工作還比較少,大致可分為兩類。一類是優化深度可分離卷積等不便于硬件部署的輕量級操作,Yifan等使用1×1卷積和移位操作代替了深度可分離卷積[3];另一類是保留模型完整結構的同時優化計算單元的架構設計,Di等為深度可分離卷積和標準卷積設計了兩個專用計算單元來提高計算效率[4],Ming等設計了加速架構SparkNoC,將所有層以流水線的方式同步部署到現場可編程門陣列(field programmable gate array,FPGA)上[5]。
但關于輕量級CNN的硬件加速方案主要的目標依然是根據網絡結構特性對硬件架構進行針對性的優化,沒有很好地結合軟件進行協同優化,在模型修改靈活性和模型性能改善方面尚有很大研究空間,基于軟硬件協同優化思想設計的輕量級CNN的硬件加速方法研究尚不成熟。Lu等以軟硬件協同優化的方法設計了FPGA加速器,將移位量化算法與FPGA相結合[6],但是他們提出的架構是基于傳統CNN模型進行設計的,對于輕量級卷積神經網絡模型則無法適用。
因此,本文選擇最典型的輕量級卷積神經網絡MobileNetV2[7]作為目標模型,以軟硬件協同優化為指導思想,針對基于輕量級卷積神經網絡的FPGA加速策略展開了研究。本文的貢獻主要如下:
(1)針對FPGA加速器更擅長處理移位計算的特性,提出了一種基于可微閾值的選擇性移位量化方案(differentiable threhold-based selective shift quantization,DTSSQ),通過將浮點數權重轉化為一或兩個2的冪次方和的形式,將全部乘法運算轉化為移位運算,從而提高加速器的性能。
(2)提出了一種基于FPGA的CNN加速器架構,將MobileNetV2中所有的網絡層都映射到了獨立定制的硬件單元上,對緩存設計、數據存取等方面進行了針對性優化。
(3)為了最大化硬件資源利用效率,設計了一種具有更高兼容性的卷積層計算單元,統一了數據輸入輸出接口并且能夠支持不同卷積類型的通用化部署。
MobileNetV2是一種輕量級CNN模型,主要使用了深度可分離卷積來構建網絡架構,在圖像分類和目標檢測領域有著很顯著的優勢。
MobileNetV2建立在MobilenetV1的基礎上,與后者相比,前者的top-1準確率從70.6%提高到了72%,模型大小也從4.2 M縮小到了3.4 M。MobileNetV2最大的特點是使用了倒置殘差結構。該結構包括一個1×1的擴展層、一個3×3的逐通道卷積,和一個1×1投影層。當逐通道卷積的步長為2時,將輸入與輸出逐元素相加。當步長為1時則不做額外處理。
在傳統的開發方式中,FPGA是通過硬件描述語言(hardware description language,HDL)進行編程的,開發人員不僅需要掌握HDL語言,還需要熟知FPGA的硬件架構。同時由于HDL語言直接面向硬件,抽象層次較低,這嚴重提高了FPGA開發的準入門檻。
開放式計算語言(open computing language,OpenCL)是一門基于C/C++的語言,能夠進行跨平臺的并行編程,并且能夠兼容各類硬件設備。而Intel FPGA SDK for OpenCL是Intel公司提供的一個OpenCL設計套件,它使用自定義的編譯器將OpenCL代碼映射到FPGA上,在隱藏FPGA細節的同時實現了工作優化。
這種開發方法可以極大地減少硬件開發時間,提高FPGA的開發效率。同時,基于OpenCL開發的程序也有助于復雜程序在FPGA上的快速部署。因此,本文使用OpenCL作為開發語言,完成了FPGA加速器的部署實現。
為了降低網絡模型在FPGA上的存儲成本和計算成本,本文使用移位量化的方案將浮點參數轉化為低精度數。與移位量化不同,定點量化依然使用乘法操作來進行卷積運算,這在FPGA中通常由DSP來實現。但是與FPGA中數量較多的查找表和寄存器相比,FPGA中DSP的數量較少,往往需要對其進行特殊處理,才可能支持CNN的大規模乘法運算。因此DSP資源的數量通常是限制加速器性能的重要原因。
而移位操作在FPGA中通常由查找表來實現,幾乎不會消耗DSP資源,因此FPGA加速器的性能將不會受到DSP資源的限制,并減少因過度使用DSP而產生的功耗[8]。但如式(2)所示,由于移位量化的每個量化值都是2的冪次方,當量化值的目標位寬b增加時,量化值集合Qshift內包含的值只會在0附近增加[2-2b+1,2-2b-1]區間內的有限個值,而其它區間不會發生任何變化,這種分布上的不均勻使得模型的量化性能無法被有效地提升
Qshift={0,±2-2b-1+1,±2-2b-1+2,…,±2-1,±1}
(1)
為解決這個問題并增加權重表示的靈活性,本文提出了一種基于可微閾值的選擇性移位量化方案。該方案使用一或兩個2的冪次方來表示權重,對量化值進行了更細粒度的劃分。
量化函數定義如下
(2)
(3)
(4)
其中,b表示權重量化的位寬,W(i) 表示第i層的權重數據,P表示權重的移位值,Wq(i) 表示第i層權重的量化表示形式,clip(.)表示裁剪函數。在式(4)表示的量化函數的作用下,形如0.128這樣的全精度權重最終會被表示為2-3的形式。
相比于將權重直接量化為兩個2的冪次方的和,如果將一部分權重量化為兩項之和并且將另一部分權重量化為單個項,則能夠保持高分辨率帶來的高精度優勢,同時也具有移位量化帶來的低能耗優勢。
基于這一假設,本文提出的DTSSQ方案包括下列步驟:基于可微閾值的權重分組和重訓練。
基于閾值的權重分組根據量化誤差將權重劃分為3組,分別對應權重被量化為兩項之和、被量化為單項和不被量化。第一組的權重經過兩次移位量化,以減小量化誤差。第二組的權重僅需要經過一次量化,即可逼近全精度的權重值。第三組的權重在前向傳播的過程中將不會進行移位量化,其值是由量化函數計算得到的零值。
本文將R(i) 定義為第i層權重的量化誤差,則R(i) 可以通過式(5)來表示
R(i)=W(i)-Quant(W(i))
(5)
如果權重的量化誤差大于閾值,權重就會被劃分到第一組,反之則被劃分到第二組。這種動態的分組模式在數學中可以通過二值掩碼矩陣來表示,具體表示見式(6)
(6)
式中:T為判斷量化誤差與閾值大小關系的二值掩碼矩陣,t表示量化誤差的閾值。因此,使用該方案計算得到的量化后的權重值就可以通過式(7)進行表示
Wq(i)=Quant(W(i))+Quant(R(i)⊙T)
(7)
式中:⊙表示逐元素相乘。根據T的不同取值,Wq(i) 可能會被表示為一或兩個移位值和的形式,也就是形如0.128這樣的全精度權重最終可能會被表示為2-3+2-5或者2-3的形式。完整的權重分組方案如算法1所示。
算法1:基于閾值的權重分組方案
輸入:全精度權重w
閾值t
輸出:量化后的權重w_q
(1)計算全精度權重的單項量化值w1:w1=Quant(w)
(2)根據w1計算權重的量化誤差error:error=w-w1
(3)if error >=tdo
(4)w_q= w1+Quant(error)
(5)else
(6)w_q=w1
(7)end if
(8)returnw_q
在實踐中,該類閾值如果被設置為靜態值,將無法反映量化過程中權重的變化和迭代過程中量化誤差的變化,因此,本文將引入可微閾值t作為權重劃分的依據,并通過重訓練求解出閾值的最優解。
為了更好地減少重訓練時的量化誤差,并使權重在反向傳播過程中更逼近2的冪次方,本文提出了一個正則化項Ω來輔助權重的修正
(8)
因此,與新的正則化項Ω結合之后,新的損失函數將變化為如下形式
lossnew=loss+λ*Ω
(9)
式中:λ是預定義的一個超參數。
根據反向傳播的鏈式求導法則,損失函數對權重的偏導數可以由下列公式計算得出
(10)
但是Wq(i) 的計算涉及了對全精度權重的四舍五入的運算,這使得?Wq/?W的導數處處為0(除了W恰好為2的冪次方的離散點),權重的梯度無法正常進行反向傳播。以前的一些工作[9,10]大多通過令?Wq/?W=1來直接獲取梯度的近似值,雖然看似解決了問題,但是卻完全忽略了量化對權重造成的影響,當進行低比特的量化時,量化誤差會被放大,導致訓練過程難以收斂[11]。
本文引用了Junghyup等[12]提出的EWGS方法來嘗試解決這一問題。根據文獻[12]可以計算出損失函數對權重的偏導數?L/?W,如式(11)所示
(11)
式中:δ是一個大于等于0的比例因子。
根據式(7),閾值t的梯度可以通過Wq(i) 進行計算,具體計算公式見式(12)
(12)
在計算?Wq/?t這一項時,可以使用tanh函數進行近似計算。令?T/?t=tanh(R(i)2-t),則求值的具體公式見式(13)


-R(i)⊙tanh′(R(i)2-t)
(13)
FPGA加速器整體架構如圖1所示,包括控制器、卷積層計算單元、片上緩沖區、外部存儲器和其它層的計算單元。

圖1 加速器架構
控制器負責協調不同計算單元在運行期間的執行順序,驅動加速器以流水線模式高效運行。卷積層的計算單元主要負責MobileNetV2中不同卷積模塊的計算,最多可兼容標準卷積、逐通道卷積以及逐點卷積等3種不同卷積模塊的實現。外部存儲器主要用于存儲原始輸入圖像和最終計算結果,僅在網絡輸入和輸出端與片上產生交互。片內緩沖區包括輸入緩沖區、輸出緩沖區和權重緩沖區等,遵循了分層存儲策略,根據參數的數量和使用頻率來分配各自的片上存儲資源。其它層的計算單元主要包括了MobileNetV2中涉及的全局平均池化層、Relu6激活函數層以及BN層等。
加速器包含控制器、卷積模塊、池化層、BN層、激活等多個FPGA內核。內核之間的數據流動效率將直接影響加速器的推理速度。OpenCL SDK提供了通道作為內核之間通信的橋梁,這意味著內核之間可以使用先進先出(first in first out,FIFO)緩沖區直接進行片上通信。如圖2所示,加速器的數據流就是使用通道按照順序構建起來的。

圖2 數據流
加速器上的數據流動,可以分為阻塞式和非阻塞式。當加速器開始運行時,控制器處于阻塞式讀取模式,此時控制器要確保讀取的數據可用,以便整個流水線可以正確啟動。輸入圖像和權重數據從片外內存加載到片上緩沖區中,當控制器讀取到數據時,開始執行卷積、激活、池化的計算流程。池化單元計算得到的輸出值被寫回控制器,此時加速器開始執行層間計算流程,并且控制器將切換為非阻塞式讀取模式以避免加速器在運行期間因阻塞而停止運行。同時如果該層存在殘差連接,則將輸出結果提前寫入到輸出緩沖區內。
一般來說,與片外內存的頻繁通信會導致加速器能耗增加,因此本文使用了片上緩存來存儲網絡中間層的全部輸出數據以減少與片外的通信。類似的研究中大多使用雙緩沖區技術也就是使用兩個相同的緩沖區在每個時鐘周期內同時讀寫來加速數據處理過程。然而,這種技術的主要缺陷在于雙緩沖區的尺寸需要滿足中間層的最大存儲需求。因此,本文提出了非對稱式動態雙緩沖區技術,將內存區域劃分為兩塊大小不等的子區域,并根據實際網絡模型的架構設置不同的緩沖區配置比例。因此,緩沖區的大小的計算實際上就可以被轉化為求解以下問題
argmin(SIZE(layeri)+SIZE(layeri+1))
(14)
根據求解得到的結果,就可以得到最優的緩沖區配置比例。并且將最優比例與每一層的中間數據大小相結合,就能夠提前計算出每一層的緩沖區讀取基地址和緩沖區寫入基地址。控制器通過指令流將預計算的基地址傳入加速器,從而實現運行時對緩沖區的動態數據讀寫。經計算,在MobileNetV2層中的最優緩沖區配置為第五層與第六層的組合。
深度可分離卷積比普通卷積有更低的參數量和計算成本,但它也給基于標準卷積的加速體系結構帶來了相當大的挑戰[13]。適用于標準卷積的計算單元,往往無法在逐通道卷積和逐點卷積的運算模式中高效地運算。
Ming等[5]嘗試為每種卷積運算類型設計一個專用引擎來針對性地提高計算效率,但是在MobilenetV2中3種卷積類型各自的計算量很不平衡,反而會使得不同計算單元的工作負載不平衡,進而導致整體硬件資源利用率降低,白白浪費功耗。相反,如果為不同的卷積類型設計一個統一的計算單元,就可以解決負載不平衡的問題,獲得更高的計算資源綜合利用率。
本文將卷積計算單元從邏輯上分解為移位計算陣列和加法器樹,并根據不同的卷積類型設計了不同的組合方案,從而提出了一種可兼容多個卷積類型的新的計算單元設計方案。為了保證計算單元在不同工作模式下保持統一,本文針對不同卷積類型設計了專門的數據重排序過程。同時,本文根據標準卷積、逐通道卷積、逐點卷積等卷積類型的不同計算策略提出了能夠在統一的硬件電路上部署的并行化策略。
如圖3所示,一個完整的卷積計算單元包含了行緩沖區以及移位和陣列。

圖3 卷積計算單元架構
在卷積計算之前,控制器將下一層的輸入數據和權重參數進行分組并分別發送給卷積計算單元。引擎的行緩存按照非對稱式動態雙緩沖區的設計思路接收并存儲這些數據,同時也將當前層計算所需的數據發送到移位和陣列。根據預先配置的工作模式控制位,移位單元陣列和加法器樹會以不同的方案進行配置。移位單元陣列利用FPGA中數量充足的查找表對數據實現移位運算,最后再由加法器樹對中間結果求和從而完成整個卷積計算。
3.3.1 標準卷積
為了充分利用FPGA設備的硬件資源,提高標準卷積模式下的并行性,本文針對參與運算的數據設計了5個并行級別,并將其定義為計算單元并行度level_R,輸出通道并行度level_N,輸入通道并行度level_C,寬度并行度le-vel_W,高度并行度level_H。同時,將level_R的值設置成輸出通道并行度level_N,以確保運算單元能正確處理輸入數據的格式,使每一個計算單元最終只生成一個通道的輸出數據。
為了更好地描述計算單元在特定模式下的并行計算能力,本文將Parallelstandard定義為在指定工作模式下,計算單元在一個時鐘周期內并行執行的卷積運算次數。因此標準卷積模式下的計算單元并行度Parallelstandard可以通過下列公式計算
Parallelstandard=k×level_R×(level_W-k+1)×

(15)
式中:k表示卷積核的尺寸,C表示輸入特征圖的通道數。
如圖4所示,為了使不同工作模式下的數據格式保持一致并與并行策略相匹配,輸入數據會被重新排序。

圖4 標準卷積工作模式的數據重排序
圖的頂部為輸入特征圖陣列和權重陣列,底部為重排序后的數據存儲格式。頂部的序號表示輸入數據在滑動窗口內的原始存儲順序,經過重新排序后與底部的序號形成一一對應關系。最終,計算單元會根據圖中的數據存儲格式接收輸入數據和權重數據,并最終計算出卷積結果。
3.3.2 逐點卷積
逐點卷積的計算過程實際上等同于1×1卷積,之前的工作[4,6,13]中使用標準卷積的計算單元直接實現逐點卷積而沒有進行專門的優化。然而,由式(16)所示,這種方式實際上會使得當前計算單元的并行度Parallelpointwise降低約level_H倍,沒有充分利用計算標準卷積所需的硬件資源
(16)
因此,逐點卷積也需要對數據的讀取順序進行如圖5所示的重排序過程。逐點卷積工作模式下,計算單元將會按順序依次讀取3個輸入通道的權重,并重排序組合成與標準卷積一致的數據排列順序。

圖5 逐點卷積工作模式的數據重排序
權重數據的重排序將使得計算單元在逐點卷積的模式下能夠保持與在標準卷積模式時一致的數據排列順序,因此計算單元即使處于逐點卷積模式,也可以充分利用標準卷積時用到的移位單元陣列和加法器樹模塊。
3.3.3 逐通道卷積
與標準卷積相比,逐通道卷積在計算過程中最大的不同是每個輸出特征圖通道都是由一個內核通道與一個輸入特征圖通道進行卷積而產生的,并且每個維度之間均沒有數據依賴關系。
因此逐通道卷積的并行計算能力Paralleldepthwise實際上降低了level_R倍,這意味著同一時間只有一個計算單元在進行運算,完全喪失了level_R并行度的優勢。因此,本文利用了逐通道卷積的計算特性,通過控制器對輸入數據進行如圖6所示的重排序,使得輸入數據以額外的level_R維度被送入,從而充分能夠利用多個計算單元并行處理的優勢。

圖6 逐通道卷積工作模式的數據重排序
圖7顯示了優化后的計算單元在處于逐通道卷積工作模式下會被激活的計算陣列,其中實線部分表示被激活的陣列而虛線部分則表示未被激活的部分。不同工作模式僅在加法器樹的連接配置中有所區分。

圖7 逐通道卷積的計算陣列
最終,優化后的Paralleldepthwise可以通過式(17)計算得出
Paralleldepthwise=
k×level_R×(level_W-k+1)×level_H
(17)
為了評估本文提出的DTSSQ量化方案的有效性,本文使用CIFAR-10和CIFAR-100數據集對模型進行訓練,這兩個數據集是深度學習中常用的識別常見物體的數據集,分別包含了10類和100類輸入圖像,共計60 000張圖片。
實驗選取的模型為Resnet18和Resnet20,模型的編譯語言為Python3.7,開發框架為PyTorch1.7.1。
本文將DTSSQ方案和在ResNet網絡上表現良好的幾種量化方案在CIFAR-10和CIFAR-100數據集上分別進行了比較,其中包括Zhou等[15]的DOREFA-NET、Choi等[16]的PACT、Ding等[17,18]的FlightNNs和LightNN。為與其它量化方案的實驗配置保持一致,模型的第一層和最后一層不進行量化。
實驗結果見表1,DTSSQ量化方案在CIFAR100和CIFAR10數據集上均表現良好,在CIFAR10數據集上Resnet20的準確率達到了92.84%,與全精度baseline相比提高了約0.8%。而在CIFAR100數據集上訓練的Resnet18的準確率達到了71.84%,與baseline相比提高了約1%,與FlightNNs相比提高了約1.3%,可見基于可微閾值的方案能夠有效地降低量化誤差,并且通過重訓練對閾值的動態調整,最終得到的量化精度與全精度網絡相比也有明顯提高。

表1 量化性能結果
輕量級卷積神經網絡硬件加速器部署的平臺為Intel Arria10 GX1150,軟件開發環境為CentOS Linux release 7.9.2009+Intel OpenCL 19.1 SDK。使用OpenCL語言將經過軟硬件協同優化后的加速器架構進行編碼表達,編碼完成后連接FPGA加速卡進行編譯,SDK會將高層次的開發語言轉化為對硬件電路的描述,最終部署完成后,整體的資源利用率見表2。

表2 資源利用率/%
本文將MobileNetV2的FPGA加速器與其GPU版本和CPU版本進行了對比實驗。實驗采用的CPU是12核心24線程的Intel Xeon CPU E5-2678 v3@2.5 GHZ,GPU是來自NVIDIA的專業計算卡Tesla V100。對比結果見表3。

表3 與CPU和GPU對比
從表中可以看出,CPU版本MobileNetV2的平均推理速度為29.9 ms,與之相比,FPGA加速器的平均加速比為9.3,具有更好的性能優勢。而GPU作為一個通用加速器,MobileNetV2模型無法完全利用其硬件資源。因此,GPU的平均推理速度需要7.55 ms,與之對比,在FPGA上部署的模型推理速度比GPU的快了約3倍。
如表4所示,本文選取了幾項類似的基于FPGA的MobileNetV2加速器實現方案,與本文設計的加速器進行了對比。

表4 加速性能對比
從表中可以看出,本文提出的加速器最終實現了311.6 fps的推理速度,優于大部分的FPGA加速器,并且本文設計的DTSSQ量化方案使得卷積的計算能夠借由FPGA上充足的查找表來實現,每個時鐘周期內能夠完成更多的計算,因此在吞吐量方面加速器也占據了優勢。
另外,本文的加速器也具備使用高級語言開發易于部署的優勢。實驗結果表明,我們實現的基于FPGA的輕量級卷積神經網絡加速器相比其它輕量級卷積神經網絡加速器實現了更高的吞吐量和更快的推理速度。
本文利用FPGA的硬件可編程優勢,進行軟硬件協同優化,對基于FPGA的輕量級卷積神經網絡加速方案進行了深入研究,為進一步改善輕量化網絡應用的性能提供了方法和方案。
首先,本文提出了一種基于可微閾值的選擇性移位量化方案,解決了傳統移位量化算法精度迅速飽和的問題。實驗結果表明,提出的量化方案在CIFAR10和CIFAR100數據集上量化后的精度相比全精度網絡分別提高了0.8%和1%。
其次,本文設計了一種基于FPGA的高性能加速架構來適應輕量化網絡計算特征,并提出了非對稱式動態雙緩沖區技術與具有更高兼容性的統一卷積計算單元。實驗結果表明,提出的加速器架構幾乎不使用DSP就可以完成卷積運算,最終實現了98.62 GOPS的吞吐量和311.6 fps的推理速度。