李方舒,錢 慧,陳曉旭
(福州大學 物理與信息工程學院,福州 350116)
近年來深度神經(jīng)網(wǎng)絡(Deep Neural Network,DNN)在圖像分類,識別,檢測等領域取得了巨大的成功.然而DNN普遍存在數(shù)據(jù)量大,計算復雜度高的問題,在卷積層中尤為突出[1],這使得網(wǎng)絡難以移植到資源有限的嵌入式開發(fā)板上.然而隨著高科技設備滲透到生活的方方面面,在諸多設備上實現(xiàn)計算密集型的應用變得越來越普遍也越來越重要,因此在資源有限的平臺上實現(xiàn)DNN的推理成為了研究者們關注的重點.
為了能在嵌入式終端快速部署DNN,研究者們提出了多種方案.2015年韓松等人[2]提出了去除網(wǎng)絡的冗余連接并調整權重以實現(xiàn)網(wǎng)絡的壓縮,使得網(wǎng)絡能夠在嵌入式移動應用終端上進行部署.文獻[3]通過對網(wǎng)絡模型進行壓縮與高度優(yōu)化,將網(wǎng)絡從重量級模型變換為能夠部署在嵌入式開發(fā)板上的輕量級模型,實現(xiàn)了一種基于GPU嵌入式系統(tǒng)的實時駕駛員睡意檢測技術.文獻[4]通過采用傳感器融合超聲波來更好的過濾噪聲的方法,結合GPU硬件特性,提出了一種基于嵌入式GPU的實時立體視覺碰撞檢測自適應系統(tǒng).文獻[5]采用異步多線程并行計算,在GPU嵌入式平臺上實現(xiàn)微笑檢測器過程中,采用模塊化的方案對線程進行優(yōu)先級排序,并通過增加關鍵任務的線程數(shù)量來實現(xiàn)任務之間的負載平衡.Mohammad的團隊針對移動終端上DNN的推理進行了諸多研究[6-8],發(fā)現(xiàn)根據(jù)設備的資源量合理的采用不同的線程粒度進行并行化設計能夠顯著提高網(wǎng)絡的推理速度,并提出了數(shù)據(jù)重新排列,非精確計算等數(shù)據(jù)處理方案來實現(xiàn)網(wǎng)絡的加速設計.面向檢測,識別等任務的DNN開始逐漸應用到資源有限的移動設備上.
為了滿足人們對高質量,沉浸式影像日益增長的需求,基于深度神經(jīng)網(wǎng)絡的圖像重構引起了研究學者的廣泛關注[9-12].然而在面向圖像重構的DNN中,為了從退化的高維圖像中不斷提取代表圖像細節(jié)的關鍵特征,導致網(wǎng)絡各層的輸出數(shù)據(jù)量與輸入數(shù)據(jù)量相同甚至更大,網(wǎng)絡卷積層負載情況更為嚴峻.相較于面向檢測識別等問題的DNN,面向圖像重構的DNN進行硬件移植時面臨著更嚴峻的挑戰(zhàn).
切比雪夫多項式能夠實現(xiàn)最佳的函數(shù)逼近[13],因此本文采用切比雪夫多項式對網(wǎng)絡卷積核進行并行化處理以簡化卷積層的計算,將該優(yōu)化方案應用在面向重構的深度神經(jīng)網(wǎng)絡中,隨后對優(yōu)化處理后的網(wǎng)絡卷積層進行基于GPU的并行化設計.為了保證方案的普適性,采用zhu等人[14]在2016年提出的基于流形學習的圖像重構網(wǎng)絡,該網(wǎng)絡能夠適用于多種不同的圖像重構任務.最后將經(jīng)過并行化設計后的網(wǎng)絡移植到NVIDIA AGX Xavier嵌入式開發(fā)板上,并對其進行性能分析.
基于流形學習的深度神經(jīng)網(wǎng)絡[14]結構如圖1所示,傳感器數(shù)據(jù)作為全連接層1的輸入,由于傳感器數(shù)據(jù)一般為復數(shù),存在實部與虛部,對于n×n的復雜傳感器數(shù)據(jù),需將其轉換為2n2個實數(shù)值輸入全連接層1,因此全連接層1也表示網(wǎng)絡的輸入層,神經(jīng)元數(shù)量為2n2.全連接層2和3的神經(jīng)元個數(shù)均為n2,采用tanh激活函數(shù).為了匹配卷積操作,將全連接層3輸出的數(shù)據(jù)進行維度轉換處理,由n2×1變換為n×n.卷積層1采用64個5×5大小的卷積核以1為步長進行卷積操作,卷積層2采用64個5×5×64大小的卷積核以1為步長進行卷積操作.卷積層均采用Relu作為激活函數(shù),最后對卷積層2采用了1個7×7×64大小的卷積核以1為步長進行反卷積得到重構圖像.
圖1 網(wǎng)絡結構Fig.1 Structure of the network
DNN中卷積層主要用于實現(xiàn)輸入信號高維特征的提取.卷積過程中通過卷積核h對輸入數(shù)據(jù)f進行局部感知,在更高層將局部信息進行綜合以提取輸入的特征,經(jīng)典的卷積層計算如公式(1)所示:
y=ξ(h*f)
(1)
y表示當前卷積層的輸出,“*”表示卷積操作.ξ表示激活函數(shù),基于流形學習的網(wǎng)絡模型中采用Relu函數(shù):
在卷積計算過程中,常常需要四個嵌套的循環(huán),內部在卷積核上迭代,外部在輸入圖像的行列方向上迭代,循環(huán)效率很低.其次,二維圖像和卷積核通常采用連續(xù)的內存塊以行串行化的順序進行存儲,按列訪問數(shù)據(jù)可能會造成內存子系統(tǒng)中較高的高速緩存丟失率,因此卷積操作不容易實現(xiàn)快速計算.考慮采用多項式來對卷積層計算進行簡化處理.
近似計算的核心在于能夠在多項式迭代時間內給出問題的近似最優(yōu)解.而多項式能夠實現(xiàn)函數(shù)逼近,通過多項式的逼近轉換可以將問題轉化為對多項式類的研究.且由于多項式的和,差,積仍然是多項式,因此可以通過迭代規(guī)律來完成復雜計算的快速實現(xiàn).
切比雪夫多項式能夠實現(xiàn)最佳一致逼近.考慮到實際應用中往往需要對一個已知的復雜函數(shù)f(x)進行求解,為了對計算進行化簡,通常需要尋找一個函數(shù)Qn(x),使得兩者之間的誤差能夠在某種度量意義下達到最小.切比雪夫最佳一致逼近理論中,函數(shù)Qn(x)為切比雪夫多項式,其滿足在某區(qū)間[a,b]內與f(x)之間的差值是區(qū)間內所有多項式Q(x)與f(x)之間插值中最小的,如公式(2)所示:
(2)
由于切比雪夫多項式能夠實現(xiàn)最佳一致逼近,因此考慮采用切比雪夫多項式來進行卷積核的優(yōu)化.假設輸入圖像大小為3×3,卷積核大小為2×2(此處為了進行簡單的展示,實際上較少出現(xiàn)卷積核大小為2×2的情況).如圖2(a)所示,原始的卷積操作中,卷積核大小普遍較小,每次僅能夠提取到部分特征,常需要在每個輸入特征圖上都進行遍歷,最后在高維度上進行信息的整合,計算過程復雜.
圖2 卷積操作Fig.2 Convolutional operations
本文提出將輸入數(shù)據(jù)表示成向量形式,如圖2(b)所示,卷積核中仍然保留對應的權重信息,并采用補0的方式對其進行擴充展開,其中補0 的地方用灰色方塊表示.此時卷積核矩陣用H表示,H的維度p×q計算方式如公式(3)、公式(4)所示:
p=((Irow-drow)/stride+1)×((Icol-dcol)/stride+1)
(3)
q=Irow×Icol
(4)
其中Irow和Icol分別表示輸入圖像的長和寬,drow和dcol分別表示卷積核的長和寬,stride為步長.
此時的卷積計算被展開成為矩陣向量乘法,可以通過一次計算得到結果而無需進行卷積核對輸入圖像的遍歷,且此時輸出同樣為一個向量,其能夠直接作為下一層的輸入,無需進行維度轉換.
由于卷積操作被展開成了矩陣向量乘法,此時可以對卷積核采用切比雪夫多項式逼近來進行計算化簡,以使得其可以進行并行化處理.K階切比雪夫多項式用Tk(H)∈n×n表示,其遞歸公式如式(5)所示:
Tk(H)=2HTk-1(H)-Tk-2(H)
(5)
其中T0=1,T1=H.因此卷積核的近似可表示為公式(6):
(6)
θ=(θ0,θ1,…,θK-1)∈K表示切比雪夫多項式的系數(shù)向量,也表示網(wǎng)絡中需要訓練的卷積核參數(shù).卷積層的輸入采用全連接層3直接輸出的n2×1維的數(shù)據(jù),不進行維度轉換,用fin表示,此時網(wǎng)絡卷積層計算可用公式(7)表示:
(7)
ycheby表示卷積層的輸出.
(8)
(9)
CUDA架構[15]是Nvidia公司推出的GPU異構編程架構,本文結合CUDA 架構對網(wǎng)絡卷積層進行并行設計,關鍵在于切比雪夫多項式迭代的并行設計.
(10)
結合公式(10)和圖3可以得出,在第一輪迭代中即可計算得出全部多項式系數(shù),后面每次迭代中對應順位的多項式系數(shù)相等,如圖中C(s,0)和C(s,1)所示,將它們按照順序存儲在GPU全局內存(Global Memory)中.
圖3 切比雪夫迭代計算流程Fig.3 Process of Chebyshev iterative
在CUDA加速設計時,采用線程并行度為m,在后續(xù)迭代過程中直接從GPU全局內存調用提前計算好的對應多項式系數(shù)來計算對應多項式的值,從而可以避免每次迭代中多項式系數(shù)值的重復計算,也減少了GPU端與CPU端的數(shù)據(jù)傳輸次數(shù).圖4展示了CUDA進行并行處理的過程,全局內存中開辟出兩塊內存,一塊用于存放計算好的多項式系數(shù),一塊存放計算好的多項式的值.迭代計算開始,線程塊從全局內存讀取多項式系數(shù),為塊內線程分配相應的值,每輪迭代結束,采用線程廣播機制,將最后兩個線程計算得到的多項式值在塊內進行廣播,作為下一輪迭代的基向量.
圖4 基于CUDA的切比雪夫迭代并行設計Fig.4 Cuda-based chebyshev iterative parallel design
并行度m可以根據(jù)硬件平臺資源情況進行靈活的設置.由于每輪迭代中所有多項式的計算都在同一時刻進行,每一輪迭代過程中計算時間由兩次乘法和一次減法運算得到,因此每次迭代計算所需的時間固定,記為Time1.假設將并行度增大到m+e,所需的迭代次數(shù)變?yōu)閗/(m+e),增大并行度之后迭代過程中減少的時間為(k/m-k/(m+e))×Time1.與此同時,迭代開始前所需計算的多項式系數(shù)個數(shù)增加,由2m增加至2(m+e).為了保證增大并行度能夠帶來計算時間的增益,此時需要關注兩點:1)所需計算的多項式系數(shù)增加,硬件平臺是否有足夠的線程資源來支撐它們的計算,而無需等待前面的計算結束并完成資源釋放;2)增加的多項式系數(shù)計算時間記為Time2,需要保證Time2≤(k/m-k/(m+e))×Time1.通過上述兩點的考量對并行度進行設置,可以在硬件上實現(xiàn)資源的充分利用.本文中切比雪夫多項式迭代過程的線程并行度m設置為3.相對于串行的迭代過程,采用并行計算的方式靈活度更高,計算效率能夠獲得顯著提升.
采用來自MGH-USCHCP公共數(shù)據(jù)集庫[16]醫(yī)學腦圖數(shù)據(jù)集來進行模型的訓練,數(shù)據(jù)集圖片大小處理成64×64.優(yōu)化前后的網(wǎng)絡采用相同的訓練環(huán)境:CPU為Intel(R)Xeon(R)E5-4610 V4,總內存為15G;GPU為Tesla P100,顯存為256G;Tensorflow版本為1.8;CUDA版本為9.0.優(yōu)化后的網(wǎng)絡進行重構驗證采用的推理環(huán)境:CPU為 Core i7-7700,內存為32G;GPU為Nvidia GeForce GT 730,顯存為2G;CUDA版本為9.0.將優(yōu)化后的模型與原模型進行對比,驗證優(yōu)化后的模型重構性能,采用峰值信噪比(Peak Signal to Noise Ratio,PSNR)來評估重構圖像的質量.然后將優(yōu)化后的模型搭載在Jetson AGX Xavier嵌入式平臺上并進行加速效果分析.Jetson AGX Xavier是NVIDIA推出的一款高性能計算開發(fā)板,其中支持CUDA 7.0,GPU為NVIDIA Volta架構,CPU為8核 Carmel ARM v8.2,提供了兩個深度學習加速器引擎,可提供30TOPs的深度學習運算能力,是目前深度神經(jīng)網(wǎng)絡實現(xiàn)最佳的GPU嵌入式平臺.
DNN的時間復雜度和空間復雜度是評價網(wǎng)絡模型架構的重要指標.時間復雜度決定了其進行訓練與推理的用時,時間復雜度高時模型訓練時間長使得研究者們的想法無法得到快速驗證,模型的改善時間也會相應拉長.因此網(wǎng)絡的時間復雜度是研究者們關注的評價指標,同時在近似計算中時間復雜度也是一個重要指標.空間復雜度決定了網(wǎng)絡模型的參數(shù)數(shù)量,網(wǎng)絡進行硬件移植時需要考慮到硬件平臺有限的資源是否能夠滿足網(wǎng)絡部署的要求.
由于DNN中時間復雜度主要來源于網(wǎng)絡卷積層,因此主要進行卷積層的時間復雜度分析,公式(11)表示單個卷積層的時間復雜度,其中M表示輸出特征圖的大小,S表示卷積核的大小,Cin和Cout分別表示卷積層輸入和輸出的通道數(shù):
ComplexTime=O(M2×S2×Cin×Cout)
(11)
由公式(9)可以得出優(yōu)化后網(wǎng)絡的卷積層時間復雜度僅與該層卷積核參數(shù)數(shù)量有關,如公式(12):
ComplexTime=O((S2×Cout)2)
(12)
卷積層的空間復雜度計算公式如式(13)所示:
ComplexSpace=O(S2×Cin×Cout)
(13)
由公式(11)和公式(12)可以計算得出優(yōu)化前后網(wǎng)絡各層的時間復雜度如表1所示.卷積層1和反卷積層為卷積部分的輸入和輸出層,由于在這兩層網(wǎng)絡中存在輸入或者輸出層通道數(shù)為1的情況,因此表1中優(yōu)化后的模型卷積層1和反卷積層的時間復雜度下降不多,但是卷積層2的時間復雜度下降了125.44倍.可以得出通過優(yōu)化后網(wǎng)絡中間隱藏的卷積層的復雜度能夠獲得明顯的時間復雜度下降.
表1 網(wǎng)絡優(yōu)化前后各卷積層時間復雜度Table 1 Time complexity of convolutional layers of thenetwork before and after network optimization
由公式(9)可知,卷積操作被轉換為切比雪夫多項式迭代,網(wǎng)絡中的參數(shù)被轉換為多項式迭代中的多項式系數(shù),而此時需要預先計算的多項式系數(shù)個數(shù)由并行度m來決定,迭代開始前需要計算2m個多項式系數(shù)值,因此并行處理后的網(wǎng)絡卷積層空間復雜度如公式(14)所示:
ComplexSpace=O((2m)2×Cin×Cout)
(14)
由于m遠小于原始卷積核的大小S,因此經(jīng)過切比雪夫迭代處理后,各卷積核的空間復雜度明顯下降.
優(yōu)化前后的模型訓練方式一致,批次數(shù)據(jù)量大小設置為100,學習率為0.00002,采用RMSProp算法實現(xiàn)梯度下降,以加快收斂速度.采用均方誤差作為損失函數(shù).
圖5為訓練過程中兩個模型損失-迭代曲線圖,可以看出優(yōu)化后的模型起始損失值要大于原始模型,隨著迭代次數(shù)增加,兩條曲線逐漸貼近,最終能夠達到相近的重構性能.
圖5 兩種模型損失-迭代曲線Fig.5 Loss-iteration curves of the two models
圖6中,左邊兩張圖為網(wǎng)絡輸入圖像,右邊兩張圖為優(yōu)化網(wǎng)絡的重構結果,重構出的圖像PSNR能達到30dB左右,可以證明優(yōu)化后的模型可以成功的完成圖像重構任務.
實驗通過遠程交叉編譯將模型導入到嵌入式平臺上,以文本讀取的方式加載權重參數(shù)來實現(xiàn)網(wǎng)絡的推理過程.采用CUDA中nvprof工具對并行加速設計后的網(wǎng)絡模型推理一張圖片的過程進行整體分析.網(wǎng)絡硬件實現(xiàn)結果如表2所示,顯示了warp占用率(AchievedOccupancy,AO),全局內存負載吞吐量(GlobalMemoryLoadThroughput,GMLT),全局內存負載效率(GlobalMemoryLoadEfficiency,GMLE),全局內存存儲效率(GlobalMemoryStoreEfficiency,GMSE),所有參數(shù)都取平均值,如公式(15)-公式(17)所示.其中活躍線程數(shù)量為n,最大線程數(shù)量為Max_threads,請求的全局內存負載吞吐量為GMLT_Q,所需的全局內存負載吞吐量為GMLT_N,請求的全局內存存儲吞吐量為GMST_Q,所需的全局內存存儲吞吐量為GMST_N.
圖6 重構結果Fig.6 Reconstruction results
(15)
(16)
(17)
本文基于重構網(wǎng)絡進行并行化處理,實驗中數(shù)據(jù)集大小均為64×64,以固定的分辨率圖像進行重構.由于完成對網(wǎng)絡的并行化設計后,硬件平臺上線程調度的方式被確定下來,相應的資源使用方案和計算中的操作數(shù)均固定下來,因此對同樣分辨率的圖像進行重構時,各參數(shù)指標理論上保持一致,此處以一張圖像的重構為例,對網(wǎng)絡的硬件加速情況進行分析.
表2 網(wǎng)絡硬件實現(xiàn)分析Table 2 Hardware implementation analysis of network
表2中可以看到激活函數(shù)(此處的激活函數(shù)為卷積層的激活函數(shù),Relu)的平均占用率最高,達到了83.5119%,表明該核函數(shù)中warp的利用最充分.卷積層計算的核函數(shù)的全局內存負載吞吐量最高,達到了767.59GB/S,同時全連接層核函數(shù)和卷積層核函數(shù)的全局內存負載效率、全局內存存儲效率都達到了100%,充分利用了設備內存帶寬.
由于全連接層1為輸入層,因此計算從全連接層2開始.由表3可得,除去網(wǎng)絡中各層進行權重矩陣讀取的時間,整個網(wǎng)絡模型運行時間為0.35s.
表4展示了原始網(wǎng)絡在Tensorflow環(huán)境下進行推理的時間和并行加速設計后的網(wǎng)絡在嵌入式開發(fā)板上進行重構推理的時間,可以看出并行加速設計后的網(wǎng)絡在嵌入式開發(fā)板上進行推理的速度比原始網(wǎng)絡在PC端推理的速度快2.2倍.
表3 網(wǎng)絡運行時間Table 3 Running time of the network
表4 推理時間對比Table 4 Comparison of the inference time
本文針對深度神經(jīng)網(wǎng)絡中數(shù)據(jù)負荷大,網(wǎng)絡卷積層計算復雜度很高的問題,提出采用切比雪夫多項式對網(wǎng)絡卷積核進行逼近.通過將卷積核進行展開,使得其與輸入數(shù)據(jù)的卷積操作被轉換成矩陣向量乘法的形式,能夠無需遍歷操作直接計算出卷積結果,然后采用切比雪夫多項式對卷積核中參數(shù)進行迭代擬合,使得卷積操作能夠實現(xiàn)并行化處理.在網(wǎng)絡優(yōu)化后的基礎上,基于CUDA編程架構為卷積層切比雪夫多項式迭代設計了對應的并行加速方案.最后將網(wǎng)絡移植到NVIDIA Jetson AGX Xavier嵌入式開發(fā)板上,其在開發(fā)板上進行推理的時間僅為0.35s.相較于原始網(wǎng)絡的推理可以獲得2.2倍的加速.