呂文浩,支小莉,2+,童維勤,2
(1.上海大學(xué) 計(jì)算機(jī)工程與科學(xué)學(xué)院,上海 200444;2.上海智能計(jì)算系統(tǒng)工程技術(shù)研究中心 研發(fā)部,上海 200444)
過去幾年間,卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)的應(yīng)用范圍從服務(wù)器集群上的圖像處理服務(wù)逐漸擴(kuò)展到了對延遲更敏感的邊緣端實(shí)時(shí)應(yīng)用[1,2]中。為了能夠適配資源受限的計(jì)算環(huán)境,輕量級CNN[2]往往會成為這類應(yīng)用的最優(yōu)選擇。
目前,關(guān)于輕量級CNN的硬件加速方法的研究工作還比較少,大致可分為兩類。一類是優(yōu)化深度可分離卷積等不便于硬件部署的輕量級操作,Yifan等使用1×1卷積和移位操作代替了深度可分離卷積[3];另一類是保留模型完整結(jié)構(gòu)的同時(shí)優(yōu)化計(jì)算單元的架構(gòu)設(shè)計(jì),Di等為深度可分離卷積和標(biāo)準(zhǔn)卷積設(shè)計(jì)了兩個(gè)專用計(jì)算單元來提高計(jì)算效率[4],Ming等設(shè)計(jì)了加速架構(gòu)SparkNoC,將所有層以流水線的方式同步部署到現(xiàn)場可編程門陣列(field programmable gate array,F(xiàn)PGA)上[5]。
但關(guān)于輕量級CNN的硬件加速方案主要的目標(biāo)依然是根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)特性對硬件架構(gòu)進(jìn)行針對性的優(yōu)化,沒有很好地結(jié)合軟件進(jìn)行協(xié)同優(yōu)化,在模型修改靈活性和模型性能改善方面尚有很大研究空間,基于軟硬件協(xié)同優(yōu)化思想設(shè)計(jì)的輕量級CNN的硬件加速方法研究尚不成熟。Lu等以軟硬件協(xié)同優(yōu)化的方法設(shè)計(jì)了FPGA加速器,將移位量化算法與FPGA相結(jié)合[6],但是他們提出的架構(gòu)是基于傳統(tǒng)CNN模型進(jìn)行設(shè)計(jì)的,對于輕量級卷積神經(jīng)網(wǎng)絡(luò)模型則無法適用。
因此,本文選擇最典型的輕量級卷積神經(jīng)網(wǎng)絡(luò)MobileNetV2[7]作為目標(biāo)模型,以軟硬件協(xié)同優(yōu)化為指導(dǎo)思想,針對基于輕量級卷積神經(jīng)網(wǎng)絡(luò)的FPGA加速策略展開了研究。本文的貢獻(xiàn)主要如下:
(1)針對FPGA加速器更擅長處理移位計(jì)算的特性,提出了一種基于可微閾值的選擇性移位量化方案(differentiable threhold-based selective shift quantization,DTSSQ),通過將浮點(diǎn)數(shù)權(quán)重轉(zhuǎn)化為一或兩個(gè)2的冪次方和的形式,將全部乘法運(yùn)算轉(zhuǎn)化為移位運(yùn)算,從而提高加速器的性能。
(2)提出了一種基于FPGA的CNN加速器架構(gòu),將MobileNetV2中所有的網(wǎng)絡(luò)層都映射到了獨(dú)立定制的硬件單元上,對緩存設(shè)計(jì)、數(shù)據(jù)存取等方面進(jìn)行了針對性優(yōu)化。
(3)為了最大化硬件資源利用效率,設(shè)計(jì)了一種具有更高兼容性的卷積層計(jì)算單元,統(tǒng)一了數(shù)據(jù)輸入輸出接口并且能夠支持不同卷積類型的通用化部署。
MobileNetV2是一種輕量級CNN模型,主要使用了深度可分離卷積來構(gòu)建網(wǎng)絡(luò)架構(gòu),在圖像分類和目標(biāo)檢測領(lǐng)域有著很顯著的優(yōu)勢。
MobileNetV2建立在MobilenetV1的基礎(chǔ)上,與后者相比,前者的top-1準(zhǔn)確率從70.6%提高到了72%,模型大小也從4.2 M縮小到了3.4 M。MobileNetV2最大的特點(diǎn)是使用了倒置殘差結(jié)構(gòu)。該結(jié)構(gòu)包括一個(gè)1×1的擴(kuò)展層、一個(gè)3×3的逐通道卷積,和一個(gè)1×1投影層。當(dāng)逐通道卷積的步長為2時(shí),將輸入與輸出逐元素相加。當(dāng)步長為1時(shí)則不做額外處理。
在傳統(tǒng)的開發(fā)方式中,F(xiàn)PGA是通過硬件描述語言(hardware description language,HDL)進(jìn)行編程的,開發(fā)人員不僅需要掌握HDL語言,還需要熟知FPGA的硬件架構(gòu)。同時(shí)由于HDL語言直接面向硬件,抽象層次較低,這嚴(yán)重提高了FPGA開發(fā)的準(zhǔn)入門檻。
開放式計(jì)算語言(open computing language,OpenCL)是一門基于C/C++的語言,能夠進(jìn)行跨平臺的并行編程,并且能夠兼容各類硬件設(shè)備。而Intel FPGA SDK for OpenCL是Intel公司提供的一個(gè)OpenCL設(shè)計(jì)套件,它使用自定義的編譯器將OpenCL代碼映射到FPGA上,在隱藏FPGA細(xì)節(jié)的同時(shí)實(shí)現(xiàn)了工作優(yōu)化。
這種開發(fā)方法可以極大地減少硬件開發(fā)時(shí)間,提高FPGA的開發(fā)效率。同時(shí),基于OpenCL開發(fā)的程序也有助于復(fù)雜程序在FPGA上的快速部署。因此,本文使用OpenCL作為開發(fā)語言,完成了FPGA加速器的部署實(shí)現(xiàn)。
為了降低網(wǎng)絡(luò)模型在FPGA上的存儲成本和計(jì)算成本,本文使用移位量化的方案將浮點(diǎn)參數(shù)轉(zhuǎn)化為低精度數(shù)。與移位量化不同,定點(diǎn)量化依然使用乘法操作來進(jìn)行卷積運(yùn)算,這在FPGA中通常由DSP來實(shí)現(xiàn)。但是與FPGA中數(shù)量較多的查找表和寄存器相比,F(xiàn)PGA中DSP的數(shù)量較少,往往需要對其進(jìn)行特殊處理,才可能支持CNN的大規(guī)模乘法運(yùn)算。因此DSP資源的數(shù)量通常是限制加速器性能的重要原因。
而移位操作在FPGA中通常由查找表來實(shí)現(xiàn),幾乎不會消耗DSP資源,因此FPGA加速器的性能將不會受到DSP資源的限制,并減少因過度使用DSP而產(chǎn)生的功耗[8]。但如式(2)所示,由于移位量化的每個(gè)量化值都是2的冪次方,當(dāng)量化值的目標(biāo)位寬b增加時(shí),量化值集合Qshift內(nèi)包含的值只會在0附近增加[2-2b+1,2-2b-1]區(qū)間內(nèi)的有限個(gè)值,而其它區(qū)間不會發(fā)生任何變化,這種分布上的不均勻使得模型的量化性能無法被有效地提升
Qshift={0,±2-2b-1+1,±2-2b-1+2,…,±2-1,±1}
(1)
為解決這個(gè)問題并增加權(quán)重表示的靈活性,本文提出了一種基于可微閾值的選擇性移位量化方案。該方案使用一或兩個(gè)2的冪次方來表示權(quán)重,對量化值進(jìn)行了更細(xì)粒度的劃分。
量化函數(shù)定義如下
(2)
(3)
(4)
其中,b表示權(quán)重量化的位寬,W(i) 表示第i層的權(quán)重?cái)?shù)據(jù),P表示權(quán)重的移位值,Wq(i) 表示第i層權(quán)重的量化表示形式,clip(.)表示裁剪函數(shù)。在式(4)表示的量化函數(shù)的作用下,形如0.128這樣的全精度權(quán)重最終會被表示為2-3的形式。
相比于將權(quán)重直接量化為兩個(gè)2的冪次方的和,如果將一部分權(quán)重量化為兩項(xiàng)之和并且將另一部分權(quán)重量化為單個(gè)項(xiàng),則能夠保持高分辨率帶來的高精度優(yōu)勢,同時(shí)也具有移位量化帶來的低能耗優(yōu)勢。
基于這一假設(shè),本文提出的DTSSQ方案包括下列步驟:基于可微閾值的權(quán)重分組和重訓(xùn)練。
基于閾值的權(quán)重分組根據(jù)量化誤差將權(quán)重劃分為3組,分別對應(yīng)權(quán)重被量化為兩項(xiàng)之和、被量化為單項(xiàng)和不被量化。第一組的權(quán)重經(jīng)過兩次移位量化,以減小量化誤差。第二組的權(quán)重僅需要經(jīng)過一次量化,即可逼近全精度的權(quán)重值。第三組的權(quán)重在前向傳播的過程中將不會進(jìn)行移位量化,其值是由量化函數(shù)計(jì)算得到的零值。
本文將R(i) 定義為第i層權(quán)重的量化誤差,則R(i) 可以通過式(5)來表示
R(i)=W(i)-Quant(W(i))
(5)
如果權(quán)重的量化誤差大于閾值,權(quán)重就會被劃分到第一組,反之則被劃分到第二組。這種動態(tài)的分組模式在數(shù)學(xué)中可以通過二值掩碼矩陣來表示,具體表示見式(6)
(6)
式中:T為判斷量化誤差與閾值大小關(guān)系的二值掩碼矩陣,t表示量化誤差的閾值。因此,使用該方案計(jì)算得到的量化后的權(quán)重值就可以通過式(7)進(jìn)行表示
Wq(i)=Quant(W(i))+Quant(R(i)⊙T)
(7)
式中:⊙表示逐元素相乘。根據(jù)T的不同取值,Wq(i) 可能會被表示為一或兩個(gè)移位值和的形式,也就是形如0.128這樣的全精度權(quán)重最終可能會被表示為2-3+2-5或者2-3的形式。完整的權(quán)重分組方案如算法1所示。
算法1:基于閾值的權(quán)重分組方案
輸入:全精度權(quán)重w
閾值t
輸出:量化后的權(quán)重w_q
(1)計(jì)算全精度權(quán)重的單項(xiàng)量化值w1:w1=Quant(w)
(2)根據(jù)w1計(jì)算權(quán)重的量化誤差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
在實(shí)踐中,該類閾值如果被設(shè)置為靜態(tài)值,將無法反映量化過程中權(quán)重的變化和迭代過程中量化誤差的變化,因此,本文將引入可微閾值t作為權(quán)重劃分的依據(jù),并通過重訓(xùn)練求解出閾值的最優(yōu)解。
為了更好地減少重訓(xùn)練時(shí)的量化誤差,并使權(quán)重在反向傳播過程中更逼近2的冪次方,本文提出了一個(gè)正則化項(xiàng)Ω來輔助權(quán)重的修正
(8)
因此,與新的正則化項(xiàng)Ω結(jié)合之后,新的損失函數(shù)將變化為如下形式
lossnew=loss+λ*Ω
(9)
式中:λ是預(yù)定義的一個(gè)超參數(shù)。
根據(jù)反向傳播的鏈?zhǔn)角髮?dǎo)法則,損失函數(shù)對權(quán)重的偏導(dǎo)數(shù)可以由下列公式計(jì)算得出
(10)
但是Wq(i) 的計(jì)算涉及了對全精度權(quán)重的四舍五入的運(yùn)算,這使得?Wq/?W的導(dǎo)數(shù)處處為0(除了W恰好為2的冪次方的離散點(diǎn)),權(quán)重的梯度無法正常進(jìn)行反向傳播。以前的一些工作[9,10]大多通過令?Wq/?W=1來直接獲取梯度的近似值,雖然看似解決了問題,但是卻完全忽略了量化對權(quán)重造成的影響,當(dāng)進(jìn)行低比特的量化時(shí),量化誤差會被放大,導(dǎo)致訓(xùn)練過程難以收斂[11]。
本文引用了Junghyup等[12]提出的EWGS方法來嘗試解決這一問題。根據(jù)文獻(xiàn)[12]可以計(jì)算出損失函數(shù)對權(quán)重的偏導(dǎo)數(shù)?L/?W,如式(11)所示
(11)
式中:δ是一個(gè)大于等于0的比例因子。
根據(jù)式(7),閾值t的梯度可以通過Wq(i) 進(jìn)行計(jì)算,具體計(jì)算公式見式(12)
(12)
在計(jì)算?Wq/?t這一項(xiàng)時(shí),可以使用tanh函數(shù)進(jìn)行近似計(jì)算。令?T/?t=tanh(R(i)2-t),則求值的具體公式見式(13)
-R(i)⊙tanh′(R(i)2-t)
(13)
FPGA加速器整體架構(gòu)如圖1所示,包括控制器、卷積層計(jì)算單元、片上緩沖區(qū)、外部存儲器和其它層的計(jì)算單元。
圖1 加速器架構(gòu)
控制器負(fù)責(zé)協(xié)調(diào)不同計(jì)算單元在運(yùn)行期間的執(zhí)行順序,驅(qū)動加速器以流水線模式高效運(yùn)行。卷積層的計(jì)算單元主要負(fù)責(zé)MobileNetV2中不同卷積模塊的計(jì)算,最多可兼容標(biāo)準(zhǔn)卷積、逐通道卷積以及逐點(diǎn)卷積等3種不同卷積模塊的實(shí)現(xiàn)。外部存儲器主要用于存儲原始輸入圖像和最終計(jì)算結(jié)果,僅在網(wǎng)絡(luò)輸入和輸出端與片上產(chǎn)生交互。片內(nèi)緩沖區(qū)包括輸入緩沖區(qū)、輸出緩沖區(qū)和權(quán)重緩沖區(qū)等,遵循了分層存儲策略,根據(jù)參數(shù)的數(shù)量和使用頻率來分配各自的片上存儲資源。其它層的計(jì)算單元主要包括了MobileNetV2中涉及的全局平均池化層、Relu6激活函數(shù)層以及BN層等。
加速器包含控制器、卷積模塊、池化層、BN層、激活等多個(gè)FPGA內(nèi)核。內(nèi)核之間的數(shù)據(jù)流動效率將直接影響加速器的推理速度。OpenCL SDK提供了通道作為內(nèi)核之間通信的橋梁,這意味著內(nèi)核之間可以使用先進(jìn)先出(first in first out,F(xiàn)IFO)緩沖區(qū)直接進(jìn)行片上通信。如圖2所示,加速器的數(shù)據(jù)流就是使用通道按照順序構(gòu)建起來的。
圖2 數(shù)據(jù)流
加速器上的數(shù)據(jù)流動,可以分為阻塞式和非阻塞式。當(dāng)加速器開始運(yùn)行時(shí),控制器處于阻塞式讀取模式,此時(shí)控制器要確保讀取的數(shù)據(jù)可用,以便整個(gè)流水線可以正確啟動。輸入圖像和權(quán)重?cái)?shù)據(jù)從片外內(nèi)存加載到片上緩沖區(qū)中,當(dāng)控制器讀取到數(shù)據(jù)時(shí),開始執(zhí)行卷積、激活、池化的計(jì)算流程。池化單元計(jì)算得到的輸出值被寫回控制器,此時(shí)加速器開始執(zhí)行層間計(jì)算流程,并且控制器將切換為非阻塞式讀取模式以避免加速器在運(yùn)行期間因阻塞而停止運(yùn)行。同時(shí)如果該層存在殘差連接,則將輸出結(jié)果提前寫入到輸出緩沖區(qū)內(nèi)。
一般來說,與片外內(nèi)存的頻繁通信會導(dǎo)致加速器能耗增加,因此本文使用了片上緩存來存儲網(wǎng)絡(luò)中間層的全部輸出數(shù)據(jù)以減少與片外的通信。類似的研究中大多使用雙緩沖區(qū)技術(shù)也就是使用兩個(gè)相同的緩沖區(qū)在每個(gè)時(shí)鐘周期內(nèi)同時(shí)讀寫來加速數(shù)據(jù)處理過程。然而,這種技術(shù)的主要缺陷在于雙緩沖區(qū)的尺寸需要滿足中間層的最大存儲需求。因此,本文提出了非對稱式動態(tài)雙緩沖區(qū)技術(shù),將內(nèi)存區(qū)域劃分為兩塊大小不等的子區(qū)域,并根據(jù)實(shí)際網(wǎng)絡(luò)模型的架構(gòu)設(shè)置不同的緩沖區(qū)配置比例。因此,緩沖區(qū)的大小的計(jì)算實(shí)際上就可以被轉(zhuǎn)化為求解以下問題
argmin(SIZE(layeri)+SIZE(layeri+1))
(14)
根據(jù)求解得到的結(jié)果,就可以得到最優(yōu)的緩沖區(qū)配置比例。并且將最優(yōu)比例與每一層的中間數(shù)據(jù)大小相結(jié)合,就能夠提前計(jì)算出每一層的緩沖區(qū)讀取基地址和緩沖區(qū)寫入基地址。控制器通過指令流將預(yù)計(jì)算的基地址傳入加速器,從而實(shí)現(xiàn)運(yùn)行時(shí)對緩沖區(qū)的動態(tài)數(shù)據(jù)讀寫。經(jīng)計(jì)算,在MobileNetV2層中的最優(yōu)緩沖區(qū)配置為第五層與第六層的組合。
深度可分離卷積比普通卷積有更低的參數(shù)量和計(jì)算成本,但它也給基于標(biāo)準(zhǔn)卷積的加速體系結(jié)構(gòu)帶來了相當(dāng)大的挑戰(zhàn)[13]。適用于標(biāo)準(zhǔn)卷積的計(jì)算單元,往往無法在逐通道卷積和逐點(diǎn)卷積的運(yùn)算模式中高效地運(yùn)算。
Ming等[5]嘗試為每種卷積運(yùn)算類型設(shè)計(jì)一個(gè)專用引擎來針對性地提高計(jì)算效率,但是在MobilenetV2中3種卷積類型各自的計(jì)算量很不平衡,反而會使得不同計(jì)算單元的工作負(fù)載不平衡,進(jìn)而導(dǎo)致整體硬件資源利用率降低,白白浪費(fèi)功耗。相反,如果為不同的卷積類型設(shè)計(jì)一個(gè)統(tǒng)一的計(jì)算單元,就可以解決負(fù)載不平衡的問題,獲得更高的計(jì)算資源綜合利用率。
本文將卷積計(jì)算單元從邏輯上分解為移位計(jì)算陣列和加法器樹,并根據(jù)不同的卷積類型設(shè)計(jì)了不同的組合方案,從而提出了一種可兼容多個(gè)卷積類型的新的計(jì)算單元設(shè)計(jì)方案。為了保證計(jì)算單元在不同工作模式下保持統(tǒng)一,本文針對不同卷積類型設(shè)計(jì)了專門的數(shù)據(jù)重排序過程。同時(shí),本文根據(jù)標(biāo)準(zhǔn)卷積、逐通道卷積、逐點(diǎn)卷積等卷積類型的不同計(jì)算策略提出了能夠在統(tǒng)一的硬件電路上部署的并行化策略。
如圖3所示,一個(gè)完整的卷積計(jì)算單元包含了行緩沖區(qū)以及移位和陣列。
圖3 卷積計(jì)算單元架構(gòu)
在卷積計(jì)算之前,控制器將下一層的輸入數(shù)據(jù)和權(quán)重參數(shù)進(jìn)行分組并分別發(fā)送給卷積計(jì)算單元。引擎的行緩存按照非對稱式動態(tài)雙緩沖區(qū)的設(shè)計(jì)思路接收并存儲這些數(shù)據(jù),同時(shí)也將當(dāng)前層計(jì)算所需的數(shù)據(jù)發(fā)送到移位和陣列。根據(jù)預(yù)先配置的工作模式控制位,移位單元陣列和加法器樹會以不同的方案進(jìn)行配置。移位單元陣列利用FPGA中數(shù)量充足的查找表對數(shù)據(jù)實(shí)現(xiàn)移位運(yùn)算,最后再由加法器樹對中間結(jié)果求和從而完成整個(gè)卷積計(jì)算。
3.3.1 標(biāo)準(zhǔn)卷積
為了充分利用FPGA設(shè)備的硬件資源,提高標(biāo)準(zhǔn)卷積模式下的并行性,本文針對參與運(yùn)算的數(shù)據(jù)設(shè)計(jì)了5個(gè)并行級別,并將其定義為計(jì)算單元并行度level_R,輸出通道并行度level_N,輸入通道并行度level_C,寬度并行度le-vel_W,高度并行度level_H。同時(shí),將level_R的值設(shè)置成輸出通道并行度level_N,以確保運(yùn)算單元能正確處理輸入數(shù)據(jù)的格式,使每一個(gè)計(jì)算單元最終只生成一個(gè)通道的輸出數(shù)據(jù)。
為了更好地描述計(jì)算單元在特定模式下的并行計(jì)算能力,本文將Parallelstandard定義為在指定工作模式下,計(jì)算單元在一個(gè)時(shí)鐘周期內(nèi)并行執(zhí)行的卷積運(yùn)算次數(shù)。因此標(biāo)準(zhǔn)卷積模式下的計(jì)算單元并行度Parallelstandard可以通過下列公式計(jì)算
Parallelstandard=k×level_R×(level_W-k+1)×
(15)
式中:k表示卷積核的尺寸,C表示輸入特征圖的通道數(shù)。
如圖4所示,為了使不同工作模式下的數(shù)據(jù)格式保持一致并與并行策略相匹配,輸入數(shù)據(jù)會被重新排序。
圖4 標(biāo)準(zhǔn)卷積工作模式的數(shù)據(jù)重排序
圖的頂部為輸入特征圖陣列和權(quán)重陣列,底部為重排序后的數(shù)據(jù)存儲格式。頂部的序號表示輸入數(shù)據(jù)在滑動窗口內(nèi)的原始存儲順序,經(jīng)過重新排序后與底部的序號形成一一對應(yīng)關(guān)系。最終,計(jì)算單元會根據(jù)圖中的數(shù)據(jù)存儲格式接收輸入數(shù)據(jù)和權(quán)重?cái)?shù)據(jù),并最終計(jì)算出卷積結(jié)果。
3.3.2 逐點(diǎn)卷積
逐點(diǎn)卷積的計(jì)算過程實(shí)際上等同于1×1卷積,之前的工作[4,6,13]中使用標(biāo)準(zhǔn)卷積的計(jì)算單元直接實(shí)現(xiàn)逐點(diǎn)卷積而沒有進(jìn)行專門的優(yōu)化。然而,由式(16)所示,這種方式實(shí)際上會使得當(dāng)前計(jì)算單元的并行度Parallelpointwise降低約level_H倍,沒有充分利用計(jì)算標(biāo)準(zhǔn)卷積所需的硬件資源
(16)
因此,逐點(diǎn)卷積也需要對數(shù)據(jù)的讀取順序進(jìn)行如圖5所示的重排序過程。逐點(diǎn)卷積工作模式下,計(jì)算單元將會按順序依次讀取3個(gè)輸入通道的權(quán)重,并重排序組合成與標(biāo)準(zhǔn)卷積一致的數(shù)據(jù)排列順序。
圖5 逐點(diǎn)卷積工作模式的數(shù)據(jù)重排序
權(quán)重?cái)?shù)據(jù)的重排序?qū)⑹沟糜?jì)算單元在逐點(diǎn)卷積的模式下能夠保持與在標(biāo)準(zhǔn)卷積模式時(shí)一致的數(shù)據(jù)排列順序,因此計(jì)算單元即使處于逐點(diǎn)卷積模式,也可以充分利用標(biāo)準(zhǔn)卷積時(shí)用到的移位單元陣列和加法器樹模塊。
3.3.3 逐通道卷積
與標(biāo)準(zhǔn)卷積相比,逐通道卷積在計(jì)算過程中最大的不同是每個(gè)輸出特征圖通道都是由一個(gè)內(nèi)核通道與一個(gè)輸入特征圖通道進(jìn)行卷積而產(chǎn)生的,并且每個(gè)維度之間均沒有數(shù)據(jù)依賴關(guān)系。
因此逐通道卷積的并行計(jì)算能力Paralleldepthwise實(shí)際上降低了level_R倍,這意味著同一時(shí)間只有一個(gè)計(jì)算單元在進(jìn)行運(yùn)算,完全喪失了level_R并行度的優(yōu)勢。因此,本文利用了逐通道卷積的計(jì)算特性,通過控制器對輸入數(shù)據(jù)進(jìn)行如圖6所示的重排序,使得輸入數(shù)據(jù)以額外的level_R維度被送入,從而充分能夠利用多個(gè)計(jì)算單元并行處理的優(yōu)勢。
圖6 逐通道卷積工作模式的數(shù)據(jù)重排序
圖7顯示了優(yōu)化后的計(jì)算單元在處于逐通道卷積工作模式下會被激活的計(jì)算陣列,其中實(shí)線部分表示被激活的陣列而虛線部分則表示未被激活的部分。不同工作模式僅在加法器樹的連接配置中有所區(qū)分。
圖7 逐通道卷積的計(jì)算陣列
最終,優(yōu)化后的Paralleldepthwise可以通過式(17)計(jì)算得出
Paralleldepthwise=
k×level_R×(level_W-k+1)×level_H
(17)
為了評估本文提出的DTSSQ量化方案的有效性,本文使用CIFAR-10和CIFAR-100數(shù)據(jù)集對模型進(jìn)行訓(xùn)練,這兩個(gè)數(shù)據(jù)集是深度學(xué)習(xí)中常用的識別常見物體的數(shù)據(jù)集,分別包含了10類和100類輸入圖像,共計(jì)60 000張圖片。
實(shí)驗(yàn)選取的模型為Resnet18和Resnet20,模型的編譯語言為Python3.7,開發(fā)框架為PyTorch1.7.1。
本文將DTSSQ方案和在ResNet網(wǎng)絡(luò)上表現(xiàn)良好的幾種量化方案在CIFAR-10和CIFAR-100數(shù)據(jù)集上分別進(jìn)行了比較,其中包括Zhou等[15]的DOREFA-NET、Choi等[16]的PACT、Ding等[17,18]的FlightNNs和LightNN。為與其它量化方案的實(shí)驗(yàn)配置保持一致,模型的第一層和最后一層不進(jìn)行量化。
實(shí)驗(yàn)結(jié)果見表1,DTSSQ量化方案在CIFAR100和CIFAR10數(shù)據(jù)集上均表現(xiàn)良好,在CIFAR10數(shù)據(jù)集上Resnet20的準(zhǔn)確率達(dá)到了92.84%,與全精度baseline相比提高了約0.8%。而在CIFAR100數(shù)據(jù)集上訓(xùn)練的Resnet18的準(zhǔn)確率達(dá)到了71.84%,與baseline相比提高了約1%,與FlightNNs相比提高了約1.3%,可見基于可微閾值的方案能夠有效地降低量化誤差,并且通過重訓(xùn)練對閾值的動態(tài)調(diào)整,最終得到的量化精度與全精度網(wǎng)絡(luò)相比也有明顯提高。
表1 量化性能結(jié)果
輕量級卷積神經(jīng)網(wǎng)絡(luò)硬件加速器部署的平臺為Intel Arria10 GX1150,軟件開發(fā)環(huán)境為CentOS Linux release 7.9.2009+Intel OpenCL 19.1 SDK。使用OpenCL語言將經(jīng)過軟硬件協(xié)同優(yōu)化后的加速器架構(gòu)進(jìn)行編碼表達(dá),編碼完成后連接FPGA加速卡進(jìn)行編譯,SDK會將高層次的開發(fā)語言轉(zhuǎn)化為對硬件電路的描述,最終部署完成后,整體的資源利用率見表2。
表2 資源利用率/%
本文將MobileNetV2的FPGA加速器與其GPU版本和CPU版本進(jìn)行了對比實(shí)驗(yàn)。實(shí)驗(yàn)采用的CPU是12核心24線程的Intel Xeon CPU E5-2678 v3@2.5 GHZ,GPU是來自NVIDIA的專業(yè)計(jì)算卡Tesla V100。對比結(jié)果見表3。
表3 與CPU和GPU對比
從表中可以看出,CPU版本MobileNetV2的平均推理速度為29.9 ms,與之相比,F(xiàn)PGA加速器的平均加速比為9.3,具有更好的性能優(yōu)勢。而GPU作為一個(gè)通用加速器,MobileNetV2模型無法完全利用其硬件資源。因此,GPU的平均推理速度需要7.55 ms,與之對比,在FPGA上部署的模型推理速度比GPU的快了約3倍。
如表4所示,本文選取了幾項(xiàng)類似的基于FPGA的MobileNetV2加速器實(shí)現(xiàn)方案,與本文設(shè)計(jì)的加速器進(jìn)行了對比。
表4 加速性能對比
從表中可以看出,本文提出的加速器最終實(shí)現(xiàn)了311.6 fps的推理速度,優(yōu)于大部分的FPGA加速器,并且本文設(shè)計(jì)的DTSSQ量化方案使得卷積的計(jì)算能夠借由FPGA上充足的查找表來實(shí)現(xiàn),每個(gè)時(shí)鐘周期內(nèi)能夠完成更多的計(jì)算,因此在吞吐量方面加速器也占據(jù)了優(yōu)勢。
另外,本文的加速器也具備使用高級語言開發(fā)易于部署的優(yōu)勢。實(shí)驗(yàn)結(jié)果表明,我們實(shí)現(xiàn)的基于FPGA的輕量級卷積神經(jīng)網(wǎng)絡(luò)加速器相比其它輕量級卷積神經(jīng)網(wǎng)絡(luò)加速器實(shí)現(xiàn)了更高的吞吐量和更快的推理速度。
本文利用FPGA的硬件可編程優(yōu)勢,進(jìn)行軟硬件協(xié)同優(yōu)化,對基于FPGA的輕量級卷積神經(jīng)網(wǎng)絡(luò)加速方案進(jìn)行了深入研究,為進(jìn)一步改善輕量化網(wǎng)絡(luò)應(yīng)用的性能提供了方法和方案。
首先,本文提出了一種基于可微閾值的選擇性移位量化方案,解決了傳統(tǒng)移位量化算法精度迅速飽和的問題。實(shí)驗(yàn)結(jié)果表明,提出的量化方案在CIFAR10和CIFAR100數(shù)據(jù)集上量化后的精度相比全精度網(wǎng)絡(luò)分別提高了0.8%和1%。
其次,本文設(shè)計(jì)了一種基于FPGA的高性能加速架構(gòu)來適應(yīng)輕量化網(wǎng)絡(luò)計(jì)算特征,并提出了非對稱式動態(tài)雙緩沖區(qū)技術(shù)與具有更高兼容性的統(tǒng)一卷積計(jì)算單元。實(shí)驗(yàn)結(jié)果表明,提出的加速器架構(gòu)幾乎不使用DSP就可以完成卷積運(yùn)算,最終實(shí)現(xiàn)了98.62 GOPS的吞吐量和311.6 fps的推理速度。