陳桂林 馬 勝 郭 陽(yáng)
(國(guó)防科技大學(xué)計(jì)算機(jī)學(xué)院 長(zhǎng)沙 410073)
隨著數(shù)據(jù)的爆炸式增長(zhǎng)和計(jì)算性能的階躍式提升,機(jī)器學(xué)習(xí)的研究在經(jīng)歷20世紀(jì)由計(jì)算瓶頸引起的寒潮后重新變得火熱起來(lái).機(jī)器學(xué)習(xí)算法已廣泛地運(yùn)用到許多智能應(yīng)用和云服務(wù)之中.常見(jiàn)應(yīng)用有語(yǔ)音識(shí)別如蘋(píng)果Siri和微軟小娜,面部識(shí)別如Apple iPhoto或Google Picasa,同時(shí)智能機(jī)器人也大量使用了機(jī)器學(xué)習(xí)算法.目前,機(jī)器學(xué)習(xí)領(lǐng)域最火熱的是以神經(jīng)網(wǎng)絡(luò)為代表的深度學(xué)習(xí).據(jù)統(tǒng)計(jì),深度神經(jīng)網(wǎng)絡(luò)運(yùn)用在語(yǔ)音識(shí)別上比傳統(tǒng)方法要減少了30%的單詞識(shí)別錯(cuò)誤率[1],將圖像識(shí)別競(jìng)賽的錯(cuò)誤率從2011年的26%降至3.5%[2-4].此外它還被廣泛地應(yīng)用到數(shù)據(jù)挖掘中.但由于神經(jīng)網(wǎng)絡(luò)的應(yīng)用范圍越來(lái)越廣,精度要求越來(lái)越高,導(dǎo)致神經(jīng)網(wǎng)絡(luò)的規(guī)模也越來(lái)越大.通常對(duì)大規(guī)模神經(jīng)網(wǎng)絡(luò)加速的方法是設(shè)計(jì)性能更強(qiáng)大的通用芯片,并且增加專門(mén)的神經(jīng)網(wǎng)絡(luò)處理模塊,如英特爾的Knight Mill和英偉達(dá)最新的Volte架構(gòu)都添加了對(duì)神經(jīng)網(wǎng)絡(luò)的加速模塊.不過(guò)它們作為通用運(yùn)算器件始終限制了它們完成特殊任務(wù)時(shí)的效率,比如CPU必須包含高速緩存、分支預(yù)測(cè)、批處理、地址合并、多線程、上下文切換等多種通用功能,這些功能并不會(huì)完全用于神經(jīng)網(wǎng)絡(luò)的加速,但它們會(huì)占用芯片的設(shè)計(jì)面積.這就導(dǎo)致神經(jīng)網(wǎng)絡(luò)加速時(shí)硬件資源并沒(méi)有完全利用.所以人們也開(kāi)始設(shè)計(jì)專用芯片來(lái)實(shí)現(xiàn)對(duì)大型神經(jīng)網(wǎng)絡(luò)的加速.
近年來(lái)各大科研機(jī)構(gòu)紛紛提出了各自的加速器結(jié)構(gòu),如中國(guó)科學(xué)院陳天石團(tuán)隊(duì)[5-8]的Diannao家族、Google的TPU[9](tensor process unit)和cloud TPU[10]、普度大學(xué)推出的Scaledeep[11]、MIT(Massa-chusetts Institute of Technology)提出的Eyeriss[12]、HP實(shí)驗(yàn)室和猶他大學(xué)聯(lián)合提出的基于憶阻器的ISAAC[13],以及Parashar等人[14]提出的壓縮稀疏卷積神經(jīng)網(wǎng)絡(luò)加速器SCNN等.現(xiàn)有神經(jīng)網(wǎng)絡(luò)加速芯片的研究主要集中在4個(gè)方面:1)從神經(jīng)網(wǎng)絡(luò)的計(jì)算結(jié)構(gòu)出發(fā),研究了樹(shù)狀結(jié)構(gòu)和陣列結(jié)構(gòu)如何高效地完成神經(jīng)網(wǎng)絡(luò)的卷積運(yùn)算;2)從存儲(chǔ)的瓶頸角度出發(fā),研究了3D存儲(chǔ)技術(shù)如何應(yīng)用到加速器的設(shè)計(jì)中;3)從新材料器件的探索出發(fā),研究了憶阻器等新器件如何實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)處理存儲(chǔ)一體化;4)從數(shù)據(jù)流的調(diào)度和優(yōu)化出發(fā),研究了如何最大化利用網(wǎng)絡(luò)中各類(lèi)數(shù)據(jù)的局部重用以及稀疏網(wǎng)絡(luò)的處理.
神經(jīng)網(wǎng)絡(luò)分為生物啟發(fā)的神經(jīng)網(wǎng)絡(luò)(biologically inspired neural network)和人工神經(jīng)網(wǎng)絡(luò)(artificial neural network)2類(lèi).前者由神經(jīng)生物學(xué)家關(guān)注,用來(lái)建立一種靈感來(lái)源于生物學(xué)的模型以幫助理解神經(jīng)網(wǎng)絡(luò)和大腦是如何運(yùn)轉(zhuǎn)的,比較有代表性的是脈沖神經(jīng)網(wǎng)絡(luò).IBM的TrueNorth[15]和Furber等人[16-18]提出的SpiNNaker就是這種結(jié)構(gòu).但由于脈沖神經(jīng)網(wǎng)絡(luò)在處理機(jī)器學(xué)習(xí)任務(wù)時(shí)精度低的缺點(diǎn),目前并沒(méi)有得到廣泛應(yīng)用,本文不對(duì)其進(jìn)行過(guò)多的贅述.后者人工神經(jīng)網(wǎng)絡(luò)是本文討論的重點(diǎn).
人工神經(jīng)網(wǎng)絡(luò)是一種典型的機(jī)器學(xué)習(xí)方法,也是深度學(xué)習(xí)的一種重要形式.1943年McCulloch和Pitts[19]提出了第1個(gè)人工神經(jīng)元模型(M-P神經(jīng)元如圖1(a)),在這個(gè)模型中,神經(jīng)元接受來(lái)自n個(gè)其他神經(jīng)元傳遞過(guò)來(lái)的信號(hào),這些輸入信號(hào)通過(guò)帶權(quán)重的連接進(jìn)行傳遞,神經(jīng)元接受到的總輸入值將與神經(jīng)元的閾值進(jìn)行比較,然后通過(guò)“激活函數(shù)”產(chǎn)生神經(jīng)元的輸出.常用的激活函數(shù)有sigmoid函數(shù)、階躍函數(shù)、ReLU等非線性函數(shù).為了把人工神經(jīng)網(wǎng)絡(luò)研究從理論探討付諸工程實(shí)踐,1958年Rosenblatt[20]設(shè)計(jì)制作了感知機(jī),如圖1(b).感知機(jī)輸入層并不是功能神經(jīng)元,只接受外界輸入信號(hào)后傳遞給輸出層,輸出層是一個(gè)M-P功能神經(jīng)元.一個(gè)感知機(jī)可以實(shí)現(xiàn)邏輯與、或、非等簡(jiǎn)單的線性可分問(wèn)題,但要解決一個(gè)復(fù)雜的非線性可分問(wèn)題時(shí),就要用到多層感知機(jī)(神經(jīng)網(wǎng)絡(luò)).如圖1(c)的2層感知機(jī)可以解決一個(gè)異或問(wèn)題,與單層感知機(jī)相比,它包含一個(gè)隱含層.當(dāng)隱含層不斷增加就有了深度神經(jīng)網(wǎng)絡(luò)(deep neural network, DNN)的概念,如圖1(d).這里所謂的深度并沒(méi)有嚴(yán)格的定義,在語(yǔ)音識(shí)別中4層網(wǎng)絡(luò)就可以被認(rèn)為是“較深的”,而在圖像識(shí)別中20層以上的網(wǎng)絡(luò)比比皆是.不過(guò)隨著隱含層數(shù)的增加,深度神經(jīng)網(wǎng)絡(luò)有個(gè)明顯的問(wèn)題——參數(shù)數(shù)量的急劇膨脹.這就導(dǎo)致了計(jì)算量的急劇上升,進(jìn)而使得網(wǎng)絡(luò)模型的計(jì)算時(shí)間增加、計(jì)算功耗升高.為了解決這個(gè)問(wèn)題,20世紀(jì)60年代,Hubel和Wiesel[21]提出了卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network, CNN)的概念.卷積神經(jīng)網(wǎng)絡(luò)局部感知和參數(shù)共享的特點(diǎn)使它能夠有效地減少參數(shù)數(shù)量,降低深度神經(jīng)網(wǎng)絡(luò)的復(fù)雜性.
Fig. 1 The evolution of neural network圖1 神經(jīng)網(wǎng)絡(luò)的演變過(guò)程
Fig. 3 A representative CNN architecture—LeNet5圖3 一個(gè)具有代表性的CNN結(jié)構(gòu)——LeNet5
1) 局部感知,指通過(guò)對(duì)局部信息進(jìn)行整合到達(dá)識(shí)別圖像的目的.在傳統(tǒng)的深度神經(jīng)網(wǎng)絡(luò)中,第i層每個(gè)神經(jīng)元都會(huì)與第i-1層所有神經(jīng)元連接,這樣做不僅導(dǎo)致了計(jì)算量非常大,而且網(wǎng)絡(luò)缺少泛化能力,容易造成過(guò)擬合的情況.采用局部感知的方法,在機(jī)器進(jìn)行圖像識(shí)別時(shí)每個(gè)神經(jīng)元不必對(duì)全局圖像進(jìn)行感知,只需要對(duì)局部進(jìn)行感知,而后在更高層將局部的信息綜合起來(lái)就得到了全局的信息.這樣做不僅增強(qiáng)了網(wǎng)絡(luò)的泛化能力,還有效減少了計(jì)算量.對(duì)應(yīng)到具體操作是指上一層的數(shù)據(jù)區(qū)有一個(gè)滑動(dòng)的窗口,只有窗口內(nèi)的數(shù)據(jù)會(huì)與下一層神經(jīng)元有關(guān)聯(lián),如圖2所示.
Fig. 2 The process of convolution圖2 卷積的過(guò)程
2) 參數(shù)共享,即權(quán)值共享.對(duì)一個(gè)特征圖來(lái)說(shuō),卷積操作就是提取特征的過(guò)程,這里簡(jiǎn)單介紹卷積核的概念,卷積核就是一個(gè)有相關(guān)權(quán)重的方陣,它的作用是用來(lái)提取圖像的特定特征.提取特征和目標(biāo)在圖像中的位置無(wú)關(guān),這也意味著某一部分學(xué)習(xí)的特征也能用在另一部分上,所以對(duì)于這個(gè)圖像上的所有位置,都能使用同樣的學(xué)習(xí)特征.具體來(lái)說(shuō)就是將卷積核的每一個(gè)元素作用到輸入特征圖的每一個(gè)位置(邊界因素先不考慮).參數(shù)共享保證了訓(xùn)練時(shí)對(duì)輸入特征圖只需要學(xué)習(xí)一個(gè)參數(shù)集合,而不是對(duì)每一個(gè)位置都需要學(xué)習(xí)一個(gè)單獨(dú)的參數(shù)集合.
因?yàn)榫植扛兄蛥?shù)共享這2個(gè)特點(diǎn),卷積神經(jīng)網(wǎng)絡(luò)被廣泛應(yīng)用在圖像識(shí)別領(lǐng)域.圖3展示了一個(gè)經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)框架LeNet5[22]完成數(shù)字識(shí)別的過(guò)程.從圖3中可以看出,卷積神經(jīng)網(wǎng)絡(luò)主要由卷積層、池化層和全連接層組成.
介紹卷積層前,我們先介紹一下輸入圖像、輸入特征圖、輸出特征圖的概念.輸入圖像是指要進(jìn)行識(shí)別的原始圖像,并且它也是第1層網(wǎng)絡(luò)的輸入特征圖,輸出特征圖是指神經(jīng)網(wǎng)絡(luò)某1層的輸出,同時(shí)它也是下一層網(wǎng)絡(luò)的輸入特征圖.卷積層是為了提取輸入特征圖中的某些特征,它的輸出是由神經(jīng)元組成的一幅新的2D特征圖.計(jì)算過(guò)程是先卷積再通過(guò)一個(gè)激活函數(shù)得到結(jié)果,卷積過(guò)程如圖2所示.計(jì)算公式為
In(x+kx,y+ky)fi+βfi)),
其中,f(·)是非線性激活函數(shù),βfi表示偏移值,out(x,y)表示在輸出特征圖坐標(biāo)(x,y)處的值,w(kx,ky)表示卷積核坐標(biāo)(kx,ky)上的權(quán)重值,In(x+kx,y+ky)表示輸入特征圖坐標(biāo)(x+kx,y+ky)上的輸入值;Kx,Ky表示卷積核的大小,fi表示第i幅輸入特征圖,Nfi表示輸入特征圖的數(shù)目.
卷積層計(jì)算中卷積的實(shí)現(xiàn)方法有4種,直接卷積、展開(kāi)式卷積(Toeplitz矩陣方法[23])、Winograd卷積[24]和快速傅里葉變換(fast Fourier transform,F(xiàn)FT)卷積[25].直接卷積方案在Alex編寫(xiě)的cuda-convnet框架[26]中有詳細(xì)介紹.卷積過(guò)程如圖2所示,與數(shù)字信號(hào)中的卷積運(yùn)算不同[27],直接卷積是指卷積核在輸入特征圖上滑動(dòng)時(shí)將滑動(dòng)窗口內(nèi)的元素對(duì)應(yīng)相乘與累加(數(shù)字信號(hào)中的卷積會(huì)將卷積核翻轉(zhuǎn)再與輸入對(duì)應(yīng)相乘累加).展開(kāi)式卷積就是將輸入圖像展開(kāi)成列,將卷積核展開(kāi)成行,將卷積操作轉(zhuǎn)換成矩陣乘法操作,最后通過(guò)高度優(yōu)化數(shù)學(xué)庫(kù)(GPU的cuBLAS)實(shí)現(xiàn).Winograd卷積是通過(guò)計(jì)算步驟的轉(zhuǎn)換將卷積操作中的乘法操作和加法操作的數(shù)目改變,使乘法操作減少,加法操作增加,從而提升效率.FFT卷積就是將空間域中的離散卷積轉(zhuǎn)化為傅里葉域的乘積.它的實(shí)現(xiàn)分3個(gè)步驟:1)通過(guò)快速傅里葉變換將輸入特征圖和卷積核從空間域轉(zhuǎn)換到頻域;2)在頻域中這些變換后的矩陣相乘;3)計(jì)算結(jié)果從頻域反轉(zhuǎn)到空間域.
池化層也叫下采樣層,通常是跟在卷積層的后面,根據(jù)一定的采樣規(guī)則(通常是最大值或平均值采樣)[28]做采樣.池化層的作用是提取局部特征.這是由于圖像具有一種“靜態(tài)性”的屬性,在一個(gè)圖像區(qū)域有用的特征可能在另一個(gè)區(qū)域同樣適用.例如,卷積層輸出的特征圖中2個(gè)相鄰的點(diǎn)的特征通常會(huì)很相似,假設(shè)a[0,0],a[0,1],a[1,0],a[1,1]都表示顏色特征是紅色,沒(méi)有必要都保留作下一層的輸入.池化層可以將這4個(gè)點(diǎn)做一個(gè)整合,輸出紅色這個(gè)特征.這樣可以降低輸入特征圖的維度,減少過(guò)擬合現(xiàn)象,同時(shí)縮短網(wǎng)絡(luò)模型的執(zhí)行時(shí)間.
全連接層的作用是將有用的局部信息提取整合,也就是將以前的局部特征通過(guò)權(quán)重矩陣重新組裝成新的特征圖.它的核心思想是非線性變換和擬合,多個(gè)全連接層的非線性變換嵌套疊加會(huì)使網(wǎng)絡(luò)有很強(qiáng)的擬合能力(也可能造成過(guò)擬合).具體來(lái)說(shuō),在全連接層中,輸出神經(jīng)元與上層的輸入神經(jīng)元全部以獨(dú)立的權(quán)重值相連接.我們可以將全連接層的計(jì)算看作是一個(gè)矩陣乘向量,再加上激活函數(shù)的非線性映射,即:
其中,out是輸出值,f(·)是激活函數(shù),n表示輸入特征圖的輸入數(shù)目,β代表偏移值.每個(gè)輸入對(duì)應(yīng)1個(gè)權(quán)重值.全連接層的運(yùn)算實(shí)質(zhì)也是一個(gè)乘累加運(yùn)算.
以上就是一個(gè)卷積神經(jīng)網(wǎng)絡(luò)的基本組成,卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練基本上和BP(back propagation)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練一樣,通過(guò)遞歸不斷地更新權(quán)重減小誤差.現(xiàn)在又新興的一種權(quán)重訓(xùn)練方法即采用遺傳算法訓(xùn)練權(quán)重[29],文中總結(jié)的加速器大多只完成推導(dǎo)階段,所以這里對(duì)訓(xùn)練不進(jìn)行過(guò)多贅述.
常見(jiàn)的通用芯片包括CPU,GPU,DSP,F(xiàn)PGA,隨著深度學(xué)習(xí)的火熱,它們的最新設(shè)計(jì)都對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行了一些支持.下面分別來(lái)介紹它們?yōu)橹С稚窠?jīng)網(wǎng)絡(luò)所作的改進(jìn).
CPU作為應(yīng)用最廣泛的通用處理器,其對(duì)神經(jīng)網(wǎng)絡(luò)的運(yùn)算優(yōu)化主要集中在軟件層面,比如優(yōu)化對(duì)神經(jīng)網(wǎng)絡(luò)框架(如Caffe[30]和TensorFlow[31])的支持.硬件方面,隨著研究表明推導(dǎo)時(shí)操作數(shù)的精度對(duì)準(zhǔn)確率的影響不大,如表1所示:
Table 1 Effect of Operand Accuracy on Recognition Accuracy表1 操作數(shù)精度對(duì)識(shí)別準(zhǔn)確率的影響
CPU也開(kāi)始支持低精度運(yùn)算.Intel就對(duì)最新的處理器Knights Mill[32]增加了他們稱之為“可變精度”的支持.另外,它對(duì)向量處理單元(vector pro-cessing unit, VPU)也做了改進(jìn).和上一代Knights Landing相比,Knights Mill在VPU上用1個(gè)較小的雙精度端口和4個(gè)向量神經(jīng)網(wǎng)絡(luò)指令(vector neural network instruction, VNNI)端口,取代了Knights Landing的VPU上2個(gè)大的雙精度單精度浮點(diǎn)(64 b32 b)端口.VNNI端口支持單精度浮點(diǎn)和混合精度整數(shù)(16 b輸入32 b輸出).由于操作數(shù)精度的降低,以往指令取出的32 b操作數(shù)如今變成了2個(gè)16 b操作數(shù),這樣運(yùn)算相同數(shù)目的操作數(shù)將會(huì)采用更少的指令,同時(shí)也降低了計(jì)算的復(fù)雜度,進(jìn)而提高了性能.
圖形處理器GPU強(qiáng)大的并行計(jì)算能力適用于CNN計(jì)算過(guò)程中的大量并行浮點(diǎn)計(jì)算以及矩陣和向量運(yùn)算,這促使了GPU成為最常見(jiàn)的神經(jīng)網(wǎng)絡(luò)硬件加速平臺(tái).許多機(jī)器學(xué)習(xí)的框架都利用了含有CUDA編程接口的GPU,如cuda-convnet[33],Torch[34],Theano[35],Caffe[30].與此同時(shí),許多GPU的深度學(xué)習(xí)庫(kù)也在被探索用來(lái)加速神經(jīng)網(wǎng)絡(luò),如英偉達(dá)的cuDNN[36]和Facebook的fbfft[37]等.需要注意的是并沒(méi)有哪一種框架或庫(kù)對(duì)所有類(lèi)型的神經(jīng)網(wǎng)絡(luò)都能有最好的加速效果.針對(duì)不同類(lèi)型、不同結(jié)構(gòu)神經(jīng)網(wǎng)絡(luò)上述框架和庫(kù)都有不同的表現(xiàn).
除了支持深度學(xué)習(xí)庫(kù)之外,GPU也在體系結(jié)構(gòu)上支持半精度的運(yùn)算,如tesla P100采用的GP100核心、tesla V100采用的GV100核心以及AMD的Vega架構(gòu).英偉達(dá)最新的Volta架構(gòu)更是設(shè)計(jì)了一個(gè)專門(mén)用來(lái)處理深度學(xué)習(xí)任務(wù)的Tensor Core.每個(gè)Tensor Core包含1個(gè)4×4×4的矩陣處理陣列來(lái)完成D=A×B+C的運(yùn)算,其中A,B,C,D是4×4的矩陣,如圖4所示.
矩陣相乘的輸入A和B是16 b半精度浮點(diǎn)數(shù)(FP16)矩陣,矩陣C和D可能是FP16矩陣或FP32矩陣.該Tensor Core支持16 b和32 b的混合精度運(yùn)算.FP16的乘法得到了一個(gè)全精度結(jié)果,該結(jié)果和上一周期得到部分和進(jìn)行累加,如圖5所示.
Fig. 4 4×4×4 matrix multiplication and accumulation of the Tensor Core圖4 Tensor Core的4×4×4矩陣乘法與累加
Fig. 5 Flow chart of the Tensor Core圖5 Tensor Core流程圖
數(shù)字信號(hào)處理(DSP)芯片能夠提供強(qiáng)大的數(shù)字信號(hào)處理能力,它也是一種實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)加速的有效平臺(tái).四大DSP IP產(chǎn)商也都發(fā)布了支持神經(jīng)網(wǎng)絡(luò)的DSP IP,包括Synopsys的EV6x(embedded vision)處理器[38]、CEVA的CEVA-XM6[39]、VeriSilicon的VIP8000[40]以及Cadence的Vision C5 DSP[41].
Fig. 6 The structure of EV6x圖6 EV6x結(jié)構(gòu)圖
EV6x在硬件結(jié)構(gòu)上實(shí)現(xiàn)了對(duì)CNN的加速.為了增加對(duì)神經(jīng)網(wǎng)絡(luò)卷積運(yùn)算的支持,從圖6可以看出在EV6x的設(shè)計(jì)中引入了1個(gè)CNN Engine.CNN Engine是一個(gè)可編程嵌入式深層神經(jīng)網(wǎng)絡(luò)引擎,它支持當(dāng)前所有主流神經(jīng)網(wǎng)絡(luò)模型(包括AlexNet,GoogleNet,ResNet,VGG,Yolo,F(xiàn)aster R-CNN,SqueezeNet).CNN引擎的可配置性使不同的網(wǎng)絡(luò)模型可以靈活地映射到硬件資源.它能提供每周期800MAC(multiply-and-accumulate)(一般將1次MAC看作2個(gè)操作:1個(gè)乘法和1個(gè)加法)性能,與同類(lèi)解決方案相比,性能提高了6倍.此外,神經(jīng)網(wǎng)絡(luò)還經(jīng)常涉及到稀疏矩陣的處理,有效數(shù)據(jù)并沒(méi)有連續(xù)存儲(chǔ),因此在EV6x的4個(gè)視覺(jué)CPU中提供了“分散-收集”(scatter-gather)功能,scatter-gather是將不規(guī)則存放的數(shù)據(jù)一次取出,再組合成一個(gè)向量以便它們能夠被VPU并行處理.
CEVE-XM6針對(duì)神經(jīng)網(wǎng)絡(luò)處理做了2點(diǎn)優(yōu)化:1)為了優(yōu)化對(duì)神經(jīng)網(wǎng)絡(luò)中稀疏矩陣的處理,針對(duì)不規(guī)則訪存增加了并行Scatter-Gather內(nèi)存裝載機(jī)制;2)采用了類(lèi)似EV6x設(shè)計(jì)中DSP加硬件加速器的結(jié)構(gòu).為了利用圖像卷積處理時(shí)卷積核滑過(guò)輸入特征圖時(shí)出現(xiàn)的數(shù)據(jù)重疊,加速器中采用了滑動(dòng)窗口2.0(sliding windows 2.0)機(jī)制,這有助于在更廣泛的神經(jīng)網(wǎng)絡(luò)中實(shí)現(xiàn)更高的利用率.
VIP8000由高度多線程的并行處理單元、神經(jīng)網(wǎng)絡(luò)單元和通用存儲(chǔ)緩存單元組成.它具有可靈活配置的特點(diǎn),可以導(dǎo)入由Caffe和TensorFlow等主流深度學(xué)習(xí)框架生成的神經(jīng)網(wǎng)絡(luò).它的并行處理單元、神經(jīng)網(wǎng)絡(luò)單元和通用存儲(chǔ)單元都具有可擴(kuò)展性.為了實(shí)現(xiàn)最佳計(jì)算效率和準(zhǔn)確率,神經(jīng)網(wǎng)絡(luò)單元支持定點(diǎn)8 b精度和16 b浮點(diǎn)精度,并支持混合模式應(yīng)用.VIP8000最終能取得每秒3 TMAC的性能.
最后,Cadence的Vision C5 DSP為了實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)所有層的計(jì)算(卷積層、池化層、全連接層),而不僅僅是卷積層的加速.它將圖像處理運(yùn)算單元和神經(jīng)網(wǎng)絡(luò)加速單元合二為一.通過(guò)移除神經(jīng)網(wǎng)絡(luò)加速器和主視覺(jué)/圖像DSP之間的冗余數(shù)據(jù)傳輸,Vision C5 DSP的功耗遠(yuǎn)低于現(xiàn)有的神經(jīng)網(wǎng)絡(luò)加速器.為了支持低精度運(yùn)算提高計(jì)算效率,它大量增加了低精度乘累加(MAC)單元的數(shù)量,有1 024個(gè)8 b MAC單元(512個(gè)16 b MAC單元).另外為了適應(yīng)快速變換的神經(jīng)網(wǎng)絡(luò)領(lǐng)域,可編程的設(shè)計(jì)也是必不可少的.
通過(guò)比較以上4個(gè)DSP IP的設(shè)計(jì),不難發(fā)現(xiàn)設(shè)計(jì)DSP IP實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)硬件加速的一些共同點(diǎn):1)都支持低精度的向量運(yùn)算;2)具有可編程可擴(kuò)展的特點(diǎn);3)支持當(dāng)前所有的主流神經(jīng)網(wǎng)絡(luò)框架.
現(xiàn)場(chǎng)可編程門(mén)陣列(field programmable gate array,F(xiàn)PGA)也常被用作神經(jīng)網(wǎng)絡(luò)的加速平臺(tái),這類(lèi)加速器利用可編程門(mén)陣列的特性,設(shè)計(jì)新的硬件結(jié)構(gòu),更好地匹配了神經(jīng)網(wǎng)絡(luò)的計(jì)算特點(diǎn).與CPU和GPU相比,它節(jié)省了部分通用功能所占芯片面積,更加高效地利用了硬件資源,性能更高并且能效也更高;與ASIC(application specific integrated circuit)相比,F(xiàn)PGA能夠?qū)崿F(xiàn)快速的硬件功能驗(yàn)證和評(píng)估,從而加快設(shè)計(jì)的迭代速度.
具體來(lái)說(shuō),F(xiàn)PGA針對(duì)神經(jīng)網(wǎng)絡(luò)的優(yōu)化主要包括2個(gè)方面:1)從計(jì)算結(jié)構(gòu)的角度出發(fā);2)從算法的角度出發(fā).計(jì)算結(jié)構(gòu)上的優(yōu)化盡量使神經(jīng)網(wǎng)絡(luò)計(jì)算并行化和流水化,并且利用FPGA可編程的特性來(lái)設(shè)計(jì)滿足加速器的靈活性和可擴(kuò)展性;算法上的優(yōu)化主要針對(duì)卷積層,利用FPGA的可編程性硬件實(shí)現(xiàn)各類(lèi)卷積方法.下面通過(guò)幾個(gè)例子介紹這些優(yōu)化方法是如何實(shí)現(xiàn)的.
早在2002年Yun等人[42]就在FPGA上實(shí)現(xiàn)了多層感知機(jī),他們提出了一種硬件實(shí)現(xiàn)數(shù)字神經(jīng)網(wǎng)絡(luò)的新體系結(jié)構(gòu)——ERNA.在傳統(tǒng)SIMD(single instruction multiple data)結(jié)構(gòu)的基礎(chǔ)上,采用靈活的階梯式總線和內(nèi)部連接網(wǎng)絡(luò).所提出的架構(gòu)實(shí)現(xiàn)了基于并行化和流水線化的快速處理,同時(shí)不放棄傳統(tǒng)方法的靈活性和可擴(kuò)展性.此外,用戶還可以通過(guò)設(shè)置配置寄存器來(lái)改變網(wǎng)絡(luò)拓?fù)?
2011年Farabet等人[43]提出了基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)處理器——NeuFlow.它是一種運(yùn)行時(shí)可重構(gòu)的數(shù)據(jù)流處理器,包含多個(gè)計(jì)算瓦片.在計(jì)算瓦片中,集成了多個(gè)1D卷積器(乘累加單元MAC),形成1個(gè)2D卷積算子.輸入輸出塊通過(guò)級(jí)聯(lián)卷積器和其他具有可編程性的操作元件形成,然后再經(jīng)過(guò)路由多路復(fù)用器連接到全局總線.
在FPGA2017會(huì)議上,張弛等人[44]提出了一種在CPU-FPGA共享內(nèi)存系統(tǒng)上對(duì)卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行頻域加速的方法.首先,利用快速傅里葉變換(FFT)和重疊加法(overlap-and-add, OaA)來(lái)減少卷積層的計(jì)算量.具體做法是將頻域算法映射到FPGA上高度并行的基于OaA的2D卷積器上.然后在共享內(nèi)存器中提出了一種新穎的數(shù)據(jù)布局,用于CPU和FPGA之間高效的數(shù)據(jù)通信.為了減少內(nèi)存訪問(wèn)延遲并保持FPGA的峰值性能,該設(shè)計(jì)采用了雙緩沖.為了減少層間數(shù)據(jù)重映射延遲,該設(shè)計(jì)利用了CPU和FPGA進(jìn)行并發(fā)處理.通過(guò)使用OaA,CNN浮點(diǎn)運(yùn)算次數(shù)可以減少39.14%~54.10%.
總的來(lái)說(shuō),由于FPGA可編程性強(qiáng),作為加速器研發(fā)周期短,在它上面實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)加速的研究越來(lái)越多.但目前的深度神經(jīng)網(wǎng)絡(luò)(DNN)計(jì)算還是重度依賴密集的浮點(diǎn)矩陣乘法(GEMM),拋開(kāi)獨(dú)特的數(shù)據(jù)類(lèi)型(利用稀疏壓縮后的數(shù)據(jù)類(lèi)型)設(shè)計(jì),它更利于映射到GPU上(常規(guī)并行性).因此市場(chǎng)上依然是GPU被廣泛地用于加速DNN.FPGA雖然提供了卓越的能耗效率,但它并不能達(dá)到當(dāng)今GPU的性能.但是考慮到FPGA的技術(shù)進(jìn)展以及DNN的算法創(chuàng)新速度,未來(lái)的高性能FPGA在處理DNN方面可能會(huì)優(yōu)于GPU的性能.例如英特爾即將推出的14 nm的Stratix,10個(gè)FPGA將會(huì)具有數(shù)千個(gè)DSP和片上RAM.還將具有高帶寬存儲(chǔ)器HBM(一種3D存儲(chǔ)技術(shù)).這種功能組合就提供了FPGA與GPU相差不多的浮點(diǎn)計(jì)算性能.再加上現(xiàn)在的DNN算法里開(kāi)始利用稀疏(剪枝等產(chǎn)生)和緊湊的數(shù)據(jù)類(lèi)型來(lái)提升算法的效率.這些自定義數(shù)據(jù)類(lèi)型也引入了不規(guī)則的并行性,這對(duì)于GPU來(lái)說(shuō)很難處理,但是利用FPGA的可定制性就能非常高效地解決.例如清華大學(xué)汪玉團(tuán)隊(duì)就在FPGA上優(yōu)化了對(duì)神經(jīng)網(wǎng)絡(luò)稀疏性的處理.
以上4種通用硬件加速平臺(tái)由于在優(yōu)化神經(jīng)網(wǎng)絡(luò)處理的同時(shí)還要考慮其對(duì)通用計(jì)算的支持,因此并不能完全利用所有計(jì)算資源來(lái)完成神經(jīng)網(wǎng)絡(luò)的加速.此時(shí),體系結(jié)構(gòu)研究者考慮設(shè)計(jì)一種專用芯片來(lái)完成這一加速工作.
當(dāng)前存在許多關(guān)于神經(jīng)網(wǎng)絡(luò)加速器的研究,本節(jié)從運(yùn)算存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)流調(diào)度優(yōu)化的角度對(duì)現(xiàn)有專用人工神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)進(jìn)行分析梳理.
現(xiàn)有加速器大都采用基于CMOS(complementary metal oxide semiconductor)工藝的馮·諾依曼體系結(jié)構(gòu),這類(lèi)加速器設(shè)計(jì)注重2個(gè)的模塊:運(yùn)算單元和存儲(chǔ)單元.運(yùn)算單元的實(shí)現(xiàn)分為2種:樹(shù)狀結(jié)構(gòu)和陣列結(jié)構(gòu).存儲(chǔ)單元的設(shè)計(jì)用來(lái)存儲(chǔ)神經(jīng)網(wǎng)絡(luò)每一層的輸入值、權(quán)重和輸出值等參數(shù).如何平衡片上片外的數(shù)據(jù)分配,最小化數(shù)據(jù)的搬移是它設(shè)計(jì)的重點(diǎn).值得注意的是,隨著器件工藝的發(fā)展,一些體系結(jié)構(gòu)研究者開(kāi)始采用憶阻器等新器件來(lái)設(shè)計(jì)處理存儲(chǔ)一體化的加速器.這類(lèi)加速器有效地解決了帶寬的瓶頸,具有功耗低速度快的特點(diǎn).另外,專用指令集也是體系結(jié)構(gòu)設(shè)計(jì)的一大重點(diǎn).下面分別介紹這幾個(gè)方面.
3.1.1 CMOS工藝下的運(yùn)算單元結(jié)構(gòu)
運(yùn)算單元是加速器設(shè)計(jì)的重點(diǎn),根據(jù)神經(jīng)網(wǎng)絡(luò)的計(jì)算特點(diǎn),本文總結(jié)了2種運(yùn)算單元的實(shí)現(xiàn)結(jié)構(gòu):1)樹(shù)狀結(jié)構(gòu),通過(guò)對(duì)神經(jīng)元計(jì)算過(guò)程的抽象得到;2)PE陣列結(jié)構(gòu),利用神經(jīng)網(wǎng)絡(luò)每一層有大量乘累加并行計(jì)算的特點(diǎn),將乘累加操作放入1個(gè)PE里,這樣可以通過(guò)PE陣列實(shí)現(xiàn)神經(jīng)元的并行處理.具體設(shè)計(jì)方案如下.
圖7給出了樹(shù)狀結(jié)構(gòu)圖.方框內(nèi)是一個(gè)簡(jiǎn)易的神經(jīng)元計(jì)算單元NFU,最右端的根節(jié)點(diǎn)是每個(gè)神經(jīng)元的輸出,子節(jié)點(diǎn)包括乘法器、加法器和非線性激活函數(shù),葉子節(jié)點(diǎn)是神經(jīng)元的輸入.特別地,圖7中第2層的結(jié)果有的并沒(méi)有經(jīng)過(guò)NFU-3的函數(shù)激活,而是直接輸出(圖7中虛線部分),這是因?yàn)樯窠?jīng)網(wǎng)絡(luò)中有的層并沒(méi)有激活操作,典型的如池化層.采用這種樹(shù)狀結(jié)構(gòu)的設(shè)計(jì)有DianNao[6],DaDianNao[5].兩者都采用了NFU作為加速器的基本處理單元,不同的是DaDianNao有更好的擴(kuò)展性,可以高性能地支持大尺寸網(wǎng)絡(luò)模型.不過(guò)從NFU的結(jié)構(gòu)可以看出DianNao和DaDianNao僅能很好地支持神經(jīng)網(wǎng)絡(luò)的計(jì)算(NFU只有乘累加運(yùn)算單元).為了運(yùn)行更多的機(jī)器學(xué)習(xí)算法,PuDianNao[7]設(shè)計(jì)了新的計(jì)算單元(machine learning unit, MLU),它的子節(jié)點(diǎn)包括計(jì)數(shù)器、加法器、乘法器、加法樹(shù)、累加器(accumulator)和雜項(xiàng)作業(yè)(miscellaneous, Misc).支持了更多的機(jī)器學(xué)習(xí)算法,如k-均值、k-最近鄰、樸素貝葉斯、支持向量機(jī)、線性回歸、神經(jīng)網(wǎng)絡(luò)、決策樹(shù)等.PuDianNao運(yùn)行上述機(jī)器學(xué)習(xí)算法時(shí)的平均性能與主流通用圖形處理器相當(dāng),但面積和功耗僅為后者的百分之一量級(jí).
Fig. 7 A typical tree structure of NFU圖7 一個(gè)典型樹(shù)狀結(jié)構(gòu)的NFU
Fig. 8 Systolic data flow of the matrix multiply unit in TPU圖8 TPU矩陣運(yùn)算單元的脈動(dòng)數(shù)據(jù)流
陣列結(jié)構(gòu)主要以Google TPU[9]的脈動(dòng)陣列結(jié)構(gòu)為代表.TETRIS[45],Eyeriss[12],ShiDianNao[8],Scaledeep[11]所采用的處理結(jié)構(gòu)都在脈動(dòng)陣列上進(jìn)行或多或少的改動(dòng).脈動(dòng)陣列的設(shè)計(jì)核心是讓數(shù)據(jù)在運(yùn)算單元的陣列中進(jìn)行流動(dòng),增加數(shù)據(jù)的復(fù)用,減少訪存的次數(shù).圖8展示了TPU中矩陣乘法單元的脈動(dòng)數(shù)據(jù)流.權(quán)重由上向下流動(dòng),輸入特征圖的數(shù)據(jù)從左向右流動(dòng).在最下方有一些累加單元,主要用于權(quán)重矩陣或者輸入特征圖超出矩陣運(yùn)算單元范圍時(shí)保存部分結(jié)果.控制單元負(fù)責(zé)數(shù)據(jù)的組織,具體來(lái)說(shuō)就是控制權(quán)重和輸入特征圖的數(shù)據(jù)如何傳入脈動(dòng)陣列以及如何在脈動(dòng)陣列中進(jìn)行處理和流動(dòng).
3.1.2 CMOS工藝下的存儲(chǔ)結(jié)構(gòu)
因?yàn)閿?shù)據(jù)存取的速度大大低于數(shù)據(jù)處理的速度,因此存儲(chǔ)單元的設(shè)計(jì)直接影響到加速器的性能.英偉達(dá)公司首席科學(xué)家Steve[46]曾指出,在40 nm工藝下,將64 b數(shù)據(jù)搬運(yùn)20 mm的能耗是做64 b浮點(diǎn)乘法的數(shù)倍.因此,要降低處理器功耗,僅僅優(yōu)化處理結(jié)構(gòu)是不夠的,必須對(duì)片上存儲(chǔ)單元的結(jié)構(gòu)也進(jìn)行優(yōu)化.傳統(tǒng)的存儲(chǔ)單元設(shè)計(jì)是將不同數(shù)據(jù)放在同一個(gè)存儲(chǔ)器里.在DianNao里提出了一種存儲(chǔ)方式(圖7),對(duì)神經(jīng)網(wǎng)絡(luò)參數(shù)進(jìn)行分塊存儲(chǔ)(用于存放輸入神經(jīng)元的輸入緩沖器NBin、存放輸出神經(jīng)元的輸出緩沖器NBout、存放突觸權(quán)重的緩沖器SB),將不同類(lèi)型的數(shù)據(jù)塊存放在片上不同的隨機(jī)存儲(chǔ)器中,再優(yōu)化神經(jīng)網(wǎng)絡(luò)運(yùn)算過(guò)程中對(duì)不同類(lèi)型數(shù)據(jù)的調(diào)度策略.與CPUGPU上基于緩存層次的數(shù)據(jù)搬運(yùn)方法相比,DianNao的設(shè)計(jì)方案可將數(shù)據(jù)搬運(yùn)次數(shù)減少至前者的130~110.DaDianNao也延續(xù)了這種存儲(chǔ)結(jié)構(gòu)設(shè)計(jì),同時(shí)DaDianNao使用了eDRAM來(lái)存放所有的權(quán)重值并將其放在計(jì)算部件附近以減少訪存延時(shí).
另外,隨著神經(jīng)網(wǎng)絡(luò)規(guī)模越來(lái)越大,訓(xùn)練集越來(lái)越大,處理能力也越來(lái)越強(qiáng),對(duì)帶寬的要求就變得越來(lái)越高.傳統(tǒng)2D存儲(chǔ)結(jié)構(gòu)的DDR技術(shù)不能提供如此高的帶寬.人們開(kāi)始將3D存儲(chǔ)技術(shù)引入到神經(jīng)網(wǎng)絡(luò)加速器的設(shè)計(jì)中.現(xiàn)在3D存儲(chǔ)方案有AMD和海力士研發(fā)的HBM以及Intel和美光研發(fā)的HMC.Google的Cloud TPU[9]采用了HBM作為存儲(chǔ)結(jié)構(gòu).Neurocube[47]和TETRIS[45]采用了HMC作為加速器的存儲(chǔ)結(jié)構(gòu).另外,3D存儲(chǔ)的出現(xiàn)使人們開(kāi)始考慮將累加器設(shè)計(jì)到3D存儲(chǔ)體里.這樣做可以減少1次數(shù)據(jù)的讀取,從而降低延遲,節(jié)省功耗,提高性能.TETRIS給出了4種在HMC中設(shè)計(jì)累加器的方案,分別是內(nèi)存控制器級(jí)累加、DRAM芯片級(jí)累加、Bank級(jí)累加和子陣列級(jí)累加.第1種方案是將累加器做在HMC的邏輯層,這樣設(shè)計(jì)并不能減少數(shù)據(jù)的讀寫(xiě)次數(shù).后3種設(shè)計(jì)能帶來(lái)性能提升,但子陣列級(jí)累加實(shí)現(xiàn)困難,所以主要還是采用DRAM級(jí)累加和Bank級(jí)累加.
3.1.3 新工藝下的一體化結(jié)構(gòu)
運(yùn)算存儲(chǔ)一體化結(jié)構(gòu)的加速器打破了馮·諾依曼體系結(jié)構(gòu)的束縛,要想實(shí)現(xiàn)這類(lèi)加速器依靠傳統(tǒng)CMOS工藝較為困難,新型器件的研究和非傳統(tǒng)電路的實(shí)現(xiàn)是這類(lèi)加速器的研究方向.最新研究表明憶阻器是實(shí)現(xiàn)一體化結(jié)構(gòu)的一種較好選擇,它本身具有存儲(chǔ)數(shù)據(jù)的功能,另外利用基爾霍夫定律產(chǎn)生的位線電流就是卷積運(yùn)算乘累加的結(jié)果,節(jié)省了乘法和累加的計(jì)算時(shí)間.去年,在憶阻器領(lǐng)域具有領(lǐng)先地位的HP公司與猶他大學(xué)合作研究發(fā)表了基于憶阻器的神經(jīng)網(wǎng)絡(luò)加速器ISAAC[13].它的結(jié)構(gòu)與DaDianNao[5]相似,由多個(gè)Nodes或Tiles組成,憶阻器交叉(crossbar)開(kāi)關(guān)陣列組成了每個(gè)Tile的核心來(lái)完成存儲(chǔ)權(quán)重和卷積計(jì)算的功能.與DaDianNao相比,吞吐量是其14.8倍,功效是其5.5倍,計(jì)算密度是其7.5倍.
目前做神經(jīng)網(wǎng)絡(luò)加速的憶阻器器件主要以ReRAM為主.加州大學(xué)圣塔芭芭拉分校謝源教授課題組也發(fā)布了一種基于ReRAM的神經(jīng)網(wǎng)絡(luò)加速器PRIME[48].基于新型材料的ReRAM被認(rèn)為是今后可以替代當(dāng)前DRAM的下一代存儲(chǔ)技術(shù)之一.作為憶阻器的一種,ReRAM除了是存儲(chǔ)單元之外,其獨(dú)特的交叉網(wǎng)絡(luò)結(jié)構(gòu)(crossbar)和多比特存儲(chǔ)(multi-level cell)性質(zhì),能以很高的能量效率加速神經(jīng)網(wǎng)絡(luò)計(jì)算中的重要計(jì)算模塊——乘累加.實(shí)現(xiàn)方法是通過(guò)在ReRAM存儲(chǔ)體內(nèi)修改一部分外圍電路,使其可以在“存儲(chǔ)”狀態(tài)和“神經(jīng)網(wǎng)絡(luò)加速器”狀態(tài)之間靈活切換.
現(xiàn)階段使用ReRAM之類(lèi)的憶阻器器件來(lái)實(shí)現(xiàn)CNN加速器還有許多挑戰(zhàn),如精確度、內(nèi)部數(shù)據(jù)調(diào)度以及模數(shù)轉(zhuǎn)換等.清華大學(xué)的張悠慧教授等人[49]提出了神經(jīng)網(wǎng)絡(luò)模型轉(zhuǎn)換方法,將原神經(jīng)網(wǎng)絡(luò)稀疏化后劃分成規(guī)模適應(yīng)于ReRAM陣列的子網(wǎng)絡(luò),并對(duì)數(shù)據(jù)進(jìn)行量化來(lái)解決硬件精度受限問(wèn)題,這一定程度上從軟件的角度解決了計(jì)算精度的問(wèn)題.而李楚曦等人[50]提出的基于憶阻器的PIM結(jié)構(gòu)實(shí)現(xiàn)深度卷積神經(jīng)網(wǎng)絡(luò)近似計(jì)算,通過(guò)利用模擬憶阻器大大增加數(shù)據(jù)密度,并將卷積過(guò)程分解到不同形式的憶阻器陣列中分別計(jì)算,增加了數(shù)據(jù)并行性,減少了數(shù)據(jù)轉(zhuǎn)換次數(shù)并消除了中間存儲(chǔ),從而實(shí)現(xiàn)了加速和節(jié)能.但是目前實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)大多還是采用存儲(chǔ)分離的結(jié)構(gòu),不過(guò)隨著憶阻器技術(shù)的不斷成熟,由于其低功耗和快速處理數(shù)據(jù)的特點(diǎn),新工藝下的一體化結(jié)構(gòu)終將會(huì)是加速器發(fā)展的一大趨勢(shì).
3.1.4 指令集設(shè)計(jì)
與基于RISC指令集的通用處理器不同,專用芯片多采用基于CISC來(lái)設(shè)計(jì)自己指令集.這類(lèi)指令集側(cè)重于完成更復(fù)雜的任務(wù),適用于指令數(shù)量少和復(fù)雜程度高的神經(jīng)網(wǎng)絡(luò).傳統(tǒng)指令集實(shí)現(xiàn)一個(gè)神經(jīng)元的操作需要上百條指令,如果使用專有指令集一個(gè)神經(jīng)元的操作可以只用一條指令執(zhí)行,減少功耗的同時(shí)提升了速度.TPU的指令集就是CISC類(lèi)型,平均每個(gè)指令的時(shí)鐘周期數(shù)是10~20.指令總共只有十幾條.其中比較重要的包括讀權(quán)重值和讀輸入特征圖數(shù)據(jù)、矩陣運(yùn)算卷積、激活和寫(xiě)回計(jì)算結(jié)果等一系列神經(jīng)網(wǎng)絡(luò)運(yùn)算相關(guān)的指令.
不過(guò)另一方面.越來(lái)越多研究者指出指令集的設(shè)計(jì)除了專用性外,還需要足夠的靈活來(lái)滿足加速器處理不同的神經(jīng)網(wǎng)絡(luò)的效率.為了解決這個(gè)問(wèn)題,中科院陳天石團(tuán)隊(duì)[51]基于RISC設(shè)計(jì)了一種新的用于神經(jīng)網(wǎng)絡(luò)加速器領(lǐng)域的專用指令集架構(gòu),稱為Cambricon,它是一種集標(biāo)量、向量、邏輯、數(shù)據(jù)傳輸和控制指令于一體的存取架構(gòu).Cambricon在廣泛的神經(jīng)網(wǎng)絡(luò)技術(shù)上表現(xiàn)出強(qiáng)大的描述能力,并且比通用指令集架構(gòu)(X86,MIPS,GPGPU)提供更高的代碼密度.
3.1節(jié)介紹了專用芯片在體系結(jié)構(gòu)方面對(duì)神經(jīng)網(wǎng)絡(luò)所作的支持,但是在神經(jīng)網(wǎng)絡(luò)處理過(guò)程中數(shù)據(jù)流的組織和調(diào)度的方式以及數(shù)據(jù)流的優(yōu)化對(duì)硬件實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的性能影響同樣很大.在神經(jīng)網(wǎng)絡(luò)中常用的數(shù)據(jù)流有權(quán)重固定流、輸出固定流、無(wú)局部復(fù)用和行固定流,常用的數(shù)據(jù)流優(yōu)化處理手段有0值跳過(guò)、稀疏矩陣、參數(shù)壓縮等.
3.2.1 數(shù)據(jù)流的調(diào)度
1) 權(quán)重固定流
在卷積神經(jīng)網(wǎng)絡(luò)的卷積操作過(guò)程中,同一個(gè)卷積核會(huì)卷積多個(gè)輸入特征圖.此時(shí)對(duì)這個(gè)卷積核里的權(quán)重是有復(fù)用的.如果把多次使用的權(quán)重存在每個(gè)PE的寄存器里,那么卷積層的計(jì)算過(guò)程將會(huì)減少?gòu)娜志彌_取數(shù)據(jù)和向全局緩沖存數(shù)據(jù)的開(kāi)銷(xiāo).由于部分和(partial sum, Psum)還會(huì)用到,因此將它暫時(shí)存放在全局緩沖里,如果緩沖區(qū)不大就必須限制同時(shí)產(chǎn)生Psum的數(shù)量,這樣也限制了一次性可以在片上加載的權(quán)重.此時(shí)若采用脈沖的方式將會(huì)有效減少Psum對(duì)全局緩沖大小的依賴,圖9(a)給出了這種數(shù)據(jù)流的處理過(guò)程.權(quán)重值存放在PE里,輸入激活值被廣播到所有PE單元.部分和在每個(gè)PE累加過(guò)后傳到下一個(gè)PE.
Fig. 9 Dataflow of the neural network圖9 神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)流
采用這種數(shù)據(jù)流的芯片設(shè)計(jì)有NneuFlow[43],它用了2D卷積引擎來(lái)處理卷積核.每個(gè)引擎處理過(guò)程中權(quán)重值保持不變.其他采用這種數(shù)據(jù)流的例子還有[52-54].
2) 輸出固定流
指在寄存器中存放每個(gè)周期計(jì)算的部分和.卷積操作是一個(gè)乘累加操作,每個(gè)周期計(jì)算的部分和需要與下一個(gè)周期的部分和相加得到新的部分和,直到這個(gè)卷積核的計(jì)算完全結(jié)束.把部分和存在寄存器里同樣也是減少了從全局緩沖取數(shù)據(jù)和向全局緩沖存數(shù)據(jù)的開(kāi)銷(xiāo).同樣這種數(shù)據(jù)流設(shè)計(jì)采用脈沖結(jié)構(gòu)實(shí)現(xiàn)是最佳的.圖9(b)給出了這種數(shù)據(jù)流的處理過(guò)程.部分和在PE內(nèi)部累積最后流出到全局緩沖區(qū),權(quán)重值被廣播到所有PE.輸入激活值在PE進(jìn)行乘法運(yùn)算后傳給下一個(gè)PE.
采用這種數(shù)據(jù)流的芯片設(shè)計(jì)有ShiDianNao[8].它的每個(gè)PE通過(guò)從相鄰PE獲取相應(yīng)的輸入激活來(lái)處理每個(gè)輸出激活值.PE陣列通過(guò)實(shí)現(xiàn)專用網(wǎng)絡(luò)來(lái)水平和垂直地傳遞數(shù)據(jù).每個(gè)PE還具有數(shù)據(jù)延遲寄存器,以便在所需的循環(huán)周期內(nèi)保持?jǐn)?shù)據(jù)周期.全局緩沖區(qū)流入輸入激活值,并將權(quán)重廣播到PE陣列中.部分和積累在每個(gè)PE內(nèi)部,然后被流出回到全局緩沖區(qū).其他采用這種數(shù)據(jù)流的例子還有[55-56].
3) 無(wú)局部復(fù)用
指不在PE的寄存器文件里存放權(quán)重和部分和,每個(gè)周期需要計(jì)算的數(shù)據(jù)都從全局緩沖獲取,計(jì)算完后將結(jié)果傳回全局緩沖,最后通過(guò)PE陣列累積部分和.這樣的好處是減少了PE所占的面積,但是由于PE沒(méi)有數(shù)據(jù)保持固定,所以這樣的設(shè)計(jì)也增加了全局緩沖區(qū)和空間PE陣列的流量.圖9(c)給出了這類(lèi)數(shù)據(jù)流的處理過(guò)程.
采用這種數(shù)據(jù)流的芯片設(shè)計(jì)有UCLA[57],Dian-Nao[6],DaDianNao[5],PuDianNao[7].其中DianNao系列由于采用了專門(mén)的寄存器來(lái)保存部分和,并不用從內(nèi)存里取,因此可以進(jìn)一步降低訪問(wèn)部分和的功耗.
4) 行固定流
指在高維卷積過(guò)程中通過(guò)將高維卷積分解成可以并行運(yùn)行的1D卷積原語(yǔ);每個(gè)基元(原語(yǔ)操作)表示1行卷積核權(quán)重和1行輸入特征圖像素的點(diǎn)積,并生成1行部分和Psum.不同原語(yǔ)的Psum被進(jìn)一步累積在一起以生成輸出特征圖.具體做法是將每個(gè)原語(yǔ)映射到1個(gè)PE進(jìn)行處理,每個(gè)行對(duì)的計(jì)算在PE中保持獨(dú)立,這就實(shí)現(xiàn)了卷積核和寄存器級(jí)別的輸入特征圖數(shù)據(jù)重用.圖10給出了這類(lèi)數(shù)據(jù)流的處理過(guò)程.
Fig. 10 The row stationary dataflow in PEs set to process a 2D convolution圖10 處理2維卷積時(shí)的PE陣列中的行固定流示意圖
采用這種數(shù)據(jù)流的芯片設(shè)計(jì)有Eyeriss[12]和TETRIS[45].
5) 其他數(shù)據(jù)流
上述數(shù)據(jù)流都沒(méi)有將權(quán)重值和輸入激活值(上一層輸出經(jīng)過(guò)激活函數(shù)得到的值)完全復(fù)用.在SCNN[14]中提出了一種全新的數(shù)據(jù)流,笛卡兒數(shù)據(jù)流.實(shí)現(xiàn)方法是將需要計(jì)算的權(quán)重和輸入激活值做成2個(gè)向量,然后2個(gè)向量做笛卡兒積,這樣向量中每個(gè)數(shù)能達(dá)到最大復(fù)用.
3.2.2 數(shù)據(jù)流的優(yōu)化
神經(jīng)網(wǎng)絡(luò)在數(shù)據(jù)的處理過(guò)程中還存在很多的優(yōu)化技巧.首先,神經(jīng)網(wǎng)絡(luò)在推導(dǎo)過(guò)程中的對(duì)精度要求不高,這使幾乎全部的神經(jīng)網(wǎng)絡(luò)專用加速器都支持低精度運(yùn)算,其中TPU[9]更是支持了8 b低精度運(yùn)算.其次,稀疏性.人們?cè)谏窠?jīng)網(wǎng)絡(luò)訓(xùn)練和推導(dǎo)過(guò)程中發(fā)現(xiàn)會(huì)產(chǎn)生許多的0值,一部分來(lái)源于網(wǎng)絡(luò)訓(xùn)練階段的剪枝,另外一部分來(lái)源于推導(dǎo)階段采用ReLU激活函數(shù)參數(shù)的0激活值.而0值在卷積操作中是可以跳過(guò)的,因?yàn)榫矸e操作由多個(gè)乘累加操作組成,乘數(shù)有一個(gè)為0則乘法和后面的加法就沒(méi)必要計(jì)算.在Cnvlutin[58]就采用了跳過(guò)權(quán)重中0值的數(shù)據(jù)流,在Cambricon-X[59]里則采用了跳過(guò)輸入的0激活值,而在SCNN里通過(guò)壓縮稀疏性和將非0參數(shù)編碼的方式同時(shí)做到了跳過(guò)0值權(quán)重和0激活值.這也引出了神經(jīng)網(wǎng)絡(luò)的另一種優(yōu)化方法——壓縮.在SCNN[14]和EIE[60]中都采用了壓縮參數(shù)的方法.
雖說(shuō)壓縮稀疏權(quán)重從計(jì)算量的角度來(lái)看能夠直接提高性能,但最近的研究表明在不損失精度的情況下直接通過(guò)權(quán)重剪枝卻會(huì)造成性能的下降[56],這是由于解碼壓縮的權(quán)重需要額外的時(shí)間,并且壓縮的非0權(quán)重值需要額外的索引值來(lái)記錄它們?cè)瓉?lái)矩陣的位置,這也增加了存儲(chǔ)開(kāi)銷(xiāo).最終的結(jié)果導(dǎo)致只有在大量剪枝的情況下,剪枝后的新網(wǎng)絡(luò)的性能才會(huì)優(yōu)于剪枝前的網(wǎng)絡(luò),而且會(huì)有精度的損失.在文獻(xiàn)[61]中提出了2種解決辦法分別針對(duì)并行性不同的2種硬件:1)采用基于SIMD的權(quán)重剪枝用于低并行度的硬件,實(shí)現(xiàn)方法是采用權(quán)重分組索引,這樣一條SIMD指令可以讀取多個(gè)權(quán)重值;2)使用節(jié)點(diǎn)剪枝用于高并行的硬件,具體實(shí)現(xiàn)思想是利用正則化既不完全去掉參數(shù)又可以將它的影響降到最小.
第2節(jié)和3節(jié)論述了許多硬件加速神經(jīng)網(wǎng)絡(luò)的方案,其中在通用芯片平臺(tái)實(shí)現(xiàn)的包括支持低精度計(jì)算、支持更多的神經(jīng)網(wǎng)絡(luò)框架以及設(shè)計(jì)一個(gè)加速卷積運(yùn)算的模塊;在專用芯片平臺(tái)實(shí)現(xiàn)的包括改進(jìn)運(yùn)算存儲(chǔ)結(jié)構(gòu)、優(yōu)化數(shù)據(jù)流和設(shè)計(jì)專用指令集.雖然這些設(shè)計(jì)已經(jīng)在神經(jīng)網(wǎng)絡(luò)加速方面取得了重大進(jìn)展.但還是有許多問(wèn)題和挑戰(zhàn)要解決.下面列舉的4個(gè)方面或許會(huì)是加速器未來(lái)研究的可行方向.
1) 設(shè)計(jì)功耗更低的加速器.嵌入式應(yīng)用是加速器應(yīng)用的一種趨勢(shì),加速器未來(lái)可能會(huì)應(yīng)用到像可穿戴這樣的領(lǐng)域,這就需要把功耗進(jìn)一步降低,可突破的方向包括采用新器件,進(jìn)一步探索數(shù)據(jù)的組織形式以減少數(shù)據(jù)的移動(dòng)等.
2) 設(shè)計(jì)通用性更強(qiáng)的加速器.隨著神經(jīng)網(wǎng)絡(luò)應(yīng)用的增多,神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和框架也會(huì)越來(lái)越多.未來(lái)加速器設(shè)計(jì)需要考慮到支持各個(gè)框架的核心算法.
3) 解決訪存瓶頸.存取速度跟不上運(yùn)算速度依舊是加速器設(shè)計(jì)的難題.目前3D存儲(chǔ)是解決該問(wèn)題的一個(gè)方向.不過(guò)隨著新工藝的發(fā)展,采用新器件的非馮·諾依曼體系結(jié)構(gòu)或許能進(jìn)一步改善這個(gè)問(wèn)題.
4) 應(yīng)用其他領(lǐng)域的突破成果.技術(shù)革命通常伴隨著不同領(lǐng)域的飛躍,采用基于生物啟發(fā)的脈沖神經(jīng)網(wǎng)絡(luò)、量子計(jì)算機(jī)以及使用憶阻器等新器件都可能是加速器未來(lái)設(shè)計(jì)的可行方案.