朱永貴,華敏杰,張佳佳
(中國傳媒大學(xué)理學(xué)院,北京 100024)
隨著深度學(xué)習(xí)技術(shù)的發(fā)展,ANN(Artificial Neural Networks,人工神經(jīng)網(wǎng)絡(luò))由于其強(qiáng)大的學(xué)習(xí)能力受到了研究人員的廣泛關(guān)注,它是一種模仿動物大腦神經(jīng)突觸連接結(jié)構(gòu)進(jìn)行分布式并行信息處理的算法模型,在工程和學(xué)術(shù)界也常簡稱為神經(jīng)網(wǎng)絡(luò)[1]。ANN的網(wǎng)絡(luò)結(jié)構(gòu)通常包含輸入層、隱含層和輸出層,其中輸入層和輸出層只有一層,而隱含層可以有多層。每層都含有若干個神經(jīng)元,相鄰層之間的所有神經(jīng)元之間都存在連接,每個連接上都有一個權(quán)重。神經(jīng)網(wǎng)絡(luò)的目標(biāo)就是優(yōu)化連接上的權(quán)值,使得從輸入層到輸出層的映射最能符合實(shí)際情況。
但是,由于ANN的各層之間均采用全連接結(jié)構(gòu),這使得其參數(shù)量十分巨大,尤其是在對圖像的處理過程中,每個像素點(diǎn)都是一個特征值,全連接結(jié)構(gòu)所產(chǎn)生的可學(xué)習(xí)參數(shù)量是難以接受的。并且,全連接結(jié)構(gòu)的參數(shù)是非常冗余的,既加大了神經(jīng)網(wǎng)絡(luò)的計(jì)算量,減慢了訓(xùn)練時的收斂速度,又增加了過擬合現(xiàn)象出現(xiàn)的概率。
CNN(Convolutional Neural Networks,卷積神經(jīng)網(wǎng)絡(luò))是一種特殊的神經(jīng)網(wǎng)絡(luò),引入了卷積、池化、局部感受野以及權(quán)值共享等概念,使得CNN能夠利用輸入數(shù)據(jù)的二維結(jié)構(gòu)[2]。因此,與傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)相比,CNN更適合用于處理圖像問題。
GPU(Graphic Processing Unit,圖形處理單元)這一概念最早由Nvidia在1999年發(fā)布GeForce 256圖形處理芯片時提出。在此之前的顯卡僅能用于簡單的文字和圖形輸出,而GeForce 256采用了“T&L”硬件(硬件級的光影轉(zhuǎn)換引擎)、立方環(huán)境材質(zhì)貼圖和頂點(diǎn)混合、紋理壓縮和凹凸映射貼圖、雙重紋理等核心技術(shù),同時,OpenGL(Open Graphics Library,開源圖形庫)和DirectX 7均提供了硬件頂點(diǎn)變換的編程接口。從此以后,大量的坐標(biāo)和光影轉(zhuǎn)換工作從CPU解放出來,轉(zhuǎn)而交由GPU完成。
雖然GPU的設(shè)計(jì)初衷是為了解決圖形渲染效率的問題,但是隨著技術(shù)的不斷進(jìn)步,微軟發(fā)布了Shader Model(渲染單元模式),Shader由此誕生。Shader從本質(zhì)上說是一段能針對3D圖像進(jìn)行操作并被GPU所執(zhí)行的圖形渲染指令集[3],通過這些指令集,開發(fā)人員能夠在GPU上實(shí)現(xiàn)像素的可編程。正因如此,GPU的作用不再局限于圖形領(lǐng)域,對于提升計(jì)算密集型程序的效率也同樣適用,因此就出現(xiàn)了GPGPU(General Purpose GPU,通用計(jì)算圖形處理單元)這一概念。
GPU之所以比CPU更適合可并行計(jì)算,是因?yàn)镃PU與GPU的架構(gòu)大不相同。人們最初在設(shè)計(jì)CPU時,希望其具備很強(qiáng)的通用性來處理各種不同的數(shù)據(jù)類型,同時需要進(jìn)行邏輯判斷,這又會引入大量的分支跳轉(zhuǎn)和中斷的處理,這使得CPU的結(jié)構(gòu)非常復(fù)雜;而GPU面對的是類型高度統(tǒng)一的、相互無依賴的大規(guī)模數(shù)據(jù)和不需要被打斷的純凈的計(jì)算環(huán)境[4],因此我們希望GPU擁有強(qiáng)大的計(jì)算能力而無需具備復(fù)雜的邏輯判斷能力。如圖1所示,其中綠色表示的是計(jì)算單元,橙色表示的是存儲單元,黃色表示的是控制單元。從圖中可以看出,GPU采用了數(shù)量眾多的計(jì)算單元,而其控制邏輯卻非常簡單,并且省去了緩存區(qū);而CPU不僅被緩存占據(jù)了大量的空間,而且還有復(fù)雜的控制邏輯,與GPU相比,CPU的計(jì)算單元卻只占用其很小的一部分。因此,CPU適用于邏輯復(fù)雜且計(jì)算量不大的程序,而GPU則適用于邏輯簡單、計(jì)算密集且易于并行的程序。
圖1 CPU與GPU架構(gòu)的比較
Nvidia一直處于GPU市場的領(lǐng)先地位,在GPGPU的概念出現(xiàn)后,Nvidia推出了CUDA庫(Compute Unified Device Architecture,通用并行計(jì)算架構(gòu)),從而使開發(fā)者能更加輕松地利用Nvidia的GPU優(yōu)化自己的算法[5]。隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展,Nvidia在人工智能高性能計(jì)算方面遠(yuǎn)遠(yuǎn)地甩開了其競爭對手AMD,逐漸確立起了其在高性能通用計(jì)算型GPU市場中的霸主地位。起初,Nvidia主打的GPU系列是GeForce,主要用于家庭和企業(yè)的娛樂應(yīng)用,面向游戲用戶,此時GPU的作用也主要在于圖形渲染和光照運(yùn)算;而Quadro系列則主要應(yīng)用于圖形工作站,面向?qū)I(yè)的圖形繪制專家。隨著人工智能研究的不斷推進(jìn),計(jì)算力逐漸成為深度學(xué)習(xí)算法的訓(xùn)練瓶頸,CPU已經(jīng)難以支撐起日漸龐大的模型和數(shù)據(jù)。于是,Nvidia推出了Tesla系列GPU,為企業(yè)級深度學(xué)習(xí)研究人員提供了強(qiáng)大的硬件支持。2017年5月11日,在加州圣何塞舉辦的2017年度GPU技術(shù)大會上,Nvidia發(fā)布了最新款Tesla系列GPU:Tesla V100。相比于其上一代產(chǎn)品Tesla P100,V100搭載了新款圖形處理器GV100,采用Volta架構(gòu)代替了P100的Pascal架構(gòu),CUDA核心數(shù)從3584個增加到5120個,并且增加了640個能提高深度計(jì)算性能的Tensor內(nèi)核,雙精度浮點(diǎn)運(yùn)算速度從4.7 TFLOPs提升到7 TFLOPs,單精度浮點(diǎn)運(yùn)算速度從9.3 TFLOPs提升到14 TFLOPs。
圖2對比了Tesla P100與V100對于ResNet-50網(wǎng)絡(luò)的訓(xùn)練與預(yù)測效率[6],從圖中可知,在訓(xùn)練過程中,P100使用單精度進(jìn)行運(yùn)算,每秒能處理200多張圖片,而V100使用Tensor內(nèi)核進(jìn)行運(yùn)算,每秒能處理將近600張圖片,V100的訓(xùn)練效率是P100的2.4倍;而在預(yù)測過程中,P100使用半精度進(jìn)行運(yùn)算,每秒能處理約1500張圖片,V100仍使用Tensor內(nèi)核進(jìn)行運(yùn)算,每秒能處理5000多張圖片,V100的訓(xùn)練效率是P100的3.7倍。
圖2 Nvidia Tesla P100與V100性能對比
2017年12月8日,Nvidia在NIPS(Conference and Workshop on Neural Information Processing Systems,神經(jīng)信息處理系統(tǒng)大會)會議上發(fā)布了其全新的Titan系列GPU:Nvidia Titan V。與Tesla系列略有不同,Titan系列更專注于神經(jīng)信息處理方向,因此更專注于單精度浮點(diǎn)運(yùn)算。Titan V的單精度浮點(diǎn)速度達(dá)到了15 TFLOPS,比Tesla V100的14 TFLOPS還要高。
除了PC端GPU以外,Nvidia也推出了供移動端使用的嵌入式GPU:Jetson模塊。如Jetson TX2,兼具了高效能與低能耗,非常適合部署在機(jī)器人、無人機(jī)或智能家居等智能終端裝置上,用于加速神經(jīng)網(wǎng)絡(luò)計(jì)算。雖然Jetson TX2的性能與PC端GPU相比遜色不少,僅配備了256個CUDA核心,但其計(jì)算神經(jīng)網(wǎng)絡(luò)的效率仍遠(yuǎn)遠(yuǎn)高于移動端CPU。
由此可見,以Nvidia為代表的GPU生產(chǎn)商已經(jīng)發(fā)現(xiàn)深度學(xué)習(xí)算法在人工智能應(yīng)用領(lǐng)域中的巨大潛力,而深度學(xué)習(xí)算法在面對海量的數(shù)據(jù)時,需要巨大的計(jì)算力的支持。隨著專用于并行計(jì)算的GPU逐漸進(jìn)入人工智能領(lǐng)域,深度學(xué)習(xí)在計(jì)算層面的瓶頸得到了極大地緩解,GPU也不再僅僅是圖形學(xué)計(jì)算的工具。
對于有多個隱含層的神經(jīng)網(wǎng)絡(luò),計(jì)算方法可以類推,只需將上一層的輸出值作為下一層的輸入值,逐層傳導(dǎo)即可。
卷積層是CNN的核心構(gòu)成單元,一個卷積層由若干卷積核組成,卷積核包含若干可學(xué)習(xí)的參數(shù)。每個卷積核只連接上一層中的某幾個神經(jīng)元,常見的卷積核尺寸為,意味著每個卷積核的感受野僅限于一個的局部區(qū)域。假設(shè)Wij表示卷積核中第i行,第j列的權(quán)值,表示該卷積核的偏置項(xiàng)權(quán)值,xi,j表示該卷積核當(dāng)前對應(yīng)的上一層感受野區(qū)域中第i行,第j列的特征值,那么該卷積操作的輸出值y按以下公式進(jìn)行計(jì)算:
a(k+1)=f(W(k)·a(k)+b(k))
而對于CNN中的卷積層計(jì)算,我們也可以將其轉(zhuǎn)化為矩陣乘法運(yùn)算。如圖3所示,中間為輸入的特征圖像,上方展示了傳統(tǒng)的卷積計(jì)算方法,下方展示了將卷積轉(zhuǎn)化為矩陣乘法的方法,主要思路是將卷積核和對應(yīng)窗口的特征圖展開成一維向量。
對于矩陣乘法的運(yùn)算,Nvidia提供了基于CUDA實(shí)現(xiàn)的線性代數(shù)庫cuBLAS(CUDA Basic Linear
圖3 卷積轉(zhuǎn)化為矩陣乘法示意圖
Algebra Subprograms,CUDA基礎(chǔ)線性代數(shù)庫)[7]。cuBLAS通過Nvidia的GPU加速線性代數(shù)的運(yùn)算,用戶可以調(diào)用cuBLAS API來計(jì)算向量加法、內(nèi)積,矩陣加法、乘法等常用的線性運(yùn)算。在調(diào)用cuBLAS API時,程序會在GPU中分配矩陣或向量所需的內(nèi)存空間,并加載數(shù)據(jù),調(diào)用對應(yīng)的cuBLAS函數(shù),在GPU計(jì)算完成后,再將計(jì)算結(jié)果從GPU內(nèi)存空間上傳到主機(jī)。
除此以外,Nvidia還針對深度神經(jīng)網(wǎng)絡(luò)進(jìn)行專門的GPU優(yōu)化,提供了cuDNN計(jì)算庫[8]。可以看到,在將卷積轉(zhuǎn)化為矩陣乘法的過程中,會產(chǎn)生很多冗余的數(shù)據(jù)量。而GPU的內(nèi)存是非常寶貴的,在理想狀態(tài)下,GPU內(nèi)存中應(yīng)該儲存的是樣本數(shù)據(jù)、參數(shù)和神經(jīng)的激活值,而不是在計(jì)算過程中所產(chǎn)生的輔助數(shù)據(jù)。cuDNN的目標(biāo)是在保證計(jì)算精度的前提下,消除這些額外的內(nèi)存消耗,同時加快神經(jīng)網(wǎng)絡(luò)的計(jì)算速度。因此,cuDNN有助于GPU加載更大型的神經(jīng)網(wǎng)絡(luò),同時訓(xùn)練更多的樣本數(shù)據(jù),也提高了神經(jīng)網(wǎng)絡(luò)的收斂速度。
本文對GPU的發(fā)展現(xiàn)狀進(jìn)行了闡述,并將其與CPU在物理特性方面進(jìn)行對比。然后對ANN和CNN卷積操作的計(jì)算方法進(jìn)行說明,發(fā)現(xiàn)兩者在計(jì)算過程中的共同特征,最后介紹了GPU對神經(jīng)網(wǎng)絡(luò)進(jìn)行加速的方法和一些計(jì)算庫,對深度學(xué)習(xí)算法的相關(guān)研究人員和從業(yè)人員具有一定的參考價值。