摘要:陳云霽陳天石課題組在國際上提出了較早的深度學習處理器架構寒武紀。而則是寒武紀的指令集。模擬實驗表明,采用指令集的深度學習處理器相對于指令集的有兩個數量級的性能提升。
背景:
中科院計算所提出國際上較早的深度學習指令集DianNaoYu
2016年3月,中國科學院計算技術研究所陳云霽、陳天石課題組提出的深度學習處理器指令集DianNaoYu被計算機體系結構領域較高級國際會議ISCA2016(International Symposium on Computer Architecture)所接收,其評分排名所有近300篇投稿的第一名。論文第一作者為劉少禮博士。
深度學習是一類借鑒生物的多層神經網絡處理模式所發展起來的智能處理技術。這類技術已被微軟、谷歌、臉書、阿里、訊飛、百度等公司廣泛應用于計算機視覺、語音識別、自然語言處理、音頻識別與生物信息學等領域并取得了極好的效果。基于深度學習的圍棋程序AlphaGo甚至已經達到了職業棋手的水平。因此,深度學習被公認為目前最重要的智能處理技術。
但是深度學習的基本操作是神經元和突觸的處理,而傳統的處理器指令集(包括x86和ARM等)是為了進行通用計算發展起來的,其基本操作為算術操作(加減乘除)和邏輯操作(與或非),往往需要數百甚至上千條指令才能完成一個神經元的處理,深度學習的處理效率不高。因此谷歌甚至需要使用上萬個x86 CPU核運行7天來訓練一個識別貓臉的深度學習神經網絡。
陳云霽、陳天石課題組在國際上提出了較早的深度學習處理器架構寒武紀。而DianNaoYu則是寒武紀的指令集。DianNaoYu指令直接面對大規模神經元和突觸的處理,一條指令即可完成一組神經元的處理,并對神經元和突觸數據在芯片上的傳輸提供了一系列專門的支持。模擬實驗表明,采用DianNaoYu指令集的深度學習處理器相對于x86指令集的CPU有兩個數量級的性能提升。
指令集是計算機軟硬件生態體系的核心。Intel和ARM正是通過其指令集控制了PC和嵌入式生態體系。寒武紀在深度學習處理器指令集上的開創性進展,為我國占據智能產業生態的領導性地位提供了技術支撐。
兩篇論文
楊軍 從事大規模機器學習系統研發及應用相關工作
(更新歷史: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浮點數的精度,能夠看到,32bi&16bit的混合設計,對于模型精度影響并不大。?
相較于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 有哪些看點? - 楊軍的回答
作者:楊軍鏈接:https://www.zhihu.com/question/41216802/answer/124409366
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/4434.html
摘要:年,中科院計算所半導體所有關研制大規模集成電路的單位和廠合并,成立中科院微電子中心。目前是國資比例最高通過中國長城控股的國產企業,是聚焦國家戰略需求和重大項目的國家隊。年,海光信息同達成合作,共同合資成立兩家子公司,引入架構授權。本文將重點圍繞國產CPU的發展歷程與當前產業鏈各領軍企業的布局情況作詳盡解讀(并包含特大號獨家整理的最新進展),具體如下:1、國產CPU發展歷程回溯2、飛騰:PK生...
摘要:受到其他同行在上討論更好經驗的激勵,我決定買一個專用的深度學習盒子放在家里。下面是我的選擇從選擇配件到基準測試。即便是深度學習的較佳選擇,同樣也很重要。安裝大多數深度學習框架是首先基于系統開發,然后逐漸擴展到支持其他操作系統。 在用了十年的 MacBook Airs 和云服務以后,我現在要搭建一個(筆記本)桌面了幾年時間里我都在用越來越薄的 MacBooks 來搭載一個瘦客戶端(thin c...
摘要:月日,各項競賽的排名將決定最終的成績排名。選手通過訓練模型,對虛擬股票走勢進行預測。冠軍將獲得萬元人民幣的獎勵。 showImg(https://segmentfault.com/img/bVUzA7?w=477&h=317); 2017年9月4日,AI challenger全球AI挑戰賽正式開賽,來自世界各地的AI高手,將展開為期三個多月的比拼,獲勝團隊將分享總額超過200萬人民幣的...
閱讀 2616·2023-04-25 22:09
閱讀 2846·2021-10-14 09:47
閱讀 1950·2021-10-11 11:10
閱讀 2694·2021-10-09 09:44
閱讀 3390·2021-09-22 14:57
閱讀 2504·2019-08-30 15:56
閱讀 1624·2019-08-30 15:55
閱讀 785·2019-08-30 14:13