?

硬件加速神經網絡綜述

2019-02-20 08:33陳桂林
計算機研究與發展 2019年2期
關鍵詞:加速器數據流神經元

陳桂林 馬 勝 郭 陽

(國防科技大學計算機學院 長沙 410073)

隨著數據的爆炸式增長和計算性能的階躍式提升,機器學習的研究在經歷20世紀由計算瓶頸引起的寒潮后重新變得火熱起來.機器學習算法已廣泛地運用到許多智能應用和云服務之中.常見應用有語音識別如蘋果Siri和微軟小娜,面部識別如Apple iPhoto或Google Picasa,同時智能機器人也大量使用了機器學習算法.目前,機器學習領域最火熱的是以神經網絡為代表的深度學習.據統計,深度神經網絡運用在語音識別上比傳統方法要減少了30%的單詞識別錯誤率[1],將圖像識別競賽的錯誤率從2011年的26%降至3.5%[2-4].此外它還被廣泛地應用到數據挖掘中.但由于神經網絡的應用范圍越來越廣,精度要求越來越高,導致神經網絡的規模也越來越大.通常對大規模神經網絡加速的方法是設計性能更強大的通用芯片,并且增加專門的神經網絡處理模塊,如英特爾的Knight Mill和英偉達最新的Volte架構都添加了對神經網絡的加速模塊.不過它們作為通用運算器件始終限制了它們完成特殊任務時的效率,比如CPU必須包含高速緩存、分支預測、批處理、地址合并、多線程、上下文切換等多種通用功能,這些功能并不會完全用于神經網絡的加速,但它們會占用芯片的設計面積.這就導致神經網絡加速時硬件資源并沒有完全利用.所以人們也開始設計專用芯片來實現對大型神經網絡的加速.

近年來各大科研機構紛紛提出了各自的加速器結構,如中國科學院陳天石團隊[5-8]的Diannao家族、Google的TPU[9](tensor process unit)和cloud TPU[10]、普度大學推出的Scaledeep[11]、MIT(Massa-chusetts Institute of Technology)提出的Eyeriss[12]、HP實驗室和猶他大學聯合提出的基于憶阻器的ISAAC[13],以及Parashar等人[14]提出的壓縮稀疏卷積神經網絡加速器SCNN等.現有神經網絡加速芯片的研究主要集中在4個方面:1)從神經網絡的計算結構出發,研究了樹狀結構和陣列結構如何高效地完成神經網絡的卷積運算;2)從存儲的瓶頸角度出發,研究了3D存儲技術如何應用到加速器的設計中;3)從新材料器件的探索出發,研究了憶阻器等新器件如何實現神經網絡處理存儲一體化;4)從數據流的調度和優化出發,研究了如何最大化利用網絡中各類數據的局部重用以及稀疏網絡的處理.

1 神經網絡概述

神經網絡分為生物啟發的神經網絡(biologically inspired neural network)和人工神經網絡(artificial neural network)2類.前者由神經生物學家關注,用來建立一種靈感來源于生物學的模型以幫助理解神經網絡和大腦是如何運轉的,比較有代表性的是脈沖神經網絡.IBM的TrueNorth[15]和Furber等人[16-18]提出的SpiNNaker就是這種結構.但由于脈沖神經網絡在處理機器學習任務時精度低的缺點,目前并沒有得到廣泛應用,本文不對其進行過多的贅述.后者人工神經網絡是本文討論的重點.

人工神經網絡是一種典型的機器學習方法,也是深度學習的一種重要形式.1943年McCulloch和Pitts[19]提出了第1個人工神經元模型(M-P神經元如圖1(a)),在這個模型中,神經元接受來自n個其他神經元傳遞過來的信號,這些輸入信號通過帶權重的連接進行傳遞,神經元接受到的總輸入值將與神經元的閾值進行比較,然后通過“激活函數”產生神經元的輸出.常用的激活函數有sigmoid函數、階躍函數、ReLU等非線性函數.為了把人工神經網絡研究從理論探討付諸工程實踐,1958年Rosenblatt[20]設計制作了感知機,如圖1(b).感知機輸入層并不是功能神經元,只接受外界輸入信號后傳遞給輸出層,輸出層是一個M-P功能神經元.一個感知機可以實現邏輯與、或、非等簡單的線性可分問題,但要解決一個復雜的非線性可分問題時,就要用到多層感知機(神經網絡).如圖1(c)的2層感知機可以解決一個異或問題,與單層感知機相比,它包含一個隱含層.當隱含層不斷增加就有了深度神經網絡(deep neural network, DNN)的概念,如圖1(d).這里所謂的深度并沒有嚴格的定義,在語音識別中4層網絡就可以被認為是“較深的”,而在圖像識別中20層以上的網絡比比皆是.不過隨著隱含層數的增加,深度神經網絡有個明顯的問題——參數數量的急劇膨脹.這就導致了計算量的急劇上升,進而使得網絡模型的計算時間增加、計算功耗升高.為了解決這個問題,20世紀60年代,Hubel和Wiesel[21]提出了卷積神經網絡(convolutional neural network, CNN)的概念.卷積神經網絡局部感知和參數共享的特點使它能夠有效地減少參數數量,降低深度神經網絡的復雜性.

Fig. 1 The evolution of neural network圖1 神經網絡的演變過程

Fig. 3 A representative CNN architecture—LeNet5圖3 一個具有代表性的CNN結構——LeNet5

1) 局部感知,指通過對局部信息進行整合到達識別圖像的目的.在傳統的深度神經網絡中,第i層每個神經元都會與第i-1層所有神經元連接,這樣做不僅導致了計算量非常大,而且網絡缺少泛化能力,容易造成過擬合的情況.采用局部感知的方法,在機器進行圖像識別時每個神經元不必對全局圖像進行感知,只需要對局部進行感知,而后在更高層將局部的信息綜合起來就得到了全局的信息.這樣做不僅增強了網絡的泛化能力,還有效減少了計算量.對應到具體操作是指上一層的數據區有一個滑動的窗口,只有窗口內的數據會與下一層神經元有關聯,如圖2所示.

Fig. 2 The process of convolution圖2 卷積的過程

2) 參數共享,即權值共享.對一個特征圖來說,卷積操作就是提取特征的過程,這里簡單介紹卷積核的概念,卷積核就是一個有相關權重的方陣,它的作用是用來提取圖像的特定特征.提取特征和目標在圖像中的位置無關,這也意味著某一部分學習的特征也能用在另一部分上,所以對于這個圖像上的所有位置,都能使用同樣的學習特征.具體來說就是將卷積核的每一個元素作用到輸入特征圖的每一個位置(邊界因素先不考慮).參數共享保證了訓練時對輸入特征圖只需要學習一個參數集合,而不是對每一個位置都需要學習一個單獨的參數集合.

因為局部感知和參數共享這2個特點,卷積神經網絡被廣泛應用在圖像識別領域.圖3展示了一個經典卷積神經網絡框架LeNet5[22]完成數字識別的過程.從圖3中可以看出,卷積神經網絡主要由卷積層、池化層和全連接層組成.

1.1 卷積層

介紹卷積層前,我們先介紹一下輸入圖像、輸入特征圖、輸出特征圖的概念.輸入圖像是指要進行識別的原始圖像,并且它也是第1層網絡的輸入特征圖,輸出特征圖是指神經網絡某1層的輸出,同時它也是下一層網絡的輸入特征圖.卷積層是為了提取輸入特征圖中的某些特征,它的輸出是由神經元組成的一幅新的2D特征圖.計算過程是先卷積再通過一個激活函數得到結果,卷積過程如圖2所示.計算公式為

In(x+kx,y+ky)fi+βfi)),

其中,f(·)是非線性激活函數,βfi表示偏移值,out(x,y)表示在輸出特征圖坐標(x,y)處的值,w(kx,ky)表示卷積核坐標(kx,ky)上的權重值,In(x+kx,y+ky)表示輸入特征圖坐標(x+kx,y+ky)上的輸入值;Kx,Ky表示卷積核的大小,fi表示第i幅輸入特征圖,Nfi表示輸入特征圖的數目.

卷積層計算中卷積的實現方法有4種,直接卷積、展開式卷積(Toeplitz矩陣方法[23])、Winograd卷積[24]和快速傅里葉變換(fast Fourier transform,FFT)卷積[25].直接卷積方案在Alex編寫的cuda-convnet框架[26]中有詳細介紹.卷積過程如圖2所示,與數字信號中的卷積運算不同[27],直接卷積是指卷積核在輸入特征圖上滑動時將滑動窗口內的元素對應相乘與累加(數字信號中的卷積會將卷積核翻轉再與輸入對應相乘累加).展開式卷積就是將輸入圖像展開成列,將卷積核展開成行,將卷積操作轉換成矩陣乘法操作,最后通過高度優化數學庫(GPU的cuBLAS)實現.Winograd卷積是通過計算步驟的轉換將卷積操作中的乘法操作和加法操作的數目改變,使乘法操作減少,加法操作增加,從而提升效率.FFT卷積就是將空間域中的離散卷積轉化為傅里葉域的乘積.它的實現分3個步驟:1)通過快速傅里葉變換將輸入特征圖和卷積核從空間域轉換到頻域;2)在頻域中這些變換后的矩陣相乘;3)計算結果從頻域反轉到空間域.

1.2 池化層

池化層也叫下采樣層,通常是跟在卷積層的后面,根據一定的采樣規則(通常是最大值或平均值采樣)[28]做采樣.池化層的作用是提取局部特征.這是由于圖像具有一種“靜態性”的屬性,在一個圖像區域有用的特征可能在另一個區域同樣適用.例如,卷積層輸出的特征圖中2個相鄰的點的特征通常會很相似,假設a[0,0],a[0,1],a[1,0],a[1,1]都表示顏色特征是紅色,沒有必要都保留作下一層的輸入.池化層可以將這4個點做一個整合,輸出紅色這個特征.這樣可以降低輸入特征圖的維度,減少過擬合現象,同時縮短網絡模型的執行時間.

1.3 全連接層

全連接層的作用是將有用的局部信息提取整合,也就是將以前的局部特征通過權重矩陣重新組裝成新的特征圖.它的核心思想是非線性變換和擬合,多個全連接層的非線性變換嵌套疊加會使網絡有很強的擬合能力(也可能造成過擬合).具體來說,在全連接層中,輸出神經元與上層的輸入神經元全部以獨立的權重值相連接.我們可以將全連接層的計算看作是一個矩陣乘向量,再加上激活函數的非線性映射,即:

其中,out是輸出值,f(·)是激活函數,n表示輸入特征圖的輸入數目,β代表偏移值.每個輸入對應1個權重值.全連接層的運算實質也是一個乘累加運算.

以上就是一個卷積神經網絡的基本組成,卷積神經網絡的訓練基本上和BP(back propagation)神經網絡的訓練一樣,通過遞歸不斷地更新權重減小誤差.現在又新興的一種權重訓練方法即采用遺傳算法訓練權重[29],文中總結的加速器大多只完成推導階段,所以這里對訓練不進行過多贅述.

2 通用芯片對人工神經網絡的支持

常見的通用芯片包括CPU,GPU,DSP,FPGA,隨著深度學習的火熱,它們的最新設計都對神經網絡進行了一些支持.下面分別來介紹它們為支持神經網絡所作的改進.

2.1 CPU

CPU作為應用最廣泛的通用處理器,其對神經網絡的運算優化主要集中在軟件層面,比如優化對神經網絡框架(如Caffe[30]和TensorFlow[31])的支持.硬件方面,隨著研究表明推導時操作數的精度對準確率的影響不大,如表1所示:

Table 1 Effect of Operand Accuracy on Recognition Accuracy表1 操作數精度對識別準確率的影響

CPU也開始支持低精度運算.Intel就對最新的處理器Knights Mill[32]增加了他們稱之為“可變精度”的支持.另外,它對向量處理單元(vector pro-cessing unit, VPU)也做了改進.和上一代Knights Landing相比,Knights Mill在VPU上用1個較小的雙精度端口和4個向量神經網絡指令(vector neural network instruction, VNNI)端口,取代了Knights Landing的VPU上2個大的雙精度單精度浮點(64 b32 b)端口.VNNI端口支持單精度浮點和混合精度整數(16 b輸入32 b輸出).由于操作數精度的降低,以往指令取出的32 b操作數如今變成了2個16 b操作數,這樣運算相同數目的操作數將會采用更少的指令,同時也降低了計算的復雜度,進而提高了性能.

2.2 GPU

圖形處理器GPU強大的并行計算能力適用于CNN計算過程中的大量并行浮點計算以及矩陣和向量運算,這促使了GPU成為最常見的神經網絡硬件加速平臺.許多機器學習的框架都利用了含有CUDA編程接口的GPU,如cuda-convnet[33],Torch[34],Theano[35],Caffe[30].與此同時,許多GPU的深度學習庫也在被探索用來加速神經網絡,如英偉達的cuDNN[36]和Facebook的fbfft[37]等.需要注意的是并沒有哪一種框架或庫對所有類型的神經網絡都能有最好的加速效果.針對不同類型、不同結構神經網絡上述框架和庫都有不同的表現.

除了支持深度學習庫之外,GPU也在體系結構上支持半精度的運算,如tesla P100采用的GP100核心、tesla V100采用的GV100核心以及AMD的Vega架構.英偉達最新的Volta架構更是設計了一個專門用來處理深度學習任務的Tensor Core.每個Tensor Core包含1個4×4×4的矩陣處理陣列來完成D=A×B+C的運算,其中A,B,C,D是4×4的矩陣,如圖4所示.

矩陣相乘的輸入A和B是16 b半精度浮點數(FP16)矩陣,矩陣C和D可能是FP16矩陣或FP32矩陣.該Tensor Core支持16 b和32 b的混合精度運算.FP16的乘法得到了一個全精度結果,該結果和上一周期得到部分和進行累加,如圖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流程圖

2.3 DSP

數字信號處理(DSP)芯片能夠提供強大的數字信號處理能力,它也是一種實現神經網絡加速的有效平臺.四大DSP IP產商也都發布了支持神經網絡的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結構圖

EV6x在硬件結構上實現了對CNN的加速.為了增加對神經網絡卷積運算的支持,從圖6可以看出在EV6x的設計中引入了1個CNN Engine.CNN Engine是一個可編程嵌入式深層神經網絡引擎,它支持當前所有主流神經網絡模型(包括AlexNet,GoogleNet,ResNet,VGG,Yolo,Faster R-CNN,SqueezeNet).CNN引擎的可配置性使不同的網絡模型可以靈活地映射到硬件資源.它能提供每周期800MAC(multiply-and-accumulate)(一般將1次MAC看作2個操作:1個乘法和1個加法)性能,與同類解決方案相比,性能提高了6倍.此外,神經網絡還經常涉及到稀疏矩陣的處理,有效數據并沒有連續存儲,因此在EV6x的4個視覺CPU中提供了“分散-收集”(scatter-gather)功能,scatter-gather是將不規則存放的數據一次取出,再組合成一個向量以便它們能夠被VPU并行處理.

CEVE-XM6針對神經網絡處理做了2點優化:1)為了優化對神經網絡中稀疏矩陣的處理,針對不規則訪存增加了并行Scatter-Gather內存裝載機制;2)采用了類似EV6x設計中DSP加硬件加速器的結構.為了利用圖像卷積處理時卷積核滑過輸入特征圖時出現的數據重疊,加速器中采用了滑動窗口2.0(sliding windows 2.0)機制,這有助于在更廣泛的神經網絡中實現更高的利用率.

VIP8000由高度多線程的并行處理單元、神經網絡單元和通用存儲緩存單元組成.它具有可靈活配置的特點,可以導入由Caffe和TensorFlow等主流深度學習框架生成的神經網絡.它的并行處理單元、神經網絡單元和通用存儲單元都具有可擴展性.為了實現最佳計算效率和準確率,神經網絡單元支持定點8 b精度和16 b浮點精度,并支持混合模式應用.VIP8000最終能取得每秒3 TMAC的性能.

最后,Cadence的Vision C5 DSP為了實現神經網絡所有層的計算(卷積層、池化層、全連接層),而不僅僅是卷積層的加速.它將圖像處理運算單元和神經網絡加速單元合二為一.通過移除神經網絡加速器和主視覺/圖像DSP之間的冗余數據傳輸,Vision C5 DSP的功耗遠低于現有的神經網絡加速器.為了支持低精度運算提高計算效率,它大量增加了低精度乘累加(MAC)單元的數量,有1 024個8 b MAC單元(512個16 b MAC單元).另外為了適應快速變換的神經網絡領域,可編程的設計也是必不可少的.

通過比較以上4個DSP IP的設計,不難發現設計DSP IP實現神經網絡硬件加速的一些共同點:1)都支持低精度的向量運算;2)具有可編程可擴展的特點;3)支持當前所有的主流神經網絡框架.

2.4 FPGA

現場可編程門陣列(field programmable gate array,FPGA)也常被用作神經網絡的加速平臺,這類加速器利用可編程門陣列的特性,設計新的硬件結構,更好地匹配了神經網絡的計算特點.與CPU和GPU相比,它節省了部分通用功能所占芯片面積,更加高效地利用了硬件資源,性能更高并且能效也更高;與ASIC(application specific integrated circuit)相比,FPGA能夠實現快速的硬件功能驗證和評估,從而加快設計的迭代速度.

具體來說,FPGA針對神經網絡的優化主要包括2個方面:1)從計算結構的角度出發;2)從算法的角度出發.計算結構上的優化盡量使神經網絡計算并行化和流水化,并且利用FPGA可編程的特性來設計滿足加速器的靈活性和可擴展性;算法上的優化主要針對卷積層,利用FPGA的可編程性硬件實現各類卷積方法.下面通過幾個例子介紹這些優化方法是如何實現的.

早在2002年Yun等人[42]就在FPGA上實現了多層感知機,他們提出了一種硬件實現數字神經網絡的新體系結構——ERNA.在傳統SIMD(single instruction multiple data)結構的基礎上,采用靈活的階梯式總線和內部連接網絡.所提出的架構實現了基于并行化和流水線化的快速處理,同時不放棄傳統方法的靈活性和可擴展性.此外,用戶還可以通過設置配置寄存器來改變網絡拓撲.

2011年Farabet等人[43]提出了基于FPGA的卷積神經網絡處理器——NeuFlow.它是一種運行時可重構的數據流處理器,包含多個計算瓦片.在計算瓦片中,集成了多個1D卷積器(乘累加單元MAC),形成1個2D卷積算子.輸入輸出塊通過級聯卷積器和其他具有可編程性的操作元件形成,然后再經過路由多路復用器連接到全局總線.

在FPGA2017會議上,張弛等人[44]提出了一種在CPU-FPGA共享內存系統上對卷積神經網絡進行頻域加速的方法.首先,利用快速傅里葉變換(FFT)和重疊加法(overlap-and-add, OaA)來減少卷積層的計算量.具體做法是將頻域算法映射到FPGA上高度并行的基于OaA的2D卷積器上.然后在共享內存器中提出了一種新穎的數據布局,用于CPU和FPGA之間高效的數據通信.為了減少內存訪問延遲并保持FPGA的峰值性能,該設計采用了雙緩沖.為了減少層間數據重映射延遲,該設計利用了CPU和FPGA進行并發處理.通過使用OaA,CNN浮點運算次數可以減少39.14%~54.10%.

總的來說,由于FPGA可編程性強,作為加速器研發周期短,在它上面實現神經網絡加速的研究越來越多.但目前的深度神經網絡(DNN)計算還是重度依賴密集的浮點矩陣乘法(GEMM),拋開獨特的數據類型(利用稀疏壓縮后的數據類型)設計,它更利于映射到GPU上(常規并行性).因此市場上依然是GPU被廣泛地用于加速DNN.FPGA雖然提供了卓越的能耗效率,但它并不能達到當今GPU的性能.但是考慮到FPGA的技術進展以及DNN的算法創新速度,未來的高性能FPGA在處理DNN方面可能會優于GPU的性能.例如英特爾即將推出的14 nm的Stratix,10個FPGA將會具有數千個DSP和片上RAM.還將具有高帶寬存儲器HBM(一種3D存儲技術).這種功能組合就提供了FPGA與GPU相差不多的浮點計算性能.再加上現在的DNN算法里開始利用稀疏(剪枝等產生)和緊湊的數據類型來提升算法的效率.這些自定義數據類型也引入了不規則的并行性,這對于GPU來說很難處理,但是利用FPGA的可定制性就能非常高效地解決.例如清華大學汪玉團隊就在FPGA上優化了對神經網絡稀疏性的處理.

以上4種通用硬件加速平臺由于在優化神經網絡處理的同時還要考慮其對通用計算的支持,因此并不能完全利用所有計算資源來完成神經網絡的加速.此時,體系結構研究者考慮設計一種專用芯片來完成這一加速工作.

3 專用人工神經網絡加速器

當前存在許多關于神經網絡加速器的研究,本節從運算存儲結構和數據流調度優化的角度對現有專用人工神經網絡加速器設計進行分析梳理.

3.1 體系結構設計

現有加速器大都采用基于CMOS(complementary metal oxide semiconductor)工藝的馮·諾依曼體系結構,這類加速器設計注重2個的模塊:運算單元和存儲單元.運算單元的實現分為2種:樹狀結構和陣列結構.存儲單元的設計用來存儲神經網絡每一層的輸入值、權重和輸出值等參數.如何平衡片上片外的數據分配,最小化數據的搬移是它設計的重點.值得注意的是,隨著器件工藝的發展,一些體系結構研究者開始采用憶阻器等新器件來設計處理存儲一體化的加速器.這類加速器有效地解決了帶寬的瓶頸,具有功耗低速度快的特點.另外,專用指令集也是體系結構設計的一大重點.下面分別介紹這幾個方面.

3.1.1 CMOS工藝下的運算單元結構

運算單元是加速器設計的重點,根據神經網絡的計算特點,本文總結了2種運算單元的實現結構:1)樹狀結構,通過對神經元計算過程的抽象得到;2)PE陣列結構,利用神經網絡每一層有大量乘累加并行計算的特點,將乘累加操作放入1個PE里,這樣可以通過PE陣列實現神經元的并行處理.具體設計方案如下.

圖7給出了樹狀結構圖.方框內是一個簡易的神經元計算單元NFU,最右端的根節點是每個神經元的輸出,子節點包括乘法器、加法器和非線性激活函數,葉子節點是神經元的輸入.特別地,圖7中第2層的結果有的并沒有經過NFU-3的函數激活,而是直接輸出(圖7中虛線部分),這是因為神經網絡中有的層并沒有激活操作,典型的如池化層.采用這種樹狀結構的設計有DianNao[6],DaDianNao[5].兩者都采用了NFU作為加速器的基本處理單元,不同的是DaDianNao有更好的擴展性,可以高性能地支持大尺寸網絡模型.不過從NFU的結構可以看出DianNao和DaDianNao僅能很好地支持神經網絡的計算(NFU只有乘累加運算單元).為了運行更多的機器學習算法,PuDianNao[7]設計了新的計算單元(machine learning unit, MLU),它的子節點包括計數器、加法器、乘法器、加法樹、累加器(accumulator)和雜項作業(miscellaneous, Misc).支持了更多的機器學習算法,如k-均值、k-最近鄰、樸素貝葉斯、支持向量機、線性回歸、神經網絡、決策樹等.PuDianNao運行上述機器學習算法時的平均性能與主流通用圖形處理器相當,但面積和功耗僅為后者的百分之一量級.

Fig. 7 A typical tree structure of NFU圖7 一個典型樹狀結構的NFU

Fig. 8 Systolic data flow of the matrix multiply unit in TPU圖8 TPU矩陣運算單元的脈動數據流

陣列結構主要以Google TPU[9]的脈動陣列結構為代表.TETRIS[45],Eyeriss[12],ShiDianNao[8],Scaledeep[11]所采用的處理結構都在脈動陣列上進行或多或少的改動.脈動陣列的設計核心是讓數據在運算單元的陣列中進行流動,增加數據的復用,減少訪存的次數.圖8展示了TPU中矩陣乘法單元的脈動數據流.權重由上向下流動,輸入特征圖的數據從左向右流動.在最下方有一些累加單元,主要用于權重矩陣或者輸入特征圖超出矩陣運算單元范圍時保存部分結果.控制單元負責數據的組織,具體來說就是控制權重和輸入特征圖的數據如何傳入脈動陣列以及如何在脈動陣列中進行處理和流動.

3.1.2 CMOS工藝下的存儲結構

因為數據存取的速度大大低于數據處理的速度,因此存儲單元的設計直接影響到加速器的性能.英偉達公司首席科學家Steve[46]曾指出,在40 nm工藝下,將64 b數據搬運20 mm的能耗是做64 b浮點乘法的數倍.因此,要降低處理器功耗,僅僅優化處理結構是不夠的,必須對片上存儲單元的結構也進行優化.傳統的存儲單元設計是將不同數據放在同一個存儲器里.在DianNao里提出了一種存儲方式(圖7),對神經網絡參數進行分塊存儲(用于存放輸入神經元的輸入緩沖器NBin、存放輸出神經元的輸出緩沖器NBout、存放突觸權重的緩沖器SB),將不同類型的數據塊存放在片上不同的隨機存儲器中,再優化神經網絡運算過程中對不同類型數據的調度策略.與CPUGPU上基于緩存層次的數據搬運方法相比,DianNao的設計方案可將數據搬運次數減少至前者的130~110.DaDianNao也延續了這種存儲結構設計,同時DaDianNao使用了eDRAM來存放所有的權重值并將其放在計算部件附近以減少訪存延時.

另外,隨著神經網絡規模越來越大,訓練集越來越大,處理能力也越來越強,對帶寬的要求就變得越來越高.傳統2D存儲結構的DDR技術不能提供如此高的帶寬.人們開始將3D存儲技術引入到神經網絡加速器的設計中.現在3D存儲方案有AMD和海力士研發的HBM以及Intel和美光研發的HMC.Google的Cloud TPU[9]采用了HBM作為存儲結構.Neurocube[47]和TETRIS[45]采用了HMC作為加速器的存儲結構.另外,3D存儲的出現使人們開始考慮將累加器設計到3D存儲體里.這樣做可以減少1次數據的讀取,從而降低延遲,節省功耗,提高性能.TETRIS給出了4種在HMC中設計累加器的方案,分別是內存控制器級累加、DRAM芯片級累加、Bank級累加和子陣列級累加.第1種方案是將累加器做在HMC的邏輯層,這樣設計并不能減少數據的讀寫次數.后3種設計能帶來性能提升,但子陣列級累加實現困難,所以主要還是采用DRAM級累加和Bank級累加.

3.1.3 新工藝下的一體化結構

運算存儲一體化結構的加速器打破了馮·諾依曼體系結構的束縛,要想實現這類加速器依靠傳統CMOS工藝較為困難,新型器件的研究和非傳統電路的實現是這類加速器的研究方向.最新研究表明憶阻器是實現一體化結構的一種較好選擇,它本身具有存儲數據的功能,另外利用基爾霍夫定律產生的位線電流就是卷積運算乘累加的結果,節省了乘法和累加的計算時間.去年,在憶阻器領域具有領先地位的HP公司與猶他大學合作研究發表了基于憶阻器的神經網絡加速器ISAAC[13].它的結構與DaDianNao[5]相似,由多個Nodes或Tiles組成,憶阻器交叉(crossbar)開關陣列組成了每個Tile的核心來完成存儲權重和卷積計算的功能.與DaDianNao相比,吞吐量是其14.8倍,功效是其5.5倍,計算密度是其7.5倍.

目前做神經網絡加速的憶阻器器件主要以ReRAM為主.加州大學圣塔芭芭拉分校謝源教授課題組也發布了一種基于ReRAM的神經網絡加速器PRIME[48].基于新型材料的ReRAM被認為是今后可以替代當前DRAM的下一代存儲技術之一.作為憶阻器的一種,ReRAM除了是存儲單元之外,其獨特的交叉網絡結構(crossbar)和多比特存儲(multi-level cell)性質,能以很高的能量效率加速神經網絡計算中的重要計算模塊——乘累加.實現方法是通過在ReRAM存儲體內修改一部分外圍電路,使其可以在“存儲”狀態和“神經網絡加速器”狀態之間靈活切換.

現階段使用ReRAM之類的憶阻器器件來實現CNN加速器還有許多挑戰,如精確度、內部數據調度以及模數轉換等.清華大學的張悠慧教授等人[49]提出了神經網絡模型轉換方法,將原神經網絡稀疏化后劃分成規模適應于ReRAM陣列的子網絡,并對數據進行量化來解決硬件精度受限問題,這一定程度上從軟件的角度解決了計算精度的問題.而李楚曦等人[50]提出的基于憶阻器的PIM結構實現深度卷積神經網絡近似計算,通過利用模擬憶阻器大大增加數據密度,并將卷積過程分解到不同形式的憶阻器陣列中分別計算,增加了數據并行性,減少了數據轉換次數并消除了中間存儲,從而實現了加速和節能.但是目前實現人工神經網絡大多還是采用存儲分離的結構,不過隨著憶阻器技術的不斷成熟,由于其低功耗和快速處理數據的特點,新工藝下的一體化結構終將會是加速器發展的一大趨勢.

3.1.4 指令集設計

與基于RISC指令集的通用處理器不同,專用芯片多采用基于CISC來設計自己指令集.這類指令集側重于完成更復雜的任務,適用于指令數量少和復雜程度高的神經網絡.傳統指令集實現一個神經元的操作需要上百條指令,如果使用專有指令集一個神經元的操作可以只用一條指令執行,減少功耗的同時提升了速度.TPU的指令集就是CISC類型,平均每個指令的時鐘周期數是10~20.指令總共只有十幾條.其中比較重要的包括讀權重值和讀輸入特征圖數據、矩陣運算卷積、激活和寫回計算結果等一系列神經網絡運算相關的指令.

不過另一方面.越來越多研究者指出指令集的設計除了專用性外,還需要足夠的靈活來滿足加速器處理不同的神經網絡的效率.為了解決這個問題,中科院陳天石團隊[51]基于RISC設計了一種新的用于神經網絡加速器領域的專用指令集架構,稱為Cambricon,它是一種集標量、向量、邏輯、數據傳輸和控制指令于一體的存取架構.Cambricon在廣泛的神經網絡技術上表現出強大的描述能力,并且比通用指令集架構(X86,MIPS,GPGPU)提供更高的代碼密度.

3.2 數據流調度和優化

3.1節介紹了專用芯片在體系結構方面對神經網絡所作的支持,但是在神經網絡處理過程中數據流的組織和調度的方式以及數據流的優化對硬件實現神經網絡的性能影響同樣很大.在神經網絡中常用的數據流有權重固定流、輸出固定流、無局部復用和行固定流,常用的數據流優化處理手段有0值跳過、稀疏矩陣、參數壓縮等.

3.2.1 數據流的調度

1) 權重固定流

在卷積神經網絡的卷積操作過程中,同一個卷積核會卷積多個輸入特征圖.此時對這個卷積核里的權重是有復用的.如果把多次使用的權重存在每個PE的寄存器里,那么卷積層的計算過程將會減少從全局緩沖取數據和向全局緩沖存數據的開銷.由于部分和(partial sum, Psum)還會用到,因此將它暫時存放在全局緩沖里,如果緩沖區不大就必須限制同時產生Psum的數量,這樣也限制了一次性可以在片上加載的權重.此時若采用脈沖的方式將會有效減少Psum對全局緩沖大小的依賴,圖9(a)給出了這種數據流的處理過程.權重值存放在PE里,輸入激活值被廣播到所有PE單元.部分和在每個PE累加過后傳到下一個PE.

Fig. 9 Dataflow of the neural network圖9 神經網絡的數據流

采用這種數據流的芯片設計有NneuFlow[43],它用了2D卷積引擎來處理卷積核.每個引擎處理過程中權重值保持不變.其他采用這種數據流的例子還有[52-54].

2) 輸出固定流

指在寄存器中存放每個周期計算的部分和.卷積操作是一個乘累加操作,每個周期計算的部分和需要與下一個周期的部分和相加得到新的部分和,直到這個卷積核的計算完全結束.把部分和存在寄存器里同樣也是減少了從全局緩沖取數據和向全局緩沖存數據的開銷.同樣這種數據流設計采用脈沖結構實現是最佳的.圖9(b)給出了這種數據流的處理過程.部分和在PE內部累積最后流出到全局緩沖區,權重值被廣播到所有PE.輸入激活值在PE進行乘法運算后傳給下一個PE.

采用這種數據流的芯片設計有ShiDianNao[8].它的每個PE通過從相鄰PE獲取相應的輸入激活來處理每個輸出激活值.PE陣列通過實現專用網絡來水平和垂直地傳遞數據.每個PE還具有數據延遲寄存器,以便在所需的循環周期內保持數據周期.全局緩沖區流入輸入激活值,并將權重廣播到PE陣列中.部分和積累在每個PE內部,然后被流出回到全局緩沖區.其他采用這種數據流的例子還有[55-56].

3) 無局部復用

指不在PE的寄存器文件里存放權重和部分和,每個周期需要計算的數據都從全局緩沖獲取,計算完后將結果傳回全局緩沖,最后通過PE陣列累積部分和.這樣的好處是減少了PE所占的面積,但是由于PE沒有數據保持固定,所以這樣的設計也增加了全局緩沖區和空間PE陣列的流量.圖9(c)給出了這類數據流的處理過程.

采用這種數據流的芯片設計有UCLA[57],Dian-Nao[6],DaDianNao[5],PuDianNao[7].其中DianNao系列由于采用了專門的寄存器來保存部分和,并不用從內存里取,因此可以進一步降低訪問部分和的功耗.

4) 行固定流

指在高維卷積過程中通過將高維卷積分解成可以并行運行的1D卷積原語;每個基元(原語操作)表示1行卷積核權重和1行輸入特征圖像素的點積,并生成1行部分和Psum.不同原語的Psum被進一步累積在一起以生成輸出特征圖.具體做法是將每個原語映射到1個PE進行處理,每個行對的計算在PE中保持獨立,這就實現了卷積核和寄存器級別的輸入特征圖數據重用.圖10給出了這類數據流的處理過程.

Fig. 10 The row stationary dataflow in PEs set to process a 2D convolution圖10 處理2維卷積時的PE陣列中的行固定流示意圖

采用這種數據流的芯片設計有Eyeriss[12]和TETRIS[45].

5) 其他數據流

上述數據流都沒有將權重值和輸入激活值(上一層輸出經過激活函數得到的值)完全復用.在SCNN[14]中提出了一種全新的數據流,笛卡兒數據流.實現方法是將需要計算的權重和輸入激活值做成2個向量,然后2個向量做笛卡兒積,這樣向量中每個數能達到最大復用.

3.2.2 數據流的優化

神經網絡在數據的處理過程中還存在很多的優化技巧.首先,神經網絡在推導過程中的對精度要求不高,這使幾乎全部的神經網絡專用加速器都支持低精度運算,其中TPU[9]更是支持了8 b低精度運算.其次,稀疏性.人們在神經網絡訓練和推導過程中發現會產生許多的0值,一部分來源于網絡訓練階段的剪枝,另外一部分來源于推導階段采用ReLU激活函數參數的0激活值.而0值在卷積操作中是可以跳過的,因為卷積操作由多個乘累加操作組成,乘數有一個為0則乘法和后面的加法就沒必要計算.在Cnvlutin[58]就采用了跳過權重中0值的數據流,在Cambricon-X[59]里則采用了跳過輸入的0激活值,而在SCNN里通過壓縮稀疏性和將非0參數編碼的方式同時做到了跳過0值權重和0激活值.這也引出了神經網絡的另一種優化方法——壓縮.在SCNN[14]和EIE[60]中都采用了壓縮參數的方法.

雖說壓縮稀疏權重從計算量的角度來看能夠直接提高性能,但最近的研究表明在不損失精度的情況下直接通過權重剪枝卻會造成性能的下降[56],這是由于解碼壓縮的權重需要額外的時間,并且壓縮的非0權重值需要額外的索引值來記錄它們原來矩陣的位置,這也增加了存儲開銷.最終的結果導致只有在大量剪枝的情況下,剪枝后的新網絡的性能才會優于剪枝前的網絡,而且會有精度的損失.在文獻[61]中提出了2種解決辦法分別針對并行性不同的2種硬件:1)采用基于SIMD的權重剪枝用于低并行度的硬件,實現方法是采用權重分組索引,這樣一條SIMD指令可以讀取多個權重值;2)使用節點剪枝用于高并行的硬件,具體實現思想是利用正則化既不完全去掉參數又可以將它的影響降到最小.

4 加速器未來發展的挑戰和機遇

第2節和3節論述了許多硬件加速神經網絡的方案,其中在通用芯片平臺實現的包括支持低精度計算、支持更多的神經網絡框架以及設計一個加速卷積運算的模塊;在專用芯片平臺實現的包括改進運算存儲結構、優化數據流和設計專用指令集.雖然這些設計已經在神經網絡加速方面取得了重大進展.但還是有許多問題和挑戰要解決.下面列舉的4個方面或許會是加速器未來研究的可行方向.

1) 設計功耗更低的加速器.嵌入式應用是加速器應用的一種趨勢,加速器未來可能會應用到像可穿戴這樣的領域,這就需要把功耗進一步降低,可突破的方向包括采用新器件,進一步探索數據的組織形式以減少數據的移動等.

2) 設計通用性更強的加速器.隨著神經網絡應用的增多,神經網絡的結構和框架也會越來越多.未來加速器設計需要考慮到支持各個框架的核心算法.

3) 解決訪存瓶頸.存取速度跟不上運算速度依舊是加速器設計的難題.目前3D存儲是解決該問題的一個方向.不過隨著新工藝的發展,采用新器件的非馮·諾依曼體系結構或許能進一步改善這個問題.

4) 應用其他領域的突破成果.技術革命通常伴隨著不同領域的飛躍,采用基于生物啟發的脈沖神經網絡、量子計算機以及使用憶阻器等新器件都可能是加速器未來設計的可行方案.

猜你喜歡
加速器數據流神經元
莫比斯加速器眾創辦公空間
知識快餐店 科學加速器
全民小康路上的“加速器”
汽車維修數據流基礎(上)
AI講座:神經網絡的空間對應
汽車維修數據流基礎(下)
基于XML的數據流轉換在民航離港系統中應用
仿生芯片可再現生物神經元行為
AADL端對端數據流一致性驗證方法
這個神經元負責改變我們的習慣
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合