閱讀220 返回首頁    go 阿裏雲 go 技術社區[雲棲]


地平線譚洪賀:AI芯片怎麼降功耗?從ISSCC2017說起


0?wx_fmt=png

先來一張slide鎮鎮場,tutorial上Verhelst總結了近幾年VLSI和ISSCC會議上發表的一些結果。其中,灰色的圖標應該都是ISSCC2017以前的結果。這張圖體現了性能、錯誤率、能效三方麵的trade off。


性能上,大家似乎很難超GPU,但是能效上,可以算是秒殺。大家都喜歡拿自己的數據和NVIDIA的GPU比較,然後可以給出很漂亮的對比結果,甩出NVIDIA幾條街。

但是大家也不要興奮,學術界成果給出的數據,總是不能閉著眼睛就接受的。大家都是過來人,都懂的。


640?wx_fmt=png


目錄

1、使用低功耗工藝。涉及14.1,14.5
2、降低數據計算功耗
2.1 降低weight量化位數。涉及14.2
2.2 優化乘法。涉及14.2
2.3 降低計算精度。涉及14.5
2.4 稀疏化。涉及NVIDIA,combricon,leuven
3、降低數據翻轉功耗。涉及14.3
4、降低數據存儲訪問功耗。涉及14.6,14.7
5、存儲器上的新花樣


1. 使用低功耗工藝


一般提到低功耗工藝,可能大家普遍想到的還是foundary的low power工藝,HVT/LVT library等。


在ISSCC 2017的session 14上,出現了SOI工藝的身影。有幾家以可穿戴或IOT為應用目標的研究機構已經使用SOI工藝來做DL processor了。


下表列出了ISSCC2017上的幾篇文章使用的工藝。session中有有兩篇使用了FDSOI工藝,Forum中,ETH Zurich的PULP項目的芯片也使用了28nm FDSOI。


640?wx_fmt=png


作為做IOT等低功耗產品所喜歡的工藝,FD-SOI工藝的優點是:

a.well和襯底 間的寄生電容很小,漏電小,減少了靜態功耗。

b.可以通過控製Body Bias的電壓,來控製晶體管的工作。


如果加入正偏壓,可以提高器件響應速度,增強性能;如果加入負偏壓,相當於可以關掉晶體管,使晶體管隻有很低的漏電流,大概是1pA/micron的水平。


這種方式關閉、開啟電路器件的方式,要比power gate控製速度快。


不過,工藝這件事,不是你想用哪家就可以用哪家的事情。ISSCC上發文章的都還是以高校研究院所為主。對他們來說,SOI工藝的成本還是太高。你看KAIST的文章,前兩年是65nm,這兩年的文章還是以65nm為主。


2.降低數據計算功耗


14.1的文章用圖形顯示現在流行了幾家Net裏的操作以及參數的數量級。可以看到,為了解決更複雜的應用和提高準確度,操作數量和參數數量都很嚇人。

0?wx_fmt=jpeg



從14.1的另外一張圖中可以看到,對於AlexNet的不同layer,操作和參數的數量是不同的。尤其是,對於卷基層和全連接層,操作以及參數的數量都差別較大。


0?wx_fmt=jpeg


再看14.2的一張圖,對於卷基層、全連接層和RNN,操作和參數的數量差別也很大。不用太糾結與14.1的區別,14.2這裏沒有提這些模型參數的具體來源。


0?wx_fmt=jpeg


因此,直觀地,在不能大幅降低算法精度的前提下,為了降低功耗,可以拍腦袋想出好幾方麵:

a.減少參與操作的數據或參數的數量。例如,稀疏化方案。

b.減少操作數的字長。例如,降低weight量化位數。

c.減少操作的複雜度。例如,優化乘法計算,降低乘法計算的精度。
下麵就帶著讀者來看看ISSCC上各家高手們是怎麼在這幾方麵各顯神通的。


2.1 降低weight量化位數


14.2提出了一種在線調整的動態定點方法。從給出的對比圖中可以看出,這個方法可以隻使用4bit來量化weight,達到其他方法8bit的精度。


0?wx_fmt=jpeg


這個方法的理論基礎是,對於每一層,weight的最大值是不一樣的,weight參數的分布也是不一樣的。


在我們知道weight分布大概是一個高斯分布的基礎上,可能隻需要關心3個σ以內的weight數值。那麼,每一層有效的weight數值的取指範圍就會不一樣。


如果,將每一層weight數值都乘以一個不同的係數,例如,左移或右移幾bit,那麼,就有可能將不同層的weight分布轉換為相同或相近的分布形態。


進一步的,就可以在保留精度的基礎上,用相同的bit來進行量化。


0?wx_fmt=jpeg


0?wx_fmt=jpeg


理論基礎很簡單,所以必然是有牛人認識到這個問題的。


14.2引用的一個方法是基於離線學習的動態定點方法,就是在訓練學習的過程中確定每一層weight表示的小數點位置。這是依賴於訓練數據的。


14.2的方法是在線調整的動態定點方法。在實際計算過程中,每層根據累加器的計算溢出情況,修改一次fraction point位置。


0?wx_fmt=jpeg


0?wx_fmt=jpeg


0?wx_fmt=jpeg


從其給出的結果看,全部使用4bit字長來表示weight,效果還不錯。除了最初幾幀,使用4bit字長所能得到的score,和使用32bit浮點的結果是差不多的。


從能效的對比結果看,還是很有效果的。但是,文章中的能效數據的提高,並不隻是依賴於這個方法(還是用了基於LUT的乘法,稍後介紹)。


0?wx_fmt=jpeg



BNN

比4bit更激進的,可以是2bit。最極端的,weight可以是1bit。當weight變為1bit的時候,就成了一種特殊的網絡——BNN(binary neutral network)。


近來研究BNN的也不少,隻是ISSCC2017的正式論文裏還沒有專門針對BNN的。ISSCC2017最後一天的forum裏(forum好貴),來自ETH Zurich的PULP項目做的處理器對BNN的計算進行了專門優化。需要讚的是,他們的加速器的名字比較牛——YodaNN。Yoda,對,就是Starwars 裏麵的絕地武士,Yoda大師,"small in size but wise and powerful"的Yoda大師。親愛的做IC的兄弟們,“May the force be with you”。


2.2 優化乘法


可以接著上一節繼續說了,還是14.2這篇文章,用查找表的方式來代替乘法運算。


作者將輸入乘法器的16bit數據分割為4個4bit數。16bit乘法變成4個4bit乘法然後求和的運算。為了快速實現4bit乘法,作者使用了查表的方式。作者將weight的奇數倍結果預先存到LUT內(偶數倍不需要真的存下來),乘法就變成了查表。這個方法是要結合這篇文章的動態策略(見上一節)來使用的。


看到這裏,如果你想問“這種形式的乘法器和16bit直接乘相比,究竟能省多少功耗?”,那麼說明你可以在工程師這條路上走的更遠、飛的更高。答案,我也不知道。除了圖裏顯示的邏輯電路,你還得考慮,weight的寬度,weight的選擇電路實現,等等。理論上,weight的寬度是不限製的。但是,weight的寬度會影響部分積PP0/1/2/3、部分和PS1/2的寬度。


14.2中,最後將w的寬度定為了4bit。


0?wx_fmt=jpeg


14.2還提出了一種基於量化表的乘法實現方式,以降低全連接層(FCL)的計算功耗。作者將訓練得到的FCL的浮點weight值進行非均勻分布的量化。可以是4-7 bit的量化。以4bit量化為例,得到16個量化後的weight值,然後針對一個輸入數據i,分別乘以16個weight值,計算得到16個乘法結果,存為table。14.2的設計中,如果是4bit量化,可以同時存8個這種table(如果對weight做7bit量化,隻能存一個table)。在做FCL計算時,先取8個數點,得到8個table,然後把這8個輸入點相關的所有MAC計算做完,可以得到輸出點的部分和。然後,再選另外8個輸入點,產生新的8個table,繼續計算部分和。不斷循環,得到輸出層的所有結果。基於這種方法,除了建立table,所有乘法計算都被替換成了查表。


0?wx_fmt=jpeg


0?wx_fmt=jpeg


0?wx_fmt=jpeg


0?wx_fmt=jpeg


根據文章描述,減少了99%的乘法計算量,降低了75%的片外存儲器的帶寬。這對降低功耗都是有積極貢獻的。從對比結果看,能效優勢明顯。哦,對了,需要提一下,用來對比的是han song的EIE那篇文章,電壓一欄的數據明顯不對(不要讚我有一雙發現美的眼睛)。


0?wx_fmt=jpeg



2.3 降低計算精度


其實,前麵說的降低weight的量化位數,也可以算是一種降低計算精度。隻要能滿足應用需求就行。


但是,這一節說的降低計算精度,是另外的事情。


14.5文章裏,提到了DVAFS。作為一個IC工程師,DVFS自然知道的。那麼DVAFS是什麼鬼?看英文,Dynamic-Voltage-Accuracy-Frequency-Scaling。好吧,字麵意思知道了,具體呢?


其實,Dynamic Accuracy並不是ISSCC2017的文章裏首次提出來的概念。14.5的文章作者Moons引用了自己JSSC2016上的文章,見圖。有的時候,兩個4bit數相乘時,結果的LSB可能並不重要,隻需要MSB結果就可以了。於是,直接算一下兩個4bit數的高2bits相乘的結果就可以了。這就是dynamic accuray的概念了。至於,什麼時候需要4bit乘的結果,什麼時候隻需要高2bit乘的結果,誰知道呢。動態的意思就是說,自己看著辦吧。對結果準確度要求高的時候,用4bit乘吧;對功耗要求高的時候,用2bit乘吧。你開心就好。


0?wx_fmt=jpeg


既然提到了DVAFS,就簡單說說吧。上麵提到的DVAS中,如果隻做2bit乘,會有其他3/4的乘邏輯沒有工作。此時,可以利用其中的一部分,同時做另外一個2bit乘法。這樣,同時就做了兩個2bit乘法。從效率角度看,相當於頻率提高了一倍。


14.5中,根據算法或應用需要,可以動態配置乘法器,為一個16bit乘法,或者是2個8bit乘法,或是4個4bit乘法。這就是DVAFS和DVAS的區別了。


0?wx_fmt=jpeg


有心的人可能早就發現了,14.2中基於LUT的可配置乘法器也是可以當做4個4bit乘、2個8bit乘或是1個16bit乘的。哎呦,不錯哦。


2.4 稀疏化


(ISSCC2017對稀疏化沒有特別值得談的亮點,本節純屬贈送)


稀疏化是Deep learning算法的一個趨勢,對硬件加速器或處理器的設計實現有較大的影響。但是,稀疏化並不是為了降低功耗而出現的。先有算法的稀疏化,然後設計加速器和處理器的吾等苦*們就要考慮如何應對這種奇葩的情況。


先簡單掃盲一下,稀疏化可以分為feature稀疏化和weight稀疏化。


feature稀疏化:feature經過卷積計算後,再經過ReLU,就會變得稀疏。找張圖看吧,不多說了。

0?wx_fmt=png


weight稀疏化:用來做卷積的kernel中的weight參數,可以有一部分為0。


如果不管稀疏化,還用原來的加速器或處理器來執行稀疏化後的算法,那麼就會有很多浪費的存儲和計算。所以,稀疏化給IC工程師帶來了一係列問題。


  • ReLU計算之後的0值,要不要存儲到片外memory或片內sram內?

  • 稀疏化的weight參數,怎麼存儲?0元素要不要存?

  • 大量的0元素,如果存在memory裏,很浪費空間。如果不存,電路讀feature或weight的時候,怎麼知道哪些數據是0,哪些不是?

  • 有0元素參與的乘運算,怎麼處理?調用MAC直接計算一下a*0?還是直接bypass MAC?


ok,好多問題。有沒有一臉的懵圈?


真想看看同行們是怎麼做的,遺憾的是,ISSCC2017上的幾篇文章,都沒有太多針對稀疏化的新的亮點。那就用上搬山、 卸嶺之能,開動發丘、摸金之術,隨便看看吧。


LEUVEN的ENVISION


來自leuven的14.5的這篇文章裏,提到使用了sparse network。但是,這不是他們今年的新亮點,這是他們VLSI2016上的工作。見圖,sparsity的信息存儲在GUARD SRAM中,用來控製乘法器模塊是否進行計算。如果乘數為0,FRD SRAM中的index會是0,就會關閉相應位置的乘法,節省計算功耗。


0?wx_fmt=jpeg


直接上VLSI2016上的文章的截圖。在GRD SRAM的幫助下,功耗可以優化1.9x。借用moons這篇文章的一張表,可以看到稀疏化帶來的好處。


0?wx_fmt=jpeg


0?wx_fmt=jpeg


Eyeriss


由於在ISSCC2017會場見到了vivienne,就把她們ISSCC2016的牛文eyeriss拿出來說說吧(這奇怪的邏輯也是沒誰了)。


Eyeriss在處理稀疏化的feature上的做法是:壓縮。設計了一種壓縮方式,將稀疏化的feature壓縮後存儲到外部DRAM內。效果呢,如下圖,可以降低存儲空間。考慮到DRAM訪問的功耗不小,也算是降低了功耗。


0?wx_fmt=jpeg


在處理有關0值參與的乘法運算時,eyeriss使用了skip的方法:遇到0,跳過乘法計算(從圖上看,實際是計算的0*0),跳過weight參數的讀取,可以節省PE的功耗45%。


0?wx_fmt=jpeg


總結一下,針對稀疏化,eyeriss做了三點:不從ram中讀0值,不做乘0的乘法,壓縮片外數據存儲。都可以降低功耗。


此外,還有兩個報告提及了稀疏化。


NVIDIA

NVIDIA在ISSCC2017最後一天的forum上做了報告。


NVIDIA報告基本上都在講Han Song的那篇EIE的peper,有興趣的去翻翻吧。


寒武紀

同樣在forum上,寒武紀的報告把diannao家族深情地回憶了一遍,沒有提及cambricon指令集(ISA屬於計算機架構了,ISCA上講才合適嘛),也沒有提及用於sparse neural network的Cambricon-X加速器(處女座要哭,作為DL加速器,竟然不是diannao家族成員。起名cambricon-X,竟然不是cambricon 指令集的擴展。這聽起來不make sense啊)。


對cambricon-X感興趣的,自行google學術吧。哦,對不起,上不去,百度學術吧。繼續吐槽,百度挺不錯的,能在最硬的國際會議的forum上做一個又虛又軟的報告,也是能力的一種體現。


3.降低數據翻轉功耗


14.3文章中做了些有意思的工作,分析了一下weight的分布,發現weight是均值為0的高斯分布。如果用傳統的二進製補碼(TC)的方式表示,負數表示中為1的bit會很多。而如果用符號位+幅值(SM)的方式表示,可以降低為1的bit數,進而就可以減少計算的翻轉率,從而降低計算功耗。


0?wx_fmt=jpeg


0?wx_fmt=jpeg


廢話少說,直接上圖。實驗結果顯示,SM的功耗略低於TC。下圖,隻看最左邊三個數據既可以了。


0?wx_fmt=jpeg


4.降低數據存儲訪問功耗


0?wx_fmt=jpeg


借ISSCC2016的那篇Eyeriss的一張slide。可看到,數據訪問所帶來的功耗要遠大於計算的功耗。因此,可以從兩方麵著手,降低係統執行Deep Learning算法時的memory訪問功耗。


一,減少存儲功耗。例如,前麵說的稀疏化,減少了feature和weight,通過壓縮或者特殊設計的存儲方式,就可以降低存儲空間。不再累述。


二,減少訪問功耗。這方麵今年有幾篇文章都有亮點。


14.6
先看14.6的文章,又是KAIST的。不得不吐槽,看人家的IEEE Fellow,學生發ISSCC跟bbs上灌水似得(不知道bbs是啥的,沒關係,說明你很年輕)。去年在ISSCC2016的session14上灌了4篇文章,今年在session14上灌了兩篇。


書回正傳,14.6首先將feature乘以矩陣kernel近似成了兩步乘以向量的運算。然後,引入一種定製的7T bit-cell的SRAM,可以支持行方向和列方向兩種讀取模式,即其所謂的conventional r/w和transposed r/w。


分析一下,將矩陣分解成獨立的兩個向量,可以減少weight參數數量,減少weight讀取次數;引入transposed r/w,可以一個周期讀取列方向多個數據,可以減少訪問sram列方向的次數。綜合下來,給出的實驗結果表明,可以降4.2倍activity factor。


但是,這不是功耗數據。從其分解的操作來看,對kernel為n*n的卷積運算來說,至少多做了n次乘法。並且,T-SRAM的麵積是傳統6T SRAM的1.4倍。所以,實際上T-SRAM的效果可能沒有那麼有吸引力。


在會議的Demo現場中,撞到KAIST的大佬HJ YOO,自然要討論一下這個T-SRAM。HJ YOO很自豪地地表示這個T-SRAM是他們自己設計的,而不是三星給做的。並且,YOO Fellow說,如果google過他,應該知道他一開始就是做memory出身的。好吧,服了u。來來來,“May I take a photo with you?”哢嚓哢嚓。


0?wx_fmt=jpeg


0?wx_fmt=jpeg


0?wx_fmt=jpeg


0?wx_fmt=jpeg


14.7

這是Michigan大學的一篇文章。它將PE可以訪問的memory分為四級,每級的大小不同。對於經常訪問的數據,放在L1;很少訪問的數據,放到L4。


這種做法的出發點很容易理解。sram size(圖中的bank size)越大,每次訪問所需的能量越多,也就是讀取一個數據所浪費的能量越多。所以,將數據分級存儲到不同size的sram中。存在bank小的sram的數據,雖然訪問頻繁,但是每次訪問的能量少。存在bank size大的sram裏的數據,雖然每次訪問的能量大,但是訪問次數少。


如果你以為這就結束了,那就太小看ISSCC文章的水平了。在不訪問sram的時候,sram也是有靜態功耗的。IC界處理這種情況的常用方法是,使用有retention功能的sram。在低功耗模式下,關閉sram 的工作電源,但是保留一個可以保持sram存儲內容的電壓。

這篇文章在使用有retention功能的sram的方式上,使用了動態控製的方法。除了動態控製正常的sram控製信號,還動態的控製sram的PG_EN信號。不隻是動態控製不同level的sram,還包括每級sram裏的不同bank。


從結果看,的確還不錯。作為一個ICer,需要提的問題是:Dynamic Drowsy Mode下,SRAM的訪問時間與alway on 比,有多少延遲?直接點,SRAM上電時間是多少?這個答案俺知道,不到100ns。如果係統跑在100M,要等10個周期。你要問這數據靠譜嗎?隻能告訴你,哥們用微信問的,信不信由你。


0?wx_fmt=jpeg


0?wx_fmt=jpeg


0?wx_fmt=jpeg


0?wx_fmt=jpeg


5.存儲器上的新花樣


Forum上,PULP用了SCM。第一次聽說SCM,哥們有點慌,被業界甩了好幾條街的樣子。趕緊看看是什麼鬼,原來就是用standard cell做的memory哈。摒棄標準6T的SRAM,用這個SCM,必然是有好處的。好處就是和standard cell一樣,在VDD降到很低時,依然可以工作。對比之下,6T SRAM的工作電壓隻能降到0.7伏左右。


0?wx_fmt=jpeg


但是,沒有絕對的事情。本人跑去聽了ISSCC2017的另外一個session,這個session的主題就是“SRAM”。


先來一個ISSCC2016發布的總結性的趨勢圖。即使到14nm,SRAM的電壓似乎也隻能到0.75V。SRAM的VDD的降低程度,在40nm以後一直趕不上logic的VDD降幅。


0?wx_fmt=jpeg


session12.3的文章中,TSMC做了一個10nm的針對移動應用的sram。可以看到,這個sram的工作電壓範圍很寬。


0?wx_fmt=jpeg

原文發布時間為:2014-04-29

本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號

最後更新:2017-05-17 10:02:28

  上一篇:go  當“海盜”遇上黑客,拒付比特幣的迪士尼隻能請FBI出手了
  下一篇:go  使用ruby解析json