中科院說的深度學習指令集diannaoyu到底是什麼?

背景閱讀: 中科院計算所提出國際上首個深度學習指令集DianNaoYu----中國科學院計算技術研究所

那麼這個指令集到底是什麼, 相比現在的工具, 這個有什麼優勢和劣勢?


(更新歷史:

10.5號更新,加入了DianNao部分的內容;

10.4號更新,加入了DaDianNao部分的內容;

10.2號更新,加入了ShiDianNao部分的內容;)

最近正好在比較系統地關注AI硬體加速的東東。

前幾天比較細緻的讀了一下ISCA16上關於寒武紀指令集的文章,在這裡(寒武紀神經網路處理器效能如何 ? - 楊軍的回答)有一個當時寫的paper reading notes。

這兩天花了一些時間,又把發在ASPLOS 15、ISCA 15、Micro 14以及ASPLOS 14上的PuDianNao/ShiDianNao/DaDianNao/DianNao這四篇文章也讀了一下,整理了一份reading notes,分享出來供參考。在我看來,系統性地把DianNao項目的相關重點論文一起梳理一遍,對於透過陳氏兄弟的工作來把握AI硬體加速器這個技術trend會更有助益。

---------------------------------------------------------------------------------------------------------------

1. PuDianNao

[1]是陳氏兄弟發起的Diannao項目[2]中的最後一篇論文,文章對七種常見的機器學習演算法的計算操作類型和訪存模式進行了總結。包括:

kNN/k-Means/DNN/Linear Regression/Support Vector Machine/Naive Bayes/Classification Tree。

基於對這七種演算法的分析,提出了一種能夠同時支持七種演算法的硬體加速器的設計方案。

發在ASPLOS這種國際頂會上的文章,寫作風格通常也非常乾淨清晰,結構明了,這篇文章也秉持了這個傳統,即使是非體系結構出身的人,讀起來也會感覺很清爽。

文章先是對七種機器學習演算法的計算及訪存範式進行了分析,這也是後續的硬體加速器的基礎,套用工業界的說法,這屬於我們的「業務問題」,只有先對業務問題認識清楚了,才能給出好的解決方案。

以kNN演算法[3]為例,這個演算法的核心思想比較直觀,並不需要顯式的訓練環節,而是直接根據已經獲取到的有標籤的reference sample,對於待預測樣本,通過給定的distance function,找到距離待預測樣本最近的k個reference sample,然後再根據這k個reference sample的標籤決議出待預測樣本的標籤,核心的代碼邏輯如下:

主要的計算開銷花在了distance function的計算上(具體distance function根據業務、數據的特點來進行design,常用的比如cosine similarity[4]/Euclidean distance[5]/Hamming distance[6])。

如果我們把計算開銷拆解得再細緻一些,會發現,計算開銷由純計算時間+訪存時間構成。純計算時間的優化,可以通過定製硬體資源來獲取到,而訪存時間的優化則需要結合具體的訪存模式來展開。

在計算機體系結構領域,常用的提升訪存性能的方案是緩存機制的引入,這在Pattern 04年的talk[7]里,也將其列為解決計算機系統里bandwidth與latency的gap的1st solution。

我個人比較直觀的印象是,在讀master的時候,自己做過一段時間硬體模擬器的開發工作,當時的工作現在看起來並不複雜,參考VMIPS[8]實現了一個基於龍芯1號的SoC模擬器,當時的實際觀測里,運行非常簡單的benchmark(因為是裸晶元,所以為了簡單,這個benchmark就是一個類似於簡易BIOS的bootloader + 硬體測試邏輯的組合),能夠觀察到cache生效與否對性能帶來幾十倍以上的影響。

回到我們討論的這篇文章,訪存性能的提升,往往對於最終系統的性能會帶來顯著的影響。在文章里也基於一個cache模擬器,對七類機器學習演算法的訪存行為進行了模擬評估,並發現kNN演算法的原始實現會引入大量的訪存行為,這個訪存行為的頻繁度會隨著reference sample集合的增加而增加(原因很簡單,cache無法裝下所有 的reference sample,所以,即便這些reference sample會不斷地被重複訪問,也無法充分挖掘data locality所帶來的cache收益)。針對這種應用類型,實際上存在成熟的優化範式——Loop tiling[9]。

Loop tiling的基本思想是,對於循環邏輯,通過將大塊的循環迭代拆解成若干個較小的循環迭代塊,減少一個內存元素的re-use distance,換句話說,也就是確保當這個內存元素被載入到cache以後,儘可能保留在cache中,直到被再次訪問,這樣就達到了減少了昂貴的片外訪存的開銷的目的。對體系結構不太熟悉的同學,可能未必能一下子感知到這樣做的意義,參考[10][11][12][16][17]里的一些number,能夠更為量化地感知到數據訪問落在不同的存儲部件上(CPU寄存器/Cache/內存/磁碟外存/網路)的差異,也許就可以更為深刻地理解到loop tiling這個看起來不起眼的優化技巧對性能帶來的潛在提升。

針對kNN演算法,使用loop tiling優化後的代碼邏輯會長成這樣:

優化後相較於優化之前的實現,片外訪存帶寬減少了 90%:

針對kNN演算法的分析套路,也可以套用在剩下的6種演算法上,每種演算法的most time-consuming的主要計算邏輯類型不同(kNN/k-Means對應的是distance function的計算,DNN/Linear Regression對應的則是向量點積和矩陣乘法計算, Naive Bayes對應的是計數),為了充分挖掘data locality的優化技巧細節也有所差異,但基本上都是loop tiling的應用。

比如k-Means里,聚類中心點會被反覆訪問,其data locality就是需要著力優化的地方;DNN里,兩層layer之間的線性變換操作中,weight和上層layer不具備data locality,不需要進行優化,而下層layer的神經元會被訪問多次,就需要充分挖掘其data locality,這裡就不再詳述,可以直接參考原始論文。

在這7個演算法中,基於loop tiling優化技巧,kNN/k-Means/Linear Regression/DNN/SVM具有較好的data locality挖掘空間,而Naive Bayes/Classification Tree的data locality挖掘空間則較小。這從下圖可以表現得更為形象:

對跑在加速器上的這7類演算法任務的認識,對於加速器的結構設計有著重要的影響。

比如,在kNN為代表的5演算法都表現出相似的data locality,帶來的一個直觀啟示就是對於reuse distance &> 1的兩大類變數,分別提供兩種不同尺寸的cache,來配合loop tiling充分挖掘data locality。

另外,對於不同演算法里耗時最多的計算任務的理解,對於具體的硬體執行流水線的設計也有著重要的啟示。

下面我們可以來看一下PuDianNao的結構設計圖:

PuDiannao的結構主要由若干個Function Unit(每個FU的功能是相同的),三個數據緩存(Hot Buffer, Cold Buffer, Output Buffer),一個指令緩存(Inst Buffer),一個控制模塊(Control Module),以及DMA控制器組成。

Function Unit是PuDiannao的基本執行單元,每個FU又由兩個部件構成,分別是用於機器學習演算法硬體定製支持的Machine Learning Unit,以及用於常規計算控制任務的Arithmetic Logic Unit。

作為提供機器學習硬體加速支持的MLU,其內部由Counter、Adder、Multiplier、Adder Tree、Acc、Misc 6級流水線組成。MLU的流水線微結構圖如下:

關於流水線的設計,值得一提的是Multiplier + Adder Tree提供了dot product的支持,這也是LR/SVM/DNN里的高頻操作。當樣本維度高於流水線運算部件的計算寬度時,可以通過Acc stage對Multiplier + Adder Tree輸出的partial sum結果進行累積,來給以支持。Misc stage提供了對非線性函數(比如sigmoid/tanh函數)的線性插值近似和top-k/tail-k功能(在kNN和k-Means里會用到)的硬體支持。

為了減少晶元面積及功耗,在Adder/Multipler/Adder tree這三個stage里支持的是16位的浮點計算,而對於Counter/Acc/Misc這三個stage則仍然使用32位浮點數,這種設計也是考慮到Counter/Acc/Misc離最終計算結果比較近,overflow的風險較高,而Adder/Multiplier/Adder tree對應於中間計算結果,overflow風險較低,所以會做出這種設計trade-off。

在文章里,也對於這種16-bit的trade-off所可能帶來的演算法精度下降進行了量化評估:

基準線是所有pipeline stage都採用32-bit浮點數的精度,能夠看到,32bi16bit的混合設計,對於模型精度影響並不大。

相較於MLU,ALU的設計則比較簡單,主要實現了MLU里未支持,也即是在機器學習演算法中非高頻操作的邏輯。比如除法、條件賦值等。這樣設計的考慮是希望PuDiannao能夠儘可能自治地支持起機器學習演算法運行所需的基礎部件支持,因為PuDiannao本質上還是一個加速器,所以會作為協處理器[15]嵌入到宿主系統里,協同支持完整計算任務的執行。如果對於機器學習演算法中非典型高頻操作不提供支持,那麼這些操作就需要回落到宿主cpu上,這會增加宿主系統與PuDiannao的協同開銷,對加速效果也會帶來影響。

關於存儲部件的設計,在上面已經提了引入多種data buffer的設計動機(支持計算任務里不同的reuse distance),需要再補充一下的是,為了減少晶元面積和功耗,hot buffer/code buffer使用的是單埠的SRAM,而output buffer則因為其支持的操作類型(同時讀寫),使用了雙埠的SRAM。

在[13]里,可以了解到,相較於單埠RAM,雙埠RAM無論是在基本存儲單元cell的面積上,還是控制邏輯上,都引入了額外的代價,這也是這裡做這個設計trade-off的考量。另外,為了提升主存到PuDiannao的數據交換性能,對於inst buffer和data buffer都採取了DMA與宿主系統進行交互。

PuDiannao的Control Module扮演的是指令解碼器和dispatcher的功能。PuDiannao里,計算任務的描述,通過control instruction來描述,而control module就是對control instruction進行解碼,然後把需要執行的操作指令發送給所有 的FU上。PuDiannao的指令抽象度比較低,所以使用control instruction編程需要對PuDiannao的架構實現細節非常了解,看一下control instruction的格式會有助於建立這個認識:

以及基於control instruction所編寫的k-Means的code snippet:

最後基於PuDianNao的評估集中在性能加速比以及功耗這兩個方面。分別基於verilog和C模擬器完成了評估環境的搭建。verilog評估環境(65nm工藝)的精度更高,但速度慢,C模擬器的速度快,但評估精度會有一定的損失。

評估使用的數據集描述如下:

評估的baseline是GPU(NVIDIA K20M, 3.2TFlops peak,5GB顯存,208GB/s顯存帶寬,28nm工藝, CUDA SDK5.5)。

性能評估的策略是將7個演算法的不同phase拆分開來與baseline進行評估對比:

在上面的評估結果中,能夠看到,有某些phase里,GPU baseline的表現要比PuDianNao要好,比如Naive Bayes的prediction phase,這跟Naive Bayes的prediction的計算類型涉及到大量的乘法計算有關,PuDianNao並沒有配置大規模的寄存器堆,所以需要在on-chip的data buffer和FU之間頻繁地進行數據交互,而K20M則有64K個寄存器可供給計算,所以不會存在這個問題,於是造成了這種performance差異(說到這裡,我有些好奇的是在[14]里,對於這個問題是怎樣解決的。因為在[14]里,我並沒有看到在regisger上面的額外設計資源投入,仍是通過data buffer來完成計算任務所需的數據存儲,看起來似乎應該存在跟PuDianNao相同的問題。但是在[14]里,工藝與PuDianNao相同,都是65nm,相較於相同的GPU baseline,averagely卻獲得了3X的性能提升,這是一個讓我暫時未解的疑問)。性能提升最明顯的SVM prediction則主要是FU里提供了kernel函數的插值邏輯硬體實現帶來的。

如果說PuDianNao帶來的性能提升相較於GPU並不顯著的話(in average 1.2X),那麼在計算能耗比上的提升,就相當顯著了:

最後可以看一下PuDianNao的layout信息:

能夠看到,FU(Functional Unit)和CB(Cold Buffer)是面積大戶,CM(Control Module)的面積不大,但是功耗並不小。

正好前不久剛剛精讀了Cambricon指令集的論文[14],把兩篇論文聯繫在一起來看,還是隱約能夠感知到一些脈絡。PuDianNao里給出的流水線設計,更像是一個特殊的定製硬體邏輯,ad-hoc的味道更濃,而[14]里給出的流水線設計則比較接近於一個中規中矩的處理器的設計了。[14]里也能夠看到更明顯的抽象的味道,把Add/Multplication這些操作都集中在了Vector/Matrix Func Unit里,不像PuDianNao這樣,會在不同的流水線stage里,分別提供了看起來有些相近的實現(Add邏輯在多個pipeline stage里出現)。在片上存儲體系的設計里,[14]也更為general,通過更為精巧的crossbar scratchpad memory來統一提供片上訪存支持。最重要的是,PuDianNao只提供了針對7種演算法的操作碼,而[14]則在指令集的層次為更豐富的應用類型提供了支持。

接下來計劃再去讀一下DianNao系列的其他幾篇文章,以作相互映照。

在閱讀PuDianNao的時候,還是發現對於[14]的理解,有些地方並不如之前所以為的那樣深入,因為在PuDianNao里看到的一些問題(比如Naive Bayes prediction的問題),似乎並沒有理解清楚在[14]里是如何針對性解決的,也許隨著對整個系列論文的深入閱讀 ,能夠形成一個更為完整系統化的認識吧。

References:

[1]. Daofu Liu. PuDianNao: A Polyvalent Machine Learning Accelerator. ASPLOS, 2015.

[2]. A Brief Introduction to The Dianao Project. http://novel.ict.ac.cn/diannao/

[3]. k-nearest neighbors algorithm. k-nearest neighbors algorithm

[4]. cosine similarity. Cosine similarity

[5]. Euclidean distance. Euclidean distance

[6]. Hamming distance. Hamming distance

[7]. David Patterson. Why Latency Lags Bandwidth and What It Means to Computing. https://www.ll.mit.edu/HPEC/agendas/proc04/invited/patterson_keynote.pdf

[8]. VMIPS. The vmips Project

[9]. Loop tiling. Loop tiling

[10]. Approximate cost to access various caches and main memory. latency - Approximate cost to access various caches and main memory?

[11]. CPU Cache Flushing Fallacy. http://mechanical-sympathy.blogspot.com/2013/02/cpu-cache-flushing-fallacy.html

[12]. Answers from Peter Norvig. Teach Yourself Programming in Ten Years

[13]. What is dual-port RAM. Dual port memory, dual ported memory, Ports, sdram, sram, sdram, memories

[14]. Shaoli Liu. Cambricon: An Instruction Set Architecture for Neural Networks", in Proceedings of the 43rd ACM/IEEE International Symposium on Computer Architecture. ISCA, 2016.

[15]. Coprocessor. Coprocessor

[16]. Visualization of Latency Numbers Every Programmer Should Know. Numbers Every Programmer Should Know By Year

[17]. Latency Numbers Every Programmer Should Know. https://gist.github.com/jboner/2841832

---------------------------------------------------------------------------------------------------------------

2. ShiDianNao

這[1]是陳氏兄弟DianNao項目[2]的第三篇論文,發在了ISCA 2015上。

之前閱讀了這個系列裡的Cambricon[4]和PuDianNao[3]這兩篇論文,感覺ShiDianNao這篇論文在立意的創新性上比起[3][4]略遜了一籌,更像是一個針對具體應用場景的一個偏工程層面的體系結構設計優化工作,但是在加速器的設計細節上卻是touch得最為詳細的,無論是訪存體系的設計,還是計算單元的設計,介紹得都非常的細緻,看完這個設計,說對一個比較naive的GPGPU這樣的硬體加速器建立起一定的sense並不為過。

文章的核心思想是利用CNN網路weight sharing的特性,將CNN模型整體載入入SRAM構成的高速存儲里,減少了訪問DRAM帶來的內存開銷。同時,將加速器直接與視頻圖像感測器相連接,感測器採集到的圖像數據直接作為加速器的輸入進行處理,減少了額外的訪存操作(傳統模式下,會先將感測器採集到的數據放入DRAM,再知會加速器進行處理,於是會有至少兩次的額外DRAM訪問操作)。

Overall的思想聽起來很直觀,但真正操作起來,有著大量的設計細節需要去考量,列舉幾個文章中提到的挑戰以及我在文章閱讀過程中想到的挑戰:

1.與感測器直連的加速器晶元中的SRAM尺寸取多大比較合適?太大了,功耗、面積就上去了。太小了,對性能會帶來明顯的影響(想像一下如果模型不能全部hold到加速器的SRAM里,對計算過程帶來的影響)。所以這很考究架構師對目標問題以及技術實現方案細節的把控和理解。

2.對於會跑在這款加速器上的CNN模型,採取什麼樣的方式來映射到硬體計算資源?比較natural且高效的方式是,每個神經元都要對應於一個硬體計算單位,但這樣很容易因為模型尺寸超出硬體物理計算單元個數而限制加速器所能支持的應用類型。而如果不強求一個神經元對應一個硬體計算單位,採用時分復用的方法,也還有小的設計權衡要考慮,以卷積層為例,在計算一個特定的feature map的output neuron的時候,在同一個時刻是只為一個output neuron進行計算,還是同時為多個output neuron進行計算,這在硬體複雜性/面積/靈活性上都會有不同的影響。

3.跑在加速器晶元上的應用任務,存在一定的data locality,對這種data locality是否需要進行挖掘,以榨取更多的性能加速的空間?比如,在計算卷積層feature map的時候,卷積輸入層的input neuron實際上是會被多個output neuron使用到的,這些input neuron是每次為某個output neuron計算的時候,都去從SRAM中訪問獲取,還是在計算單元中,引入一些local storage,進行計算單元之間的內部通信。雖然說SRAM已經比DRAM的性能要好了一個數量級[7],但是計算單元之間的直連通信能夠帶來更多的性能收益。當然,這樣做的代價是硬體設計的複雜性。

硬體開發工作不像軟體開發,一次性成本非常高,所以在設計環節往往需要食不厭精,反覆雕琢。也只有這樣做,當晶元大規模量產以後,ROI優勢才能突顯出來。

ShiDianNao的工作,最出彩的,就是針對上面提到的具體問題場景,給出了比較精巧的硬體設計方案。

首先來看一下ShiDianNao的頂層結構:

在這個設計方案里,左側是SRAM堆起來的數據存儲(共計288KB,見下圖片上SRAM的具體功用分配),

根據CNN計算任務的特點(一組input neurons通過一層數學計算,生成一組output neurons),設計了三類SRAM存儲:

NBin:存取input neurons。

NBout:存放輸出output neurons。

SB:存放完整的模型參數。

在這三類存儲中,SB要求能夠hold住模型的全部參數,而NBin/NBout要求能夠hold住神經網路一個layer的完整input/output neurons。原因是因為,模型參數會被反覆使用,所以需要放在SRAM里以減少從DRAM里載入模型參數的時間開銷,而作為CNN模型輸入數據的一張特定的圖片/視頻幀的raw data被模型處理完畢後不會被反覆使用,所以只需要確保每個神經層計算過程中所需的input/output neurons都hold在SRAM里,就足以滿足性能要求

右側則是一個NFU(Neural Functional Unit),這是一個由若干個PE組成的計算陣列。每個PE內部由一個乘法器、一個加法器、若干個寄存器、兩組用於在PE陣列水平/垂直方向進行數據交互的FIFO以及一些輔助的控制邏輯組成:

NFU的計算結果會輸出到一個ALU,通過ALU最終寫入到NBOut里。ALU里實現了一些並行度要求不那麼高的運算支持,比如average pooling會用到的除法操作,以及非線性激活函數的硬體實現等。其中非線性激活函數的實現,使用了分段函數進行插值近似[8],以求在精度損失較小的情況下,獲取功耗和性能的收益。

在ShiDianNao里,所有的數值計算均使用的是16位定點計算[6],而沒有使用32位的浮點計算。這種策略在其他硬體加速器的設計[5]里也有過成功的應用。

NFU的PE陣列設計里,值得一提的是對Inter-PE data propagation的支持。引入這層支持的考慮是減少NFU與SRAM的數據通訊量。我們回顧一下卷積層Feature Map的計算細節,會注意到同一個feature map里不同的output neuron,在stride沒有超過kernel size的前提下,其輸入數據存在一定的overlap,這實際上就是Inter-PE data propagation的引入動機,通過將不同的output neuron之間overlap的那部分input neuron直接在PE之間進行傳播,從而減少訪問SRAM的頻次,可以在性能和功耗上都獲得一定的收益。這個收益,會隨著卷積核尺寸的增加而變得更加明顯。

以32x32 input feature map + 5x5 卷積核為例,通過下圖,可以看到,隨著PE個數的增加,對SRAM帶寬需求的增加,以及Inter-PE data propagation優化的效果:

ShiDianNao另一個重要的部件是Buffer Controller,這是用於在片上存儲NBin/NBout/SB與計算部件NFU之間協調數據交互的co-ordinator。Buffer Controller負責完成兩個功能:以流式的方式,layer-wise的為NFU提供計算所需數據的供給,以及緩衝NFU計算的partial輸出結果,匯總完一個完整layer/feature map上所有的output neuron之後才寫回到NBout。這裡比較關鍵的細節是,為了能夠高效地支持CNN模型中的不同操作對應的訪存特點,在Buffer Controller里提供了對多種read mode的支持:

稍微選幾個典型的讀取模式進行介紹。在上面這個圖裡,(a)/(b)/(e)模式主要用於為卷積層提供數據讀取,讀取的每個input neuron會對應於一個output neuron(注意:在ShiDianNao里,這些已經通過Buffer Controller讀取到PE中作為輸入的input neuron接下來會通過Inter-PE data propagation的機制進行傳遞,從而節省了SRAM的訪問帶寬),其中(e)對應於卷積核step size &> 1的情形。(d)對應於全連接層,讀取一個input neuron,會用作多個output neuron的輸入。

至此,ShiDianNao的設計思想的核心基本介紹完了,一些更為detail的細節,在論文里描述得很細緻,比如,NFU里支持CNN/Pooling/Normalization/DNN layer的細節、為了節省指令cache對控制指令進行了一層抽象。我認為已經不再影響把握論文的核心設計思想,所以這裡就不再詳述了。

最後還是評估環節,評估環境的搭建使用的是Synopsys提供的EDA工具,65nm(跟[1][3]相同)。Baseline則選取了CPU(Intel Xeon E7-8830/2.13GHZ/1TB Memory/gcc 4.4.7/MMX/SSE/SSE2/SSE4/SSE4.2)、GPU(NVIDIA K20M/5GB顯存/3.52TFlops/28nm/Caffe)以及DianNiao項目的第一個工作成果[9]。

評估的Benchmark使用了下表中所列出的10類較小規模的CNN模型(受限於片上SRAM的尺寸,在ShiDianNao里不能支持太大的CNN model,比如AlexNet。在這10個Benchmark model里,layer wise的神經元最多消耗45KB SRAM存儲,而模型的權重最多只消耗118KB SRAM,足以被ShiDianNao目前配備的288KB SRAM所支持):

評估所用的ShiDianNao,其NFU由8*8共計64個PE組成,也即在一個cycle里。同時支持64組乘/加組合運算,存儲上,由64KB NBin、64KB NBout、128KB SB和32KB的指令buffer組成。

評估指標還是集中在計算性能以及功耗兩個方面:

能夠看到,ShiDianNao在性能上相較於CPU/GPU的baseline都有顯著的speed up(46.38X than CPU,28.94X than GPU),相較於[9]里提出的加速器,也有1.87X的加速,這主要是因為ShiDianNao將模型全部hold在片上的SRAM里以及為了進一步減少SRAM訪存開銷設計的Inter-PE data propagation機制。

在功耗上,ShiDianNao的優勢則更為明顯,具體數字可以直接閱讀原始論文,值得一提的是ShiDianNao的功耗在不同硬體部件上的分配:

我們能夠看到,在ShiDianNao里,主要的功耗都集中在計算部件(NFU)上了,訪存部件帶來的功耗開銷並不大(小於15%),這與[9里的DianNao加速器]形成了巨大的差異:

不過,這個關於功耗的評估對比結果里有些tricky的地方是,在ShiDianNao里,一部分數據傳輸操作實際上從SRAM訪問操作里轉移到PE之間的Inter-PE data propagation之上了,這部分功耗被計算入了NFU里,但實際上還是屬於數據訪問相關的功耗開銷。這是我們在觀察這些實驗結果時要注意的地方。

最後說說我對這篇論文的一些思考。

這篇論文propose的加速器,適用面其實還是比較窄的,尺寸超過片上SRAM存儲極限的模型都無法支持。比如包含幾千萬權重參數的AlexNet這樣的model,肯定無法在ShiDianNao里被支持。當然這兩年來,有不少研究團隊提出了一些模型壓縮的技術,比如DeepScale提出的SqueezeNet[10]和ICLR16上提出的Deep Compression[11],能夠緩解ShiDianNao這樣的加速器的片上模型存儲的壓力,但ShiDianNao要求模型能夠全部hold在片上SRAM的約束,對於其通用性還是帶來了一些挑戰(相比而言,要求神經層的輸入/輸出神經元全部能夠hold在NBin/NBout倒並不是一個苛刻的約束),這個約束在[3][4]里並沒有看到。也許未來的一種可能是將ShiDianNao這樣專門針對特定場景的加速晶元與[3][4]這種更具通用性的加速器設計融合在一起,可以獲取到更好的性能/通用性的trade-off,當然其代價是晶元設計的複雜性。

最後想說的,真的是no free lunch。記得以前Knuth說過,系統的複雜性是恆定的,無非是在硬體和軟體之間的分配。當硬體遇到了階段性極限的時候,軟體設計人員就要去填充更多的複雜性。當軟體也遇到極限的時候,就需要硬體與軟體進行協同設計來改善系統複雜性。在DianNao系列工作中,能夠明顯看到這個trend。在[12]里也通過對體系結構頂會的技術主題的變遷進行了回顧分析,能夠看到軟硬體協同設計、應用驅動設計的趨勢。我個人相信,隨著計算資源越來越可以便利地獲取,網路帶寬的使用成本日益降低,通過計算設備滿足人類形形色色需求的應用驅動年代會更快/已經到來,在這個時代,應用/軟體/硬體相結合來提供更具ROI的解決方案會是相當長一段時間內的趨勢性現象。

References:

[1]. Zidong Du. ShiDianNao: Shifting Vision Processing Closer to the Sensor. ISCA, 2015.

[2]. A Brief Introduction to The Dianao Project. http://novel.ict.ac.cn/diannao/

[3]. Daofu Liu. PuDianNao: A Polyvalent Machine Learning Accelerator. ASPLOS, 2015.

[4]. Shaoli Liu. Cambricon: An Instruction Set Architecture for Neural Networks", in Proceedings of the 43rd ACM/IEEE International Symposium on Computer Architecture. ISCA, 2016.

[5]. Olivier Temam. A Defect-Tolerant Accelerator for Emerging High-Performance Applications. ISCA, 2012.

[6]. Fixed-point arithmetic. Fixed-point arithmetic

[7]. Latency Numbers Every Programmer Should Know. https://gist.github.com/jboner/2841832

[8]. D. Larkin, A. Kinane, V. Muresan, and N. E. O』Connor. An Efficient Hardware Architecture for a Neural Network Activation Function Generator. Advances in Neural Networks, ser. Lecture Notes in Computer Science, vol. 3973. Springer, 2006, pp. 1319–1327.

[9] T. Chen, Z. Du, N. Sun, J. Wang, and C. Wu. DianNao: a small-footprint high-throughput accelerator for ubiquitous machine learning. Proceedings of the 19th International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS), Salt Lake City, UT, USA, 2014, pp. 269–284.

[10]. Song Han. Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding. ICLR16.

[11]. Forrest N. Iandola. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and &<0.5MB model size. Arxiv, 2016.

[12]. 楊軍. ISCA 2016有哪些看點. ISCA 2016 有哪些看點? - 楊軍的回答

--------------------------------------------------------------------------------------------------------------

3. DaDianNao

DaDianNao[1]這篇文章是Diana項目[5]的第二篇代表性論文,發表在Micro 2014[6],並且獲得了當屆的best paper。這篇論文里針對主流神經網路模型尺寸較大的應用場景(想像一下AlexNet這樣的模型已經包含約6千萬個權重參數),提出了一種具備伸縮性,並通過這種伸縮性可以承載較大尺寸模型的加速器設計架構。」Da」也取得是中文「大」的諧音,用來意指伸縮性。這款加速器與針對嵌入式設備應用場景提出的ShiDianNao[13]不同,針對的應用場景是伺服器端的高性能計算,所以在計算能耗比上雖然相比於baseline(GPU/CPU)會有提升,但其設計核心還是專註於高性能地支持大尺寸模型,所以在硬體資源的使用上也遠比[13]要更為大方一些。

在我的理解中,這款加速器的核心設計思想包括幾個:

I. 使用eDRAM[3]代替SRAM/DRAM,在存儲密度/訪存延遲/功耗之間獲得了大模型所需的更適宜的trade-off(參見下表)。

II. 在體系結構設計中以模型參數為中心。模型參數(對應於神經網路中的突觸連接)存放在固定的eDRAM存儲區域中,需要通過訪存操作完成載入的是網路神經元(即對應於神經層layer的input/outout neurons)。這樣設計考慮的原因是,無論是神經網路的training還是inference環節,對於於DaDianNao的問題場景,模型的尺寸要遠遠大於數據尺寸以及網路神經層的神經元數據尺寸,所以將尺寸更大的神經網路模型參數固定,而將尺寸較小的神經元通過訪存操作進行載入、通信,可以減少消耗在訪存上的開銷。此外,模型參數會布署在距離計算部件很近的布局區域里,以減少計算部件工作過程中的訪存延時(這也是Computational RAM思想[10]的典型應用)。另一個原因在文章里沒有提到,而是我個人結合DianNao系列論文的解讀,模型參數在整體計算過程中會不斷地被複用,而神經元被複用的頻率則並不高,所以將模型參數存放在固定的存儲區域里,可以充分挖掘模型參數的data locality,減少片外訪存帶寬,同時提升整體加速器的性能。

III. 神經網路模型具備良好的模型可分特性。以常用的CNN/DNN這兩類神經層為例。 當單層CNN/DNN layer對應的模型參數較大,超過了DaDianNao單片存儲極限時(參見下圖的一下大尺寸的CNN/DNN layer,具體到這些layer所對應的應用場景,可以參見DaDianNao的原始論文中的參考文獻),可以利用這種模型可分性,將這個layer劃分到多個晶元上,從而通過多片連接來支持大尺寸模型。想更具體的把握這個問題,不妨這樣思考,對於CNN layer來說,每個feature map的計算(以及計算這個feature map所需的模型參數)實際上都是可以分配在不同的晶元上的,而DNN layer來說,每個output neuron的計算(以及計算這個output neuron所需的模型參數)也都是可以分配在不同的晶元上的。

正是基於上面的三個設計原則,在這篇論文中給出了DaDianNao的設計方案。在我的理解中,DaDianNao的邏輯結構與DianNao[11](見下圖)是非常相似的:

DaDianNao的主要區別還是在於針對存儲神經層輸入輸出數據的NBin/NBout,存儲神經連接參數的SB的組織方式,以及其與核心計算單元NFU的數據交互方式進行了針對大模型的專門考量。

把握DaDianNao的核心要素,也在於理解其訪存體系的設計思想及細節。

單個DaDianNao晶元內的訪存體系設計的高層次圖如下:

左圖是單個晶元的高層次圖,可以看到,單個晶元由16個Tile組成。右圖則是單個Tile的頂層結構圖。

每個tile內部會由一個NFU配上4個用於存儲SB的eDRAM rank組成。而NBin/NBout則對應於左圖eDRAM router所連接的兩條棕色的eDRAM rank。

看到上面的高層次圖,會感受到在DaDianNao里,SB其實是採用了distributed的方式完成設計的,並不存在一個centralized的storage用於存儲模型的參數。這個設計細節的選取考量我是這樣理解的:

I.eDRAM與DRAM相比,雖然因為其集成在了晶元內部,latency顯著變小,但是因為仍然有DRAM所存在的漏電效應,所以還是需要周期性的刷新,並且這個刷新周期與DRAM相比會變得更高[4],而周期性的刷新會對訪存性能帶來一定的負面影響。所以通過將SB存儲拆分成多個Bank,可以將周期性刷新的影響在一定程度上減小。

II.將SB拆分開,放置在每個NFU的周圍,可以讓每個計算部分在計算過程中,訪問其所需的模型參數時,訪存延遲更小,從而獲得計算性能上的收益。

NFU的內部結構圖如下所示:

從上圖,能夠看到NFU的每個Pipeline Stage與NBin/NBout/SB的交互連接通路。 而針對不同的神經層,NFU的流水線工作模式可以見下圖:

注意,上圖裡紅色的「The eDram」代表的就是SB存儲。

以上是單個DaDianNao晶元的設計,而單個DaDianNao的片上用於存儲模型參數的SB存儲仍然有限(見下圖,單個晶元里,用於NBin/NBout的central eDRAM尺寸是4MB,而每個Tile里用於SB的eDRAM尺寸則是2MB,每個晶元由16個Tile組成,所以單個晶元的eDRAM總量是2 * 16 + 4 = 36MB),所以為了支持大模型,就需要由多個DaDianNao晶元構成的多片系統。

DaDianNao里的多片互聯部分並沒有進行定製開發,而是直接使用了HyperTransport 2.0[12]通信IP,在每個DaDianNao晶元的四周(每個晶元會跟上下左右四個鄰近的DaDianNao晶元連接)提供了共四組HT 2.0的通信通道,每個通道的通信帶寬是在in/out方向分別達到6.6GB/s,支持全雙工通信,inter-chip的通訊延遲是80ns。

有了inter-chip的連接支持,DaDianNao就可以支持大尺寸的模型了。不同模型,在inter-chip的工作模式下,通信的數據量也有較大的差異:

能夠看到,相較於卷積層(CONV),全連接層(full NN)在多片模式下,通信耗時明顯更多。 同樣,卷積層的多片加速比也遠大於全連接層(對於一些全連接層,甚至在Inference環節,出現多片性能低於單片的情形,這也算make sense,畢竟,inference環節的計算通信比要小於training環節):

具體的細節評估指標,在這裡就不再引入,感興趣的同學可以直接參考原始論文。

References:

[1]. Yunji Chen. DaDianNao: A Machine-Learning Supercomputer. Micro, 2014.

[2]. S.-N. Hong and G. Caire. Compute-and-forward strategies for cooperative distributed antenna systems. In IEEE Transactions on Information Theory, 2013.

[3] eDRAM. eDRAM

[4]. Mittal. A Survey Of Architectural Approaches for Managing Embedded DRAM and Non-volatile On-chip Caches. IEEE TPDS, 2014.

[5]. A Brief Introduction to The Dianao Project. http://novel.ict.ac.cn/diannao/

[6]. Micro 2014. MICRO-47 Home Page

[7]. N. Maeda, S. Komatsu, M. Morimoto, and Y. Shimazaki. A 0.41a standby leakage 32kb embedded sram with lowvoltage resume-standby utilizing all digital current comparator in 28nm hkmg cmos. In International Symposium on VLSI Circuits (VLSIC), 2012.

[8]. G. Wang, D. Anand, N. Butt, A. Cestero, M. Chudzik, J. Ervin, S. Fang, G. Freeman, H. Ho, B. Khan, B. Kim, W. Kong, R. Krishnan, S. Krishnan, O. Kwon, J. Liu, K. McStay, E. Nelson, K. Nummy, P. Parries, J. Sim, R. Takalkar, A. Tessier, R. Todi, R. Malik, S. Stiffler, and S. Iyer. Scaling deep trench based edram on soi to 32nm and beyond. In IEEE International Electron Devices Meeting (IEDM), 2009.

[9]. DDR3 SDRAM Part Catalog. Micron Technology, Inc.

[10]. Computational RAM. Computational RAM

[11] T. Chen, Z. Du, N. Sun, J. Wang, and C. Wu. DianNao: a small-footprint high-throughput accelerator for ubiquitous machine learning. Proceedings of the 19th International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS), Salt Lake City, UT, USA, 2014, pp. 269–284.

[12]. HyperTransport. HyperTransport

[13]. Zidong Du. ShiDianNao: Shifting Vision Processing Closer to the Sensor. ISCA, 2015.

---------------------------------------------------------------------------------------------------------------

4.DianNao

[1]是DianNao項目[2]的第一篇,也是篇開創性論文,發在了ASPLOS 14上,並且獲得了當年的best paper。

如果用一句話來提煉這篇論文的核心思想,我想可以這樣總結:

結合神經網路模型的數據局部性特點以及計算特性,進行存儲體系以及專用硬體設計,從而獲取更好的性能加速比以及計算功耗比。

因為我閱讀DianNao項目系列論文是按時間序反序延展的,先後讀的是PuDianNao[5]-&>ShiDianNao[4]-&>DaDianNao[3],最後讀的是DianNao這篇論文。所以從設計複雜性來說,ASPLOS 14的這篇論文應該說是最簡單的。當然,這樣說並不是說這篇論文的價值含量比其他論文低。恰恰相反,我個人以為這篇論文的價值其實是最高的,因為這是一篇具備開創性意義的論文,在科研領域,我認為starter要比follower更有意義的多,這種意義並不會因為follower在執行操作層面的出色表現就可以減色starter的突破性貢獻。 因為starter是讓大家看到了一種之前沒有人看到的可能性,而follower則是在看到了這種可能性之後,在執行操作層面的精雕細琢。幾個經典的例子就是第一個超導材料的發現帶動了後續多種超導材料的發現,以及劉易斯百米短跑突破10秒之後帶動了多位運動員跑入10秒之內的成績。

在[1]這篇論文里,先是回顧了之前常見的神經網路的全硬體實現方案(full-hardware implementation)——將每個神經元都映射到具體的硬體計算單元上,模型權重參數則作為latch或是RAM塊實現,具體的示意結構圖如下:

這種方案的優點很明顯,實現方案簡潔,計算性能高,功耗低。缺點也不難想像,擴展性太差,無論是模型topology的變化,還是模型尺寸的增加都會使得這種方案無法應對。下面針對不同 input neurons/網路權重數 的network layer給出了full-hardware implementation在硬體關鍵路徑延時/晶元面積/功耗上的變化趨勢,能夠直觀地反映出full-hardware這種實現方案的伸縮性問題:

針對full-hardware方案的不足,在[1]里提出了基於時分復用原則的加速器設計結構:

在這個設計結構里,加速器晶元里包含三塊片上存儲,分別是用於存儲input neurons的NBin、存儲output neurons的NBout以及用於存儲神經網路模型權重參數的SB。這三塊存儲均基於SRAM實現,以獲取低延時和低功耗的收益。片上存儲與片外存儲的數據交互方式通過DMA來完成,以儘可能節省通訊延時。

除了片上存儲以外,另一個核心部件則是由三級流水線組成的NFU(Neural Functional Unit),完成神經網路的核心計算邏輯。

時分復用的思想,正是體現在NFU和片上存儲的時分復用特性。針對一個大網路,其模型參數會依次被載入到SB里,每層神經layer的輸入數據也會被依次載入到NBin,layer計算結果寫入到NBout。NFU里提供的是基礎計算building block(乘法、加法操作以及非線性函數變換),不會與具體的神經元或權重參數綁定,通過這種設計,DianNao晶元在支持模型靈活性和模型尺寸上相較於full-hardware implementation有了明顯的改進。

DianNao加速器的設計中一些比較重要的細節包括:

I. 使用16位定點操作代替32位浮點,這在模型的精度方面,損失並不大

但是在晶元面積和功耗上都獲得了明顯的收益

II. 之所以將片上SRAM存儲劃分為NBin/NBout/SB這三個分離的模塊,是考慮到SRAM的不同訪存寬度(NBin/NBout與SB的訪存寬度存在明顯差異,形象來說,NBin/NBout的訪存寬度是向量,而SB則會是矩陣)在功耗上存在比較明顯的差異:

拆分成不同的模塊,可以在功耗/性能上找到更佳的設計平衡點。而將訪存寬度相同的NBin/NBout也拆分開來的原因則是為了減少data conflict,因為NBin/NBout扮演的還是類似於cache的角色,而這兩類數據的訪存pattern並不盡相同,如果統一放在一塊SRAM里,cache conflict的概率會增大,所以通過將訪存pattern相近的數據對應於不同的SRAM塊,「專款專用」,可以進一步減少cache conflict,而cache conflict的減少,無論是對於性能的提升,還是功耗的減少都會有著正面的意義。

III. 對input neurons數據以及SB數據局部性的挖掘。用通俗一些的說法,其實就是把輸入數據的載入與計算過程給overlap起來。在針對當前一組input neurons進行計算的同時,可以通過DMA啟動下一組input neurons/SB參數的載入。當然,這要求精細的co-ordination邏輯保證。另外,這也會要求NBin/SB的SRAM存儲需要支持雙埠訪問,這對功耗和面積會帶來一定的影響[6]。

IV. 對output neurons數據局部性的挖掘。在設計上,為NFU引入了專用寄存器,用於存儲output neurons對應的partial計算結果(想像一下對應於全連接層的一個output neuron,input neurons太多,NBin放不下,需要進行多次載入計算才能完成一個output neuron的完整結果的輸出)。並且會在設計上將NBout用作專用寄存器的擴展,存放partial計算結果,以減少將partial計算結果寫入片外存儲的性能開銷。

整體上的設計思想大體上如上所述。

在實驗評估上,可能是因為作為第一個milestone的工作結果,還有很多細節有待雕琢,所以在baseline的選取上與後續的幾篇論文相比,顯得有些保守,在這篇論文里只選取了CPU作為baseline,並未將GPU作為baseline。具體的評估細節及指標可以直接參看原始論文,我這裡不再重複。References:

[1]. Tianshi Chen. DianNao: A Small-Footprint High-Throughput Accelerator for Ubiquitous Machine-Learning. ASPLOS, 2014.

[2]. A Brief Introduction to The Dianao Project. http://novel.ict.ac.cn/diannao/

[3]. Yunji Chen. DaDianNao: A Machine-Learning Supercomputer. Micro, 2014.

[4]. Zidong Du. ShiDianNao: Shifting Vision Processing Closer to the Sensor. ISCA, 2015.

[5]. Daofu Liu. PuDianNao: A Polyvalent Machine Learning Accelerator. ASPLOS, 2015.

[6]. What is dual-port RAM. Dual port memory, dual ported memory, Ports, sdram, sram, sdram, memories


這篇文章在前兩輪的投稿中運氣不好沒能被接收,這次在體系結構的頂級會議International Symposium on Computer Architecture (ISCA) 總分排名第一,非常替它的作者們感到驕傲。只可惜ISCA沒有像體系的另外兩個會議MICRO和HPCA設置最佳論文。

大多數現有的基於的ASIC(專有集成電路)的神經網路加速器的主要問題之一是它的可編程性跟可擴展性。它們通常是針對某一類或者小部門特定的神經網路技術跟演算法設計的,控制信號設計比較high-level,對應神經網路的某一層甚至整個神經網路,好處是容易implement,壞處是缺少靈活性。比如DaDianNao可以支持feed-forward的MLP,但暫時無法支持BM。今年電路設計得頂級會議ISSCC的Session 14有6篇神經網路加速器的不同實現,它們都是application-specific的設計,基本都有類似上面提到的問題,感興趣的可以去看一下。

這篇文章提出來的指令性更加low-level,使得它可以支持不同的神經網路演算法。我的理解是把現有的神經網路現有加速器的設計從「CISC」轉變到"RISC",設計原則是把複雜的high-level的功能塊(比如卷積層)分解成簡單的更加通用的計算單元(比如點乘),這些簡單的指令集可以更加靈活支持不同類型的神經網路操作,同時還降低了指令解碼器的複雜度。

具體細節要等正式會議或者作者把預覽文章提前掛在主頁上才能知道。

另外值得一提的是今年的ISCA會有很多篇關於神經網路加速器的文章,包括Stanford的Bill Dally組,MIT, UCSB, HP Labs/Utah等等,可以說是神經網路加速器在體系結構全面開花的一年。


2016.11

論文已經發表,請看這條答案:
中科院說的深度學習指令集diannaoyu到底是什麼? - 楊軍的回答 - 知乎

2016.03

簡述:「寒武紀」項目的專用指令集。所以只有【人工神經網路加速】一種用途。具體細節要等到論文在會議上發表才能知道。

1. 簡單科普可以閱讀過去的演講記錄:
圖靈社區 : 閱讀 : 【X開放日】陳雲霽教授解析寒武紀神經網路計算機

2. 寒武紀一號的實際能力如何?
中科院的「寒武紀1號」晶元和IBM 的「真北」晶元有什麼不同? - 知乎用戶的回答

3. 各種處理器的區別?
52知識點之一:各種處理器的區別

4. 陳教授的特別趣味:

DaDianNao、DianNao、DianNaoYu、PuDianNao、ShiDianNao 分別是指什麼?


可以看看以下幾篇論文,或許能答疑解惑:

1.Shaoli Liu, Zidong Du, Jinhua Tao, Dong Han, Tao Luo, Yuan Xie, Yunji Chen, and Tianshi Chen, "DianNaoYu: An Instruction Set Architecture for Neural Networks", in Proceedings of the 43rd ACM/IEEE International Symposium on Computer Architecture (ISCA"16), 2016.

2.Zidong Du, Robert Fasthuber, Tianshi Chen, Paolo Ienne, Ling Li, Tao Luo, Xiaobing Feng, Yunji Chen, and Olivier Temam, "ShiDianNao: Shifting Vision Processing Closer to the Sensor", in Proceedings of the 42nd ACM/IEEE International Symposium on Computer Architecture (ISCA"15), 2015.

3.Daofu Liu, Tianshi Chen, Shaoli Liu, Jinhong Zhou, Shengyuan Zhou, Olivier Temam, Xiaobing Feng, Xuehai Zhou, and Yunji Chen, "PuDianNao: A Polyvalent Machine Learning Accelerator", in Proceedings of the 20th ACM International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS"15), 2015.

4.Yunji Chen, Tao Luo, Shaoli Liu, Shijin Zhang, Liqiang He, Jia Wang, Ling Li, Tianshi Chen, Zhiwei Xu, Ninghui Sun, and Olivier Temam, "DaDianNao: A Machine-Learning Supercomputer", in Proceedings of the 47th IEEE/ACM International Symposium on Microarchitecture (MICRO"14), 2014.

5.Tianshi Chen, Zidong Du, Ninghui Sun, Jia Wang, Chengyong Wu, Yunji Chen, and Olivier Temam, "DianNao: A Small-Footprint High-Throughput Accelerator for Ubiquitous Machine-Learning", in Proceedings of the 19th ACM International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS"14), 2014.


跑個題吧!

前幾天恰好有幸聽了陳老師的一場報告,Diannaoyu因為還沒有發表,陳老師介紹的也不是很多,不過陳老師是介紹了從Dadiannao到現在這些名字的來源的,核心就是本來他們團隊是要起高大上的英文名的,不過因為合作的公司說:「你們還是起個中文名吧,這樣對我們來說這是個外國貨」……所以……

只是看到上面有答案下面評論提到了這個名字的問題扯兩句


寒武紀流片了嗎?很想用它,並進行開發及推廣,支持我們自己的DianNao。


詳見isca 2016,個人感覺可能又是一篇best paper……


推薦閱讀:

如何看待Jeff Dean&Hinton投到ICLR17的MoE的工作?
有沒有非線性版本的 矩陣分解,壓縮感知,稀疏編碼?
深度學習在量化投資方面都有哪些可以借鑒應用的地方?如何結合一些策略方法?
在機器學習領域, 不同框架實現的相同演算法,差別能有多大?
截至2017年3月,音樂和人聲分離的研究有哪些最新進展?

TAG:人工智慧 | 晶元集成電路 | 神經網路 | 中科院計算技術研究所 | 深度學習DeepLearning |