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