錢佳明,婁文啟,宮 磊,王 超,周學(xué)海
1.中國科學(xué)技術(shù)大學(xué)計算機科學(xué)與技術(shù)學(xué)院,合肥230027
2.中國科學(xué)技術(shù)大學(xué)蘇州高等研究院,江蘇蘇州215123
隨著大數(shù)據(jù)時代的來臨和計算機運算能力的提高,2D-CNN在圖像分類方面取得了最先進的精度。然而,在處理視頻等高維數(shù)據(jù)時,基于圖像的2D-CNN無法對其中的時間信息和運動模式進行建模,因此無法取得令人滿意的效果。為了實現(xiàn)對視頻等高維數(shù)據(jù)的精確分類,研究人員提出使用三維卷積來捕獲視頻等數(shù)據(jù)中的時空信息。2010年,Ji等人首次提出了三維卷積神經(jīng)網(wǎng)絡(luò)[1],其在相鄰的圖像幀上執(zhí)行三維卷積以提取時間和空間維度上的特征。隨后,Tran等人提出了一個現(xiàn)代意義上的深度架構(gòu)C3D[2],C3D 相對于以往的3D-CNN 具有更深的層,故而可以在大規(guī)模數(shù)據(jù)集上進行學(xué)習(xí)并取得最優(yōu)的結(jié)果。此后,3D-CNN 在視頻分析、三維幾何數(shù)據(jù)分析、三維醫(yī)學(xué)圖像診斷方面取得了巨大的成功[3-5]。然而,與算法性能提升相對應(yīng)的是3D-CNN顯著增加的模型尺寸和計算量。例如,在網(wǎng)絡(luò)結(jié)構(gòu)相同的情況下,3D ResNet-34[6]的參數(shù)數(shù)目和計算量分別為6.35×105和36.7 GFLOPs,是2D ResNet-34(參數(shù)數(shù)目2.15×105,計算量3.5 GFLOPs)的2.95倍和10.49倍。相比于2D-CNN,3D-CNN 額外增加了時間維度以捕獲時域特征,因此3D-CNN的部署存在更為龐大的存算開銷。
針對這一問題,研究者在傳統(tǒng)ASIC 和FPGA 專用AI 加速器設(shè)計的基礎(chǔ)上[7-12],提出了一系列軟硬件協(xié)同優(yōu)化方法,在算法端對3D-CNN 模型的計算復(fù)雜度、存儲開銷進行優(yōu)化,并在硬件端設(shè)計與算法端適配的計算核心,以求達到更優(yōu)的硬件部署效率[13-17]。其中,Sun等人對3D-CNN進行稀疏化處理[13],通過裁剪冗余權(quán)值減少模型的計算和存儲開銷。然而,剪枝操作引入了計算和訪存的不規(guī)則性,在導(dǎo)致額外硬件設(shè)計開銷的同時也使得硬件加速器難以獲得理想的性能提升;3D-VNPU[14]和F3D[15]分別采用了3D Winograd與3D FFT變換來減少卷積操作的計算量。盡管快速算法未引入不規(guī)則性,但其只對模型計算復(fù)雜度進行了優(yōu)化而未降低模型訪存需求。此外,該類方法對卷積核大小敏感,也限制了其應(yīng)用場景。例如,兩者都無法加速1×1×1卷積,這在現(xiàn)代網(wǎng)絡(luò)中占據(jù)了主要計算量,如3D ResNet、3D MobileNet;Wu 等人提出了一種混合張量分解策略[16],該策略對卷積層使用Tensor Train分解,對全連接層使用Hierarchical Tucker 分解,取得了比單一分解方法更好的壓縮效果。然而,這類基于低秩分解的壓縮方法往往會使模型的訓(xùn)練過程變得更加復(fù)雜,并且同樣無法有效應(yīng)用于小卷積核。總的來說,相關(guān)工作仍未妥善解決3D-CNN的處理效率問題,使其在能效/資源受限場景下的部署仍面臨嚴峻的性能和能效挑戰(zhàn)。
針對上述挑戰(zhàn),本文基于FPGA提出了面向3D-CNN高效硬件部署的算法-硬件協(xié)同設(shè)計與優(yōu)化方法3D FCirNN。在算法層面,為了緩解以往稀疏化帶來的不規(guī)則性,本文首次采用分塊循環(huán)矩陣來壓縮3D-CNN的權(quán)重,配合FFT 的加速,進一步將計算復(fù)雜度從O(N2)減少為O(NlbN)。此外,為緩解FFT 在不同網(wǎng)絡(luò)層加速過程中所引入的時域/頻域切換開銷,本文引入了頻域內(nèi)的激活、批歸一化和池化層,實現(xiàn)了全頻域計算。在硬件層面,本文基于FPGA平臺設(shè)計了一個和算法端適配的高效硬件架構(gòu),并針對片外訪存效率、實數(shù)序列FFT 后復(fù)數(shù)的運算特點,提出了一系列面向硬件資源、內(nèi)存帶寬的優(yōu)化措施,顯著提升了模型硬件部署的性能和計算效率。本文的主要貢獻如下:
(1)本文首次引入分塊循環(huán)矩陣對3D-CNN進行壓縮,并采用快速傅里葉變換進行加速,在精度損失較小的情況下,取得了相當(dāng)可觀的加速效果。在此基礎(chǔ)上,為了消除由于FFT 所引入的頻繁的時域/頻域切換開銷,本文進一步引入了頻域中的激活、批歸一化以及池化層,實現(xiàn)了全頻域推理。
(2)本文在FPGA平臺上實現(xiàn)了一個高效的硬件加速器。在訪存方面,通過對特征圖進行NC/8DHW8 格式的數(shù)據(jù)重排,顯著提升了片外訪存效率;在硬件資源方面,通過充分挖掘?qū)崝?shù)序列FFT 的特點,以及Xilinx DSP Slice的計算能力,進一步減少了資源占用,提升了加速器的性能。
(3)在Xilinx ZCU102 FPGA 上的實驗表明,相較于以往最先進的工作,3D FCirCNN可以在精度損失可接受的范圍內(nèi),取得接近32 倍的壓縮比,以及16.68 倍的性能提升和16.18倍的計算效率提升。
先前的工作表明,3D-CNN目前在視頻理解等領(lǐng)域已經(jīng)達到了最先進的精度。然而,和2D-CNN 不同的是,為了提取時空信息,3D-CNN 在二維卷積的基礎(chǔ)上增加了一個時間維度,形成了三維卷積。如圖1 所示,在三維卷積中,卷積核不僅會沿著輸入特征的空間維度滑動(R、C方向),也會沿著輸入特征的時間維度(D方向)滑動,因此,三維卷積可以同時捕獲輸入特征的時空信息,相較于二維卷積具有更強的特征提取能力。假設(shè)輸入視頻In的空間分辨率為R×C,共有D幀(時間維度)和N個通道,權(quán)重W的卷積核數(shù)目為M,每一個卷積核的空間尺寸為Kr×Kc,時間尺寸為Kd,通道數(shù)目為N,則輸入和權(quán)重進行三維卷積,會得到一個空間分辨率為(R-Kr+1)×(C-Kc+1),時間維度為D-Kd+1,通道數(shù)目為M的輸出特征圖Out,其計算過程可由公式(1)所描述:
圖1 三維卷積操作Fig.1 3D convolutional operation
顯然,二維卷積是三維卷積在D=1、Kd=1 情況下的特例。分析可知,三維卷積的計算復(fù)雜度為M×N×D×R×C×Kd×Kr×Kc,存儲開銷為M×N×Kd×Kr×Kc。因此,相對于2D-CNN,3D-CNN 在模型大小方面增長了Kd倍,在模型計算量方面增長了D×Kd倍,計算量的增長相對于模型大小的增長更加顯著,故三維卷積是一個更加計算密集的算法。例如,在C3D[2]模型中,卷積層占了整個網(wǎng)絡(luò)計算量的99.8%以上。
在3D-CNN中,全連接層具有和2D-CNN相同的計算模式。假設(shè)全連接層輸出特征a和輸入特征x的維度分別為M、N,權(quán)重W是一個M×N的矩陣,不考慮偏置,則全連接層的計算可以表示為一個矩陣-向量乘法,即a=W?x,其計算復(fù)雜度和存儲開銷均為M×N。和三維卷積不同的是,在3D-CNN 中,全連接層的計算量占比較小,但卻占據(jù)了大部分的存儲開銷,是整個網(wǎng)絡(luò)的存儲瓶頸。
循環(huán)矩陣(circulant matrix)是一種特殊形式的托普利茲矩陣(Toeplitz matrix),一個N×N的矩陣A是一個循環(huán)矩陣,當(dāng)且僅當(dāng)其每一行元素都是上一行元素循環(huán)右移一個位置的結(jié)果,如圖2(a)所示,用數(shù)學(xué)公式描述,就是A[i][j]=A[(i+1)%N][(j+1)%N]。根據(jù)該性質(zhì)可知,只需存儲A矩陣的第一列元素(稱A矩陣的第一列元素所構(gòu)成的向量為該循環(huán)矩陣的生成向量),就可以表示整個矩陣,從而將存儲開銷由O(N2) 減少為O(N)。此外,循環(huán)矩陣在帶來O(N)倍壓縮比的同時,還可以有效降低矩陣-向量乘法的計算復(fù)雜度:根據(jù)循環(huán)卷積定理[18],一個N×N的循環(huán)矩陣A和一個N×1的任意向量x相乘,可以通過公式(2)進行加速:
圖2 循環(huán)矩陣及其壓縮方法Fig.2 Circulant matrix and its compression method
其中,a是循環(huán)矩陣A的生成向量,F(xiàn)FT、IFFT分別表示快速傅里葉變換及其逆變換,⊙表示元素級乘法,如圖3所示。注意到N點FFT/IFFT的計算復(fù)雜度為O(NlbN),因此,通過循環(huán)卷積定理,可以將原先O(N2)的計算復(fù)雜度減少為O(NlbN),從而取得O(N/lbN)倍的計算壓縮比。
圖3 循環(huán)矩陣-向量乘法的FFT加速Fig.3 FFT acceleration of circulant matrix-vector multiplication
根據(jù)定義,循環(huán)矩陣必須為方陣(即矩陣行數(shù)等于列數(shù))。然而,在絕大多數(shù)情況下,矩陣往往不具備這一形式,因此無法直接用循環(huán)矩陣進行壓縮。對此,可以通過分塊來解決這一問題。該方法首先對矩陣進行分塊操作,例如圖2(b)中4×8 的矩陣被劃分為2 個4×4 的子矩陣,然后令每一個子矩陣都具有循環(huán)矩陣的結(jié)構(gòu),則根據(jù)循環(huán)矩陣的性質(zhì),只需存儲每一個循環(huán)矩陣的生成向量即可(圖2(b)中紅框內(nèi)的4×2個元素),從而起到4倍(等于分塊大?。┑膲嚎s效果。顯然,在該壓縮方法中,壓縮比由矩陣的分塊大小決定。因此,可以通過調(diào)節(jié)矩陣的分塊大小,在精度和壓縮比之間進行權(quán)衡:分塊越大,其所能提供的壓縮比則越大,而由此帶來的精度損失也越大,反之亦然。
由于循環(huán)矩陣可以有效降低矩陣的存儲和計算開銷,一些研究人員開始將該方法應(yīng)用于神經(jīng)網(wǎng)絡(luò)的壓縮中[19-21]。Zhao 等人從理論上證明了循環(huán)矩陣在壓縮深度學(xué)習(xí)模型方面的有效性[22]:在神經(jīng)網(wǎng)絡(luò)理論中,通用近似性質(zhì)(universal approximation property)是指在參數(shù)數(shù)目足夠多的情況下,神經(jīng)網(wǎng)絡(luò)以任意的精度逼近任何連續(xù)或可測函數(shù)的能力,這一性質(zhì)為神經(jīng)網(wǎng)絡(luò)解決一系列機器學(xué)習(xí)問題提供了理論保證。Zhao 指出,采用分塊循環(huán)矩陣壓縮后的神經(jīng)網(wǎng)絡(luò)仍然具有這一性質(zhì),并且該結(jié)論可以進一步推廣到更一般的低位移秩矩陣神經(jīng)網(wǎng)絡(luò)。
在3D-CNN 中,全連接層可以表示為矩陣-向量乘法操作。假設(shè)輸入特征x和輸出特征a的維度分別為N、M,則權(quán)重W為一個M×N的矩陣。為了使用循環(huán)矩陣對全連接層進行壓縮,首先將權(quán)重W劃分為p×q個B×B尺寸的子矩陣Wij(這里p=M/B,q=N/B,i=0,1,…,p-1,j=0,1,…,q-1)。令每一個子矩陣Wij均為循環(huán)矩陣,對應(yīng)生成向量為wij。此時,對于所有的權(quán)值子矩陣Wij,僅需存儲其各自對應(yīng)的生成向量wij,因此總的存儲開銷為pqB,相較于未壓縮時MN(pqB2)的存儲開銷,可以獲得B倍的壓縮收益。與上述壓縮方法相對應(yīng),當(dāng)使用壓縮后的權(quán)重W與維度為N×1 的輸入特征x進行計算時,對應(yīng)需要將x劃分為q個尺寸為B×1 的子向量xj,同理尺寸為M×1 的結(jié)果向量a將被劃分為p個B×1 的子向量ai,分別計算,如公式(3)所示:
在此基礎(chǔ)上,考慮到Wij為循環(huán)矩陣,其對應(yīng)的生成向量為wij,故矩陣向量乘法Wij?xj可以進一步采用FFT進行加速,相應(yīng)的ai計算過程如公式(4)所示:
為了進一步減少IFFT的調(diào)用次數(shù),可以利用FFT/IFFT的線性性質(zhì)[23],將IFFT移至求和符號外,如公式(5)所示:
從而將IFFT的調(diào)用次數(shù)由q減少為1。綜上所述,經(jīng)過分塊循環(huán)矩陣壓縮,全連接層的計算復(fù)雜度可以由O(pqB2)減少為O(pqBlbB)。
為方便敘述,約定M、N分別為三維卷積的輸出、輸入通道數(shù),D、R、C分別為輸出特征在時間、高度、寬度三個維度上的大小,K、B分別表示卷積核尺寸和循環(huán)矩陣塊大小,則輸入特征圖I、權(quán)重W和輸出特征圖O分別是尺寸為N×(D+K-1)×(R+K-1)×(C+K-1)、M×N×K×K×K、M×D×R×C的多維張量。為了使用循環(huán)矩陣壓縮三維卷積層權(quán)重,首先將權(quán)重張量W(圖4(a))視為K3個尺寸為M×N的矩陣,如圖4(b)所示,而后再將其中每個M×N矩陣劃分為P×Q個尺寸為B×B的子矩陣Wp,q,i,j,k(P=M/B,Q=N/B,p=0,1,…,P-1,q=0,1,…,Q-1,i,j,k=0,1,…,K-1) ,最后,令每一個子矩陣Wp,q,i,j,k均為循環(huán)矩陣。與之相對應(yīng),原權(quán)值矩陣可由子矩陣Wp,q,i,j,k的生成向量wp,q,i,j,k表示,如圖4(c)所示,從而將卷積層權(quán)值的存儲開銷由MNK3減少為PQBK3,取得B倍的壓縮效果。
圖4 卷積層權(quán)重的壓縮Fig.4 Compression of convolutional layer weights
與卷積層的壓縮過程相對應(yīng),其計算過程如圖5所示,其中①是原始的三維卷積的偽代碼。由于在壓縮卷積層權(quán)重時已經(jīng)對輸入、輸出通道進行了分塊操作,因此,①可以進一步改寫為圖5 中②所對應(yīng)的分塊矩陣-向量乘法的形式。進一步地,根據(jù)卷積層的壓縮策略,對于每一組給定的p,q,i,j,k,W[pB+B:pB][qB+B:qB][i][j][k]均為循環(huán)矩陣,因此②可以進一步通過③所對應(yīng)的FFT 操作進行優(yōu)化,其中,w[p][q][:][i][j][k]是循環(huán)矩陣W[pB+B:pB][qB+B:qB][i][j][k]對應(yīng)的生成向量。
圖5 卷積計算的加速Fig.5 Acceleration of convolutional calculations
得益于三維卷積中多種形式的數(shù)據(jù)復(fù)用,F(xiàn)FT加速給卷積層帶來的收益更加可觀。壓縮前卷積層的計算復(fù)雜度為O(MNDRCK3),而根據(jù)對圖5中③的分析可知,對輸入特征、權(quán)重以及輸出特征進行FFT/IFFT變換的計算復(fù)雜度分別為O(NDRClbB)、O(K3PQBlbB)和O(MDRClbB),元素級乘法的計算復(fù)雜度為O(MNDRCK3/B),故計算復(fù)雜度的理論壓縮比可以由公式(6)所描述:
考慮到在3D-CNN中,M、N、D、R、C的值遠大于B、K,因此壓縮后卷積層的計算復(fù)雜度(即公式(6)中的分母)可近似為O(MNDRCK3/B),對應(yīng)計算壓縮比約為O(B),相比全連接層O(B/lbB)倍的壓縮效果,取得了更為明顯的提升。
根據(jù)上述分析可知,采用分塊循環(huán)矩陣和FFT 對3D-CNN的卷積層和全連接層進行壓縮和加速后,網(wǎng)絡(luò)層的計算流程變?yōu)椋篎FT →元素級乘法→IFFT。該過程涉及較為頻繁的時域/頻域切換:如圖6(a)所示,由于傳統(tǒng)前饋過程中激活、批歸一化以及池化層需要在時域中進行計算,因此,每次在頻域中計算完卷積層/全連接層后需要通過IFFT將結(jié)果轉(zhuǎn)化至?xí)r域(圖6(a)中的①)。而在進行下一次卷積層或全連接層操作時,又必須將時域特征通過FFT轉(zhuǎn)換至頻域(圖6(a)中的②)。頻繁的頻域/時域轉(zhuǎn)換將嚴重影響前饋過程的硬件加速效果:(1)由于FFT/IFFT是計算密集型算法,轉(zhuǎn)換過程本身存在較大開銷;(2)在設(shè)計硬件加速器時,需要專門的硬件模塊計算FFT/IFFT,會消耗額外的硬件資源;(3)FFT/IFFT算法會引入計算誤差,對模型量化不友好。
圖6 全頻域推理Fig.6 Full frequency domain inference
為解決該問題,本文提出了針對激活層、批歸一化層、池化層的頻域算子,并在此基礎(chǔ)上實現(xiàn)了全頻域前饋計算,以此消除頻繁的時域/頻域切換開銷。全頻域前饋過程如圖6(b)所示。在選取頻域算子時綜合考慮了以下兩方面因素:其一是頻域算子的計算復(fù)雜度不能過高,否則其計算開銷可能抵消全頻域計算所帶來的收益;其二是頻域算子的引入不能造成較大的精度損失。權(quán)衡這兩點,本文最終選擇CReLU[24]、CBN和CMaxPool作為激活層、批歸一化層、池化層的頻域算子,相應(yīng)表達式分別如公式(7)~(9)所示:
其中,ReLU、BN和Maxpool分別是實數(shù)域上的激活、批歸一化和最大池化操作。由公式(7)~(9)可知,CReLU、CBN 和CMaxpool 相當(dāng)于對數(shù)據(jù)的實部和虛部分別進行ReLU、BN 和Maxpool 操作,因此,其計算開銷較小。為進一步探究頻域算子對模型精度的影響,本文使用C3D 網(wǎng)絡(luò)模型和UCF101 數(shù)據(jù)集對所提出的頻域算子進行了消融測試,結(jié)果如表1 所示。從表中可以看出,引入CReLU 后造成了0.37 個百分點的精度損失,而CBN、CMaxpool 的引入分別帶來0.556 個百分點和0.417 個百分點的精度提升。由此可見,所選頻域算子CReLU、CBN和CMaxpool在具有較低計算復(fù)雜度的同時,能夠較好地保持模型精度,充分符合全頻域前饋過程的處理要求。
表1 C3D上頻域算子消融實驗Table 1 Frequency domain operator ablation experiment on C3D
為了進一步降低模型尺寸和硬件部署時的開銷,本文對壓縮后的3D-CNN 進行了量化操作。與全頻域內(nèi)的前饋過程相對應(yīng),本文的量化操作是在復(fù)數(shù)域上進行的。在傳統(tǒng)INT8 量化感知訓(xùn)練方法的基礎(chǔ)上[25],本文進一步提出了以下量化方案:
其中,zr、zi分別為復(fù)數(shù)z的實部和虛部;Quant 為實數(shù)域上的對稱量化算子,Quant(x)=clamp([x/s],-127,127),clamp(x,a,b)用于將x的值約束在a、b之間,若x小于a則返回a,若x大于b則返回b,否則返回x,s為伸縮因子,[?]為取整操作;Dequant 為實數(shù)域上的反對稱量化算子,Dequant(x)=x?s。將CQuant和CDequant算子構(gòu)成的偽量化算子插入到神經(jīng)網(wǎng)絡(luò)的計算圖中,即可實現(xiàn)量化感知訓(xùn)練[25]。在量化過程中,為了降低量化對模型精度的影響,權(quán)重和激活、實部和虛部均采用獨立的伸縮因子。其中,權(quán)重實部和虛部的伸縮因子Siw(i=1,2,分別表示實部和虛部,下同)均是基于權(quán)重wi的統(tǒng)計信息在訓(xùn)練過程中動態(tài)計算得到的,如公式(12)所示:
而為了平滑激活的伸縮因子,防止其在訓(xùn)練過程中出現(xiàn)劇烈抖動,本文采用滑動平均法(exponential moving average)更新,如公式(13)所示:
在上式中,β∈[0,1],起調(diào)節(jié)作用,其值越小,說明歷史值的影響越大,反之則當(dāng)前值(max(|ai|)/127 占據(jù)主導(dǎo)地位。此外,在反向傳播過程中,由于取整函數(shù)(round)是不可導(dǎo)的,因此,本文采用直通估計器(straightthrough estimator,STE)[26]估計其導(dǎo)數(shù),如公式(14)所示:
加速器的整體架構(gòu)如圖7 所示,主要包括控制單元、AXI DMA、輸入特征緩存、權(quán)重緩存、輸出特征緩存、計算單元(PEs)以及后處理單元。由于FPGA片上存儲資源有限,無法一次性容納特征圖和權(quán)重,因此,在設(shè)計加速器時,本文進行了循環(huán)分塊優(yōu)化。為了方便說明,約定Tn、Tm分別為加速器輸入、輸出通道的分塊大小,同時也是加速器在輸入、輸出通道維度的并行度,Td、Tr、Tc分別為輸出特征圖時間、高度、寬度維度的分塊大小,B為分塊循環(huán)矩陣壓縮時的塊大小。上述硬件參數(shù)在加速器設(shè)計時可以根據(jù)模型定制化,以盡可能提升加速器的性能。在整個硬件架構(gòu)中,最核心的是計算單元(PEs),如圖7 所示,計算單元包含多個PE,每個PE 均由Tn/B個并行的復(fù)數(shù)乘法器構(gòu)成,相乘的結(jié)果,通過一個Tn/B輸入的復(fù)數(shù)加法樹求和,若僅在輸入、輸出通道進行循環(huán)展開,則共有Tm/B×B=Tm個PE。此外,計算單元可以根據(jù)硬件資源的數(shù)量以及實際應(yīng)用場景的需求進行靈活縮放,例如可以通過調(diào)節(jié)Tm、Tn的大小或者在其余維度上進行類似的循環(huán)展開來縮放加速器的并行度。因此,計算單元具有良好的可擴展性。為了給計算單元提供相匹配的片上訪存帶寬,輸入特征緩存、輸出特征緩存以及權(quán)重緩存分別由Tn、Tm、Tn×Tm/B個Bank構(gòu)成,不同通道的數(shù)據(jù)存儲在不同的Bank中,從而可以實現(xiàn)對數(shù)據(jù)的并行讀寫。后處理單元包括CReLU、CBN、量化和CMaxpool單元,分別如圖7 ①~④所示。所有的處理單元均由兩路構(gòu)成,分別處理輸入的實部(zr)和虛部(zi)。其中,CReLU 單元通過和實數(shù)0進行比較實現(xiàn)對復(fù)數(shù)實部和虛部的ReLU操作;CBN單元接受參數(shù)γ和β,并分別對輸入的實部和虛部進行線性變換;量化單元首先對輸入的實部和虛部分別進行縮放(×1/s),然后就近取整并將值限制在區(qū)間[-127,127]內(nèi);CMaxpool單元由兩路比較樹構(gòu)成,并由此求得每一路池化窗口內(nèi)所有數(shù)據(jù)的最大值。AXI DMA 用于在片外存儲器和加速器之間搬運數(shù)據(jù)??刂茊卧撠?zé)控制與調(diào)度整個加速器的工作。為了掩蓋數(shù)據(jù)的傳輸時間,本文的硬件加速器還進行了雙緩沖操作,通過在加載、計算、寫回之間實現(xiàn)粗粒度流水,進一步增大加速器的吞吐率。
圖7 加速器硬件架構(gòu)Fig.7 Hardware architecture of accelerator
為增大片外訪存效率,充分利用片外存儲器帶寬,本文對特征圖進行了數(shù)據(jù)重排。需要強調(diào)的是,由于加速器的計算單元是在特征圖的通道維度并行的,因此,相應(yīng)的緩存單元也需要在通道維度分割,以提供足夠的片上帶寬。例如,在圖8 ③中,片上緩存被分割為4 個Bank,每個Bank負責(zé)存儲一個通道的特征圖,以支持計算單元并行的需求。
圖8 NCHW和NC/xHWx數(shù)據(jù)排布(x=4)Fig.8 NCHW and NC/xHWx data arrangement(x=4)
現(xiàn)以二維特征圖為例(三維類似),闡述本文的數(shù)據(jù)排布策略。如圖8所示,左側(cè)是一個8通道的特征圖,每一幅特征圖的大小均為2×2,圖8 ①是常見的NCHW數(shù)據(jù)排布格式,該格式按照行主序的方式,先排布通道0的特征圖,接著排布下一個通道的數(shù)據(jù)。然而,在這種數(shù)據(jù)排布方式下,片外訪存效率難以被充分利用:假設(shè)數(shù)據(jù)位寬為8 位,總線位寬為32 位,則理論上該總線可以在1個周期內(nèi)讀取4個數(shù)據(jù)。然而,在NCHW數(shù)據(jù)排布下,即使總線能夠在一個周期內(nèi)讀取4 個數(shù)據(jù)(例如圖8 ①紅框所示),由于所讀取數(shù)據(jù)屬于同一通道,因此無法在同一周期內(nèi)寫入片上緩存,從而造成停頓。為此,本文采用了圖8 ②所示的NC/xHWx 數(shù)據(jù)排布格式(以x=4 為例,即NC/4HW4),該格式首先排布前4 個通道(0~3)的特征圖,具體的排布策略為:將這0~3通道同一像素位置(1)的數(shù)據(jù)取出并排列,接著取出這4 個通道下一個像素位置(2)的數(shù)據(jù)排列,直至所有數(shù)據(jù)都排列完畢,再對4~7 通道進行類似的排布。在該排布下,總線可以一次并行讀取4個分布于不同通道的數(shù)據(jù)(例如圖8 ②中紅框所示),并能夠在同一周期內(nèi)將所讀數(shù)據(jù)寫入片上緩存,從而充分利用了片外訪存帶寬。
3.3.1 基于復(fù)數(shù)共軛對稱性的優(yōu)化
由于在3D-CNN中,時域的激活、權(quán)重均為實數(shù),因此,其經(jīng)過FFT 變換后得到的頻域激活、權(quán)重滿足共軛對稱性。本文利用該性質(zhì),進一步對加速器進行了優(yōu)化:一個長為N的實數(shù)序列x經(jīng)過FFT變換后,得到的復(fù)數(shù)序列X滿足共軛對稱性,如公式(15)、(16)所示:
其中,Imz表示取復(fù)數(shù)z的虛部,*表示復(fù)數(shù)的共軛,即(a+bi)*=a-bi。因此,在對頻域的權(quán)重(可以預(yù)先轉(zhuǎn)化到頻域)和激活進行存儲時,可以只存儲其一部分值。對于偶數(shù)的N來說(本文在選擇循環(huán)矩陣分塊大小時,均采用偶數(shù)),只需存儲X0,X1,…,XN/2共N/2+1 個復(fù)數(shù),考慮到X0和XN/2均為實數(shù),因此,可以將X0和XN/2進一步打包為一個復(fù)數(shù)X0+iXN/2,從而將存儲空間減半,如圖9 所示。此外,由于共軛復(fù)數(shù)的乘積等于復(fù)數(shù)乘積的共軛,如公式(17)所示:
圖9 基于復(fù)數(shù)共軛對稱性的優(yōu)化Fig.9 Optimization based on complex conjugate symmetry
因此,在頻域進行復(fù)數(shù)向量的元素級乘法時,可以只計算前N/2+1 項的乘積,而后N/2-1 項乘積的結(jié)果可以由前者的復(fù)共軛得到,從而減少約50%的計算量,如圖9所示。
3.3.2 復(fù)數(shù)乘法優(yōu)化
由于在2.3節(jié)中,通過引入頻域算子,實現(xiàn)了全頻域推理,因此,在本文中,復(fù)數(shù)乘法是加速器設(shè)計中最核心的運算。然而,和實數(shù)乘法相比,復(fù)數(shù)的乘法更加復(fù)雜,如公式(18)所示:
上式表明,1次復(fù)數(shù)乘法包含了4次實數(shù)乘法和2次實數(shù)加法。為了進一步減少其計算量,作如下變換:
由式(19)~(22)可知,經(jīng)過優(yōu)化后,原先4次實數(shù)乘法、2次實數(shù)加法的復(fù)數(shù)乘法運算,計算量可以減少為3次實數(shù)乘法和5 次實數(shù)加法。由于加法的計算復(fù)雜度遠低于乘法,因此,上述優(yōu)化可以有效降低復(fù)數(shù)乘法的計算復(fù)雜度,進而減少硬件資源(如DSP Slice)的消耗(接近25%),提升加速器的計算效率。
3.3.3 基于數(shù)據(jù)共享的計算資源優(yōu)化
DSP 是FPGA 中重要的計算資源,以Xilinx FPGA為例,在UltraScale/UltraScale+系列的FPGA中,DSP48E2 Slice 包括1 個27×18 bit 的乘法器和1 個48 bit 的加法器,由于其支持較大的位寬,因此,在數(shù)據(jù)位寬較小且存在數(shù)據(jù)共享的情況下,可以進一步優(yōu)化從而提高DSP的利用率[27]。與此同時,在3D-CNN 中,存在著豐富的數(shù)據(jù)復(fù)用,包括輸入特征圖復(fù)用(input feature map reuse)、卷積核復(fù)用(filter reuse)以及卷積復(fù)用(convolutional reuse),這些復(fù)用使得數(shù)據(jù)共享成為可能?;谝陨蟽牲c,本文提出了基于INT9乘法的DSP優(yōu)化方法。
現(xiàn)考慮有三個復(fù)數(shù)x=a+bi,w1=x1+iy1,w2=x2+iy2,需要計算o1=x×w1和o2=x×w2,結(jié)合3.3.2 小節(jié)中復(fù)數(shù)乘法的優(yōu)化,對于i=1,2,有:
注意到,A1和A2共享了乘數(shù)a+b,B1和B2共享了乘數(shù)b,C1和C2共享了乘數(shù)b-a,在本文INT8 量化的情況下,a+b、b-a、x1+y1以及x2+y2都需要用9位有符號整數(shù)表示,因此,可以進一步將問題抽象為:a、b、c均為INT9 類型,需要計算x=a×b,y=a×c,如何對其進行優(yōu)化可以減少DSP資源消耗。
如圖10所示,為了對x、y的計算進行優(yōu)化,首先將b左移18位,同時將c符號擴展為27位,兩者求和,然后再和a相乘,得到o=a×(b<<18+c),最后,再從o中將x和y拆分出來:x=o35:18+o17,y=o17:0。通過上述優(yōu)化,可以實現(xiàn)1個DSP48E2 Slice同時計算兩個INT9乘法的目的,這充分挖掘了Xilinx DSP48E2 Slice 的計算能力,顯著降低了DSP 資源的使用量,進而提升了加速器的計算效率。
圖10 INT9乘法DSP優(yōu)化Fig.10 DSP optimization of INT9 multiplication
為了對本文提出的方法進行評估,本文選擇了兩個典型的3D-CNN模型:C3D[2]和3D ResNet-18[6]。C3D具有非常規(guī)整的網(wǎng)絡(luò)結(jié)構(gòu),它包含8 個卷積層、5 個池化層、2個全連接層以及一個Softmax層。其中,所有卷積核的大小均為3×3×3,步長均為1×1×1,所有的最大池化層,除第一個池化核的尺寸和步長為1×2×2 外,其余均為2×2×2。3D ResNet-18由2D ResNet-18演化而來,因此,在3D ResNet-18中,不僅包含3×3×3的標(biāo)準卷積,還包含1×1×1的點態(tài)(point-wise)卷積。此外,3D ResNet-18還具有殘差連接結(jié)構(gòu),用以解決深度網(wǎng)絡(luò)梯度消失和梯度爆炸的問題。本文采用的數(shù)據(jù)集是UCF101,該數(shù)據(jù)集包含101個類別共13 320個視頻,分辨率為320×240,幀率不固定,一般為25幀或29幀。
本文基于Pytorch深度學(xué)習(xí)框架實現(xiàn)對模型的壓縮和訓(xùn)練,實驗采用的GPU 配置為4 塊NVIDIA TITAN X。在訓(xùn)練過程中,神經(jīng)網(wǎng)絡(luò)模型所有的ReLU、BN 及Maxpool操作均被替換為CReLU、CBN和CMaxpool,以實現(xiàn)全頻域推理。同時,本文還在復(fù)數(shù)域上進行了INT8 量化感知訓(xùn)練。在整個訓(xùn)練過程中,相同模型的訓(xùn)練參數(shù)是一致的:輸入視頻的空間尺寸為112×112,通道數(shù)為3,共16幀,學(xué)習(xí)率為0.01,采用余弦學(xué)習(xí)率更新策略,訓(xùn)練300 個Epoch,C3D 和3D ResNet-18 的批處理大小分別為64和128。本文選擇Xilinx ZCU102 FPGA作為實驗的硬件平臺,開發(fā)工具為Xilinx Vivado HLS 2019.2,本文分別為C3D 和3D ResNet-18 設(shè)計了相應(yīng)的硬件加速器。其中,C3D 加速器的硬件參數(shù)為(Tn,Tm,Td,Tr,Tc)=(32,64,2,7,7),并對Tn、Tm進行循環(huán)展開;3D ResNet-18 加速器由兩個硬件加速核構(gòu)成,分別用于加速1×1×1和3×3×3卷積,其硬件參數(shù)分別為(Tn,Tm,Td,Tr,Tc)=(8,32,2,7,7)和(Tn,Tm,Td,Tr,Tc)=(32,32,2,7,7),前者對Tn、Tm進行循環(huán)展開,后者對Td、Tn、Tm進行循環(huán)展開。此外,為了提高片外訪存效率,本文對特征圖進行了NC/8DHW8 格式的數(shù)據(jù)排布。由于加速器和片外存儲器是通過AXI 總線傳輸數(shù)據(jù)的,因此,為了適配NC/8DHW8 數(shù)據(jù)排布格式,AXI總線接口的位寬被設(shè)置為128,每次可以并行地讀取8個復(fù)數(shù)(每個復(fù)數(shù)的實部和虛部均為8位,共16位)。本文使用Xilinx Vivado 2019.2 對設(shè)計完成的加速器進行綜合、布局布線、生成比特流,加速器的時鐘頻率為200 MHz。
4.2.1 模型精度與壓縮比
為了探究模型精度和壓縮比之間的關(guān)系,取塊大小為1(即未壓縮的模型)、4、8、16在C3D和3D ResNet-18上進行了實驗,結(jié)果如圖11所示。由圖可知,當(dāng)分塊大小為4 時,C3D 和3D ResNet-18 的精度損失僅為0.278和0.51 個百分點,相應(yīng)的存儲與計算壓縮比為16 倍和2.67倍。作為對比,文獻[13]對C3D進行以塊為單位的剪枝,以0.34個百分點的精度損失為代價獲得了1.05倍的參數(shù)壓縮比和3.18 倍的計算壓縮比。顯然,3D FCirCNN以更小的精度損失(0.278個百分點)取得了更加顯著的參數(shù)壓縮效果。而在計算量壓縮方面,盡管3D FCirCNN 取得的壓縮效果相較文獻[13]減少了約16%,但3D FCirCNN 對C3D 的壓縮是高度規(guī)則的,因此在實際部署時可以取得更優(yōu)的效果,這一點在4.2.2小節(jié)3D FCirCNN 和其他相關(guān)工作的比較中得到了充分體現(xiàn)。當(dāng)分塊大小為16 時,C3D 和3D ResNet-18 的精度損失分別為2.825和3.196個百分點,壓縮對精度造成了較大影響。因此,為了在精度和壓縮比之間取得較優(yōu)權(quán)衡,本文最終采用塊大小為8的分塊循環(huán)矩陣來壓縮C3D 和3D ResNet-18,相應(yīng)的存儲與計算壓縮比分別為32 倍和5.33 倍,精度損失分別為1.25 和1.71 個百分點。相比之下,3D VNPU[14]采用Winograd算法和INT8量化,以1 個百分點的精度損失為代價獲得了4 倍的存儲壓縮比和3.33倍的計算壓縮比。通過分析不難發(fā)現(xiàn),3D FCirCNN 在精度損失稍大的情況下(0.25 個百分點),在3D VNPU 的基礎(chǔ)上將存儲和計算的壓縮比進一步提升了8倍和1.6倍,從而充分說明了3D FCirCNN在3D-CNN模型壓縮方面的優(yōu)越性。
圖11 壓縮比對精度的影響Fig.11 Effect of compression ratio on accuracy
4.2.2 和相關(guān)工作的比較
表2列出了針對兩個不同模型所設(shè)計的加速器的資源消耗情況。表3 給出了加速器和其他相關(guān)工作的比較結(jié)果。由表3可知,得益于本文算法壓縮和硬件加速的協(xié)同優(yōu)化,C3D 和3D ResNet-18 加速器的吞吐量分別達到了2 692.81 GOP/s 和1 591.52 GOP/s,相較于表中其余工作的加速比分別為1.99~16.68 倍和1.18~9.86 倍,取得了顯著提升。此外,由于本文所采取的針對復(fù)數(shù)乘法的DSP優(yōu)化技術(shù),C3D和3D ResNet-18加速器分別取得了每DSP 3.349 GOP/s 和1.677 GOP/s 的吞吐率,相較于表2 中其余加速器的結(jié)果分別提升了2.54~16.18 倍和1.27~8.1 倍。因此,本文所提出的方法可以以較少的硬件資源為代價,取得優(yōu)異的性能,這一點在硬件資源、功耗受限的嵌入式平臺上顯得尤為重要。
表2 加速器資源消耗Table 2 Resource utilization of accelerator
表3 和先前實現(xiàn)的比較Table 3 Comparison with previous implementations
本文提出了3D FCirCNN,一個算法-硬件協(xié)同設(shè)計與優(yōu)化的方法來對3D-CNN進行加速。在算法層面,本文采用基于分塊循環(huán)矩陣的壓縮方法,并進一步利用FFT加速計算。此外,為了消除由于FFT帶來的頻繁的時域/頻域切換開銷,本文引入了頻域內(nèi)的激活、池化和批歸一化層,實現(xiàn)了全頻域計算。本文還采用與分塊循環(huán)矩陣正交的INT8對稱量化對3D-CNN進行進一步壓縮。在硬件層面,本文為壓縮后的3D-CNN設(shè)計了一個專用的硬件架構(gòu),并針對硬件資源、存儲帶寬進行了一系列優(yōu)化。在精度損失可以接受的范圍內(nèi),3D FCirCNN帶來了接近32 倍的壓縮效果,相較于以往最先進的工作,本文的加速器在Xilinx ZCU102 FPGA平臺上取得了多達16.68倍的性能提升和16.18倍的計算效率提升。