作者/熊偉,福州瑞芯微電子股份有限公司
面向移動設(shè)備的深度學(xué)習(xí)部署運算優(yōu)化技術(shù)
作者/熊偉,福州瑞芯微電子股份有限公司
深度學(xué)習(xí)是機器學(xué)習(xí)的一個分支,隨著訓(xùn)練方法的改進、數(shù)據(jù)量的爆發(fā)式增長及硬件運算能力的提升,近年來在圖像識別、語音識別等很多領(lǐng)域取得突破,并被逐步推廣部署到實際應(yīng)用中。然而深度學(xué)習(xí)算法運算復(fù)雜度高、內(nèi)存占用及帶寬需求大,在實際應(yīng)用的部署中限制很大,尤其難以在移動設(shè)備中部署應(yīng)用。本文首先介紹深度學(xué)習(xí)的背景,其次對面向移動設(shè)備深度學(xué)習(xí)部署運算優(yōu)化的關(guān)鍵技術(shù)進行歸納總結(jié),最后對未來工作中的難點和發(fā)展趨勢進行了展望。
深度學(xué)習(xí);移動設(shè)備;優(yōu)化
深度學(xué)習(xí)是模擬人腦進行分析學(xué)習(xí)的多層神經(jīng)網(wǎng)絡(luò),它模仿人腦的機制來解釋數(shù)據(jù),處理數(shù)據(jù),通過組合低層特征形成更加抽象的高層表示屬性類別或特征,以發(fā)現(xiàn)數(shù)據(jù)的分布式特征表示。在2006年Hinton提出神經(jīng)網(wǎng)絡(luò)新的訓(xùn)練方法之后,深度學(xué)習(xí)發(fā)展迅速,促使人工智能在圖像、語音、自然語言處理等多個領(lǐng)域有了實質(zhì)性的突破,達到產(chǎn)業(yè)應(yīng)用標準。例如:在人臉識別領(lǐng)域,Google的FaceNet[1]在LFW數(shù)據(jù)集[2]上識別率達到了99.63%,超過了人眼的識別率(97.53%);在圖像識別領(lǐng)域,微軟的ResNet[3]在ImageNet2012數(shù)據(jù)集上的錯誤率達到了3.57%,低于人類5.1%的錯誤率; 在語音識別領(lǐng)域,百度的DeepSpeech2[4]在中文語音識別的錯誤率達到了3.7%,而人類錯誤率為4.0%。
在應(yīng)用層面,有很多實際領(lǐng)域可以廣泛運用深度學(xué)習(xí)技術(shù),例如:
·圖像和視頻:視頻可能是大數(shù)據(jù)時代中最多的資源。它占據(jù)了當(dāng)今互聯(lián)網(wǎng)70%的流量,世界范圍內(nèi)每天都會產(chǎn)生80億小時的監(jiān)控視頻。計算機視覺需要從視頻中抽取有意義的信息。深度學(xué)習(xí)網(wǎng)絡(luò)已經(jīng)極大地提高了許多計算機視覺任務(wù)地準確性,可廣泛用于圖像分類,物體定位和檢測,圖像分割,和動作識別等任務(wù)中;
·語音和語言:深度學(xué)習(xí)已經(jīng)極大地提高了語音識別和許多其他相關(guān)任務(wù)地準確率,可以應(yīng)用在機器翻譯,自然語言處理和音頻生成等應(yīng)用中;
·醫(yī)藥:深度學(xué)習(xí)在基因?qū)W中扮演了重要的角色,它探究了許多疾病的基因?qū)用娴脑?,例如孤獨癥,癌癥,和脊髓性肌萎縮。深度學(xué)習(xí)技術(shù)也被應(yīng)用在醫(yī)學(xué)圖像檢測中,用來檢測皮膚癌,腦癌以及乳腺癌等等。
·機器人:深度學(xué)習(xí)網(wǎng)絡(luò)可以應(yīng)用到機械臂抓取,運動規(guī)劃,視覺導(dǎo)航,四旋翼飛行器穩(wěn)定性控制以及無人駕駛汽車駕駛策略。
上述很多應(yīng)用有部分可以依賴云端進行深度學(xué)習(xí)運算,但也有很多要求低延遲、帶寬限制大、安全要求高的應(yīng)用比如機器人控制、無人車等,需要在本地設(shè)備中運行深度學(xué)習(xí)算法。
深度學(xué)習(xí)模型通常在PC或服務(wù)器上進行訓(xùn)練,訓(xùn)練時會同時進行前向及反向運算用以更新網(wǎng)絡(luò)參數(shù),得到的參數(shù)數(shù)值以浮點形式存儲。移動設(shè)備運算性能有限,內(nèi)存空間有限,電力受電池限制,散熱條件也較差,如果直接在移動設(shè)備部署這樣的模型,其占用空間大,運行時占用很大內(nèi)存,耗費處理器大量的運算資源。而大量的運算及存儲器訪問會導(dǎo)致移動設(shè)備功耗過大,續(xù)航時間及散熱的壓力很大。
如下表格[5]為45納米CMOS制程芯片上的數(shù)值運算及訪問內(nèi)存所需的能量消耗:

操作能量消耗(pJ)倍率8位整數(shù)加法0.03 1 8位整數(shù)乘法0.2 6.6 16位浮點加法0.4 13.3 16位浮點乘法1.0 33.3 32位整數(shù)加法0.1 3.3 32位浮點加法0.9 30 32位寄存器訪問1 33 32位整數(shù)乘法3.1 102.3 32位浮點乘法3.7 122.1 32位靜態(tài)存儲緩存訪問5 165 32位動態(tài)存儲器訪問640 21120
如果能盡量以定點數(shù)、低位寬進行運算,盡量訪問內(nèi)部存儲器,則運行功耗能得到有效控制。
近年來典型深度學(xué)習(xí)網(wǎng)絡(luò)主要有:
· AlexNet[6]:它在2012年贏得了ImageNet挑戰(zhàn),是第一個使用CNN方法贏得ImageNet的網(wǎng)絡(luò)。它擁有5個卷積層和3個全連接層。
· VGG16[7]:網(wǎng)絡(luò)深度大大加深,達到16層,其中包含13個卷積層和3個全連接層。為了平衡網(wǎng)絡(luò)層數(shù)加深而導(dǎo)致的成本增加,一個大的卷積核被分解為多個小的卷積核來減小參數(shù)數(shù)量,同時保持同樣的感知野。
· GoogLeNet[8]:網(wǎng)絡(luò)深度達到22層,同時引入了Inception模型。之前的模型通常是級聯(lián)的,而Inception模型是并行連接的。它使用了多種大小的卷積核對輸入進行處理,因此能夠在不同尺度上處理輸入。它的22層網(wǎng)絡(luò)包括了三個卷積層,9個Inceptioin層(每層相當(dāng)于兩個卷積層),以及一個全連接層。
· ResNet[3]:也叫做殘差網(wǎng)絡(luò)(Residual Net),其使用了殘差連接使得能夠構(gòu)建更深的網(wǎng)絡(luò)。它是ImageNet挑戰(zhàn)中第一個Top—5錯誤率低于人類的。當(dāng)網(wǎng)絡(luò)層次變得更深時,訓(xùn)練時的一個難點就是梯度消失(Vanishing Gradient)。而ResNet引入了“短接”模型,包含了全等連接,使得梯度傳播可以跳過卷積層,即使網(wǎng)絡(luò)層數(shù)達到一千層仍可以訓(xùn)練。
下表為各典型網(wǎng)絡(luò)的復(fù)雜度:

年份模型名稱層數(shù)參數(shù)數(shù)量運算量錯誤率2012 AlexNet[6]8 60M 0.725B 16.4% 2014 VGG16[7]16 138M 15.5B 7.32% 2014 GoogLeNet[8]22 6.8M 1.566B 6.67% 2015 ResNet[3]152 19.4M 11.3B 3.57%
現(xiàn)有主流的幾類深度學(xué)習(xí)軟件框架及特點如下:
Caf f e:Caf f e 全稱為Convolutional Architecture for Fast Feature Embedding,是最早被廣泛使用的開源深度學(xué)習(xí)框架,目前由伯克利大學(xué)視覺中心進行維護。Caf f e 的主要優(yōu)勢包括如下幾點:(1)容易上手,網(wǎng)絡(luò)結(jié)構(gòu)都是以配置文件形式定義,不需要用代碼設(shè)計網(wǎng)絡(luò)。(2)訓(xùn)練速度快,能夠訓(xùn)練 state—of—the—art 的模型與大規(guī)模的數(shù)據(jù)。(3)組件模塊化,可以方便地拓展到新的模型和學(xué)習(xí)任務(wù)上。
Caf f e 的核心概念是層,神經(jīng)網(wǎng)絡(luò)的每個模塊都是一個層。由層接收輸入數(shù)據(jù),經(jīng)過內(nèi)部計算產(chǎn)生輸出數(shù)據(jù)。設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)時,只需通過編寫protobuf配置文件,把各個層拼接在一起即可構(gòu)成完整的網(wǎng)絡(luò)。在模型結(jié)構(gòu)非常復(fù)雜時,可能需要寫非常冗長的配置文件,閱讀時也比較費力。由于Caf f e出現(xiàn)較早,它的一大優(yōu)勢是擁有大量的訓(xùn)練好的經(jīng)典模型(AlexNet、VGG16、Inception)。因為知名度較高,Caf f e 被廣泛地應(yīng)用于前沿的工業(yè)界和學(xué)術(shù)界,許多提供源碼的深度學(xué)習(xí)的論文都是使用 Caf f e 來實現(xiàn)其模型的。
將Caf f e部署到移動設(shè)備上時,只需要簡單移植即可讓深度學(xué)習(xí)算法開始工作,但原始模型體積大、運算復(fù)雜度高,運行速度非常緩慢。
MXNet:MXNet是由DMLC(Distributed Machine Learning Community)開發(fā)的一款開源的、輕量級、可移植的、靈活的深度學(xué)習(xí)庫,通過混合使用符號編程模式和指令式編程模式來最大化效率和靈活性,已經(jīng)成為了AWS(亞馬遜云服務(wù))官方推薦的深度學(xué)習(xí)框架。它是各個框架中率先支持多 GPU和分布式運算的,并且達到了近乎線性的分布式性能擴展。MXNet通過采用計算圖優(yōu)化算法讓符號計算執(zhí)行得非常快,通過內(nèi)存空間重用來節(jié)省內(nèi)存。MXNet的一個很大的優(yōu)點是支持非常多的語言封裝,比如 C++、Python、R、Julia、Scala、Go、MATLAB 和 JavaScript 等,可謂非常全面,基本主流的腳本語言全部都支持了。
MXNet原生支持在移動設(shè)備上運行基于深度學(xué)習(xí)的圖像識別等任務(wù),但并未得到理想的優(yōu)化,運算速度及功耗不夠理想。
TensorFlow:TensorFlow由Google開發(fā),發(fā)布相對較晚,但借助Google巨大的影響力是目前最流行的機器學(xué)習(xí)庫。使用它可以非常方便地設(shè)計神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),其核心代碼和Caf f e及MXNet一樣是用 C++編寫的。除了核心代碼的C++接口,TensorFlow 還有官方的 Python、Go 和Java 接口。
TensorFlow支持在內(nèi)存和CPU資源都緊張的移動設(shè)備上運行較復(fù)雜的模型,其在 CPU 上的矩陣運算庫使用了Eigen庫,能夠基于ARM架構(gòu)編譯和優(yōu)化,因此在移動設(shè)備上有更好的表現(xiàn)。
3.1 模型剪枝壓縮
基于訓(xùn)練好的深度學(xué)習(xí)模型,對權(quán)重值較小的連接進行剪枝:即刪除網(wǎng)絡(luò)中權(quán)重值低于某一閾值的所有連接,之后重新訓(xùn)練網(wǎng)絡(luò),得到剩余稀疏連接的權(quán)重值。剪枝方法使AlexNet和VGG—16模型的參數(shù)數(shù)量分別減少了9倍和13倍[9],具體如下表:

模型名稱權(quán)值數(shù)量運算量權(quán)值壓縮率運算量壓縮率AlexNet 61M 1.5B*11% 30% VGG16 138M 30.9B*7.5% 21%
3.2 降低權(quán)值精度
原始深度學(xué)習(xí)模型的參數(shù)都是32位浮點數(shù),如前所述位寬大的浮點數(shù)相比位寬小的浮點數(shù)、浮點數(shù)相比整數(shù)的計算更復(fù)雜、功耗更大。根據(jù)試驗,權(quán)值采用16位浮點數(shù)存儲時與權(quán)值采用32位浮點數(shù)存儲時相比,模型精度沒有損失[10],此時運算速度和功耗表現(xiàn)則有很大提升[11]:

模型名稱:AlexNet Tegra X1 (FP32) Tegra X2 (FP16)性能47 張/秒67 張/秒功耗5.5瓦5.1瓦每瓦性能8.6張/秒/瓦13.1張/秒/瓦
3.3 卷積運算優(yōu)化
在部署深度學(xué)習(xí)模型時,僅進行前向運算,其中卷積層所占的運算量最大,如下表所示:

全連接層占比AlexNet[6]61M 3.8% 96.2% 0.7B 91.9% 8.1% VGG-16[7]138M 10.6% 89.4% 15.5B 99.2% 0.8% NIN[12]7.6M 100% 0% 1.2B 100% 0.0% GoogLeNet[8]6.9M 85.1% 14.9% 1.6B 99.9% 0.1%模型名稱權(quán)值數(shù)量卷積層占比全連接層占比運算量卷積層占比
從上表可以看出,隨著深度學(xué)習(xí)模型的進化與發(fā)展,卷積層運算量占據(jù)了總運算量越來越大的比重。卷積運算主要有兩大類處理方式:
與T0時點相比,C組在T2和T3時點BP、HR均明顯增高,術(shù)中及術(shù)后各時點VAS評分均升高(P<0.05);與 T0時點相比,D組患者BP、HR在各時點差異無統(tǒng)計學(xué)意義(P>0.05),在T1~T5時點VAS評分升高(P<0.05)。在 T2和 T3時點,D組BP均明顯低于C組(P<0.05);在T2時點,D組患者HR明顯低于C組(P<0.05)。兩組患者各時點VAS評分變化趨勢基本相同,但T1~T5時點C組VAS評分明顯高于D組,差異有統(tǒng)計學(xué)意義(P<0.05)。見表1。兩組術(shù)后各時點SpO2變化曲線基本重合,差異無統(tǒng)計學(xué)意義(P>0.05)。
一是將卷積通過im2col轉(zhuǎn)化為矩陣乘法,利用現(xiàn)有的高性能矩陣運算庫來獲得高性能,這種方式將占用較大的臨時存儲空間;
二是直接計算卷積,具體有:采用樸素算法直接計算;采用將卷積計算轉(zhuǎn)化為FFT運算來加速,其將卷積運算復(fù)雜度由降低到了其中輸出大小為No,卷積核大小為Nf ;針對大小為3x3的卷積核采用Winograd算法[14]提高卷積計算性能,但需要在內(nèi)存中占據(jù)臨時空間;利用ReLU輸出的稀疏性加速卷積計算[15]。
3.4 運算向量化
通過充分利用CPU/GPU的SIMD(單指令多數(shù)據(jù))指令,在進行卷積、池化、激活函數(shù)的運算時,可數(shù)倍提高計算效率。在移動設(shè)備中使用最廣的ARM處理器即設(shè)計了NEON指令集,NEON是結(jié)合了64—bit和128—bit的SIMD指令集,提供128位寬的向量運算,NEON技術(shù)從ARMv7開始被采用,目前可以在ARM Cortex—A和Cortex—R系列處理器中采用。NEON指令集支持的數(shù)據(jù)類型有:32—bit單精度浮點數(shù);8,16,32,64—bit無符號/有符號整型;8,16—bit多項式。
ARM公開的ComputeLibray程序庫,采用NEON(ARM CPU的SIMD指令集)優(yōu)化后的卷積運算及SGEMM(單精度矩陣乘法)性能比OpenCV原始版本提升了15倍以上。
針對現(xiàn)有移動設(shè)備,采用前文所述的一系列技術(shù),可大幅減小模型體積,降低內(nèi)存占用,大幅減少運算量及提高運算效率,進而有效控制深度學(xué)習(xí)算法在移動設(shè)備上的運行功耗。隨著深度學(xué)習(xí)技術(shù)的繼續(xù)發(fā)展,將會有性能更強、容量更大、運算量更大的模型不斷涌現(xiàn),運算性能及功耗的限制始終是深度學(xué)習(xí)算法在移動設(shè)備上部署的挑戰(zhàn)。針對這樣的發(fā)展趨勢,在硬件及芯片層面進行專有設(shè)計,開展更深度的優(yōu)化,例如:將運算位數(shù)進一步降低甚至僅采用一位二進制數(shù)進行權(quán)值存儲及運算[16];硬件實時對壓縮后的權(quán)值及特征圖進行解壓縮,大幅降低帶寬及訪存功耗[2]。在未來將專有硬件逐步引入移動設(shè)備后,深度學(xué)習(xí)將在更多的領(lǐng)域帶來突破,應(yīng)用場景將更加廣泛。
* [1] F. Schroff, D. Kalenichenko, and J. Philbin. Facenet: A unified emb edding for face recognition and clustering. In CVPR, 2015. 1, 7
* [2] Y.—H. Chen, T. Krishna, J. Emer, and V. Sze, “Eyeriss: An Energy—Efficient Reconfigurable Accelerator for Deep Convolu— tional Neural Networks,” IEEE J. Solid—State Circuits, vol. 51, no. 1, 2017.
* [3] K. He, X. Zhang, S. Ren, and J. Sun, “Deep Residual Learning for Image Recognition,” in CVPR, 2016.
* [4] Amodei, Dario, et al. "Deep Speech 2: End—to—End Speech Rec ognition in English and Mandarin." international conference on machine learning (2015): 173—182.
* [5] M. Horowitz, “Computing’s energy problem (and what we can do about it),” in IEEE Int. Solid—State Circuits Conf. Dig. Tech. Papers (ISSCC), Feb. 2014, pp. 10-14.
* [6] A. Krizhevsky, I. Sutskever, and G. E. Hinton, “ImageNet Clas sification with Deep Convolutional Neural Networks,” in NIPS, 2012.
* [7] K. He, X. Zhang, S. Ren, and J. Sun, “Delving deep into rectifi ers: Surpassing human—level performance on imagenet classifica tion,” in The IEEE International Conference on Computer Vision (ICCV), December 2015.
* [8] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov,D. Erhan, V. Vanhoucke, and A. Rabinovich, “Going Deeper With Convolutions,” in CVPR, 2015.
* [9] Han, Song, Pool, Jeff, Tran, John, and Dally, William J. Learni ng both weights and connections for efficient neural networks. In Advances in Neural Information Processing Systems, 2015.
* [10] S. Gupta, A. Agrawal, K. Gopalakrishnan, and P. Narayan an, “Deep Learning with Limited Numerical Precision,” in ICML,2015.
* [11] Nvidia, GPU—Based Deep Learning Inference: A Performance and Power Analysis.
* [12] Min Lin, Qiang Chen, Shuicheng Yan, Network In Network. arXiv:1312.4400, 2013.
* [13] M. Mathieu, M. Henaff, and Y. LeCun, “Fast training of convol utional networks through FFTs,” in ICLR, 2014.
* [14] A. Lavin and S. Gray, “Fast algorithms for convolutional neu ral networks,” in CVPR, 2016.
* [15] Shi, Shaohuai; Chu, Xiaowen, Speeding up Convolutional Neural Networks By Exploiting the Sparsity of Rectifier Units. epri nt arXiv:1704.07724.
* [16] M. Courbariaux, Y. Bengio, and J.—P. David, “Binaryconnect:Training deep neural networks with binary weights during propa gations,” in NIPS, 2015.