search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

AI晶元怎麼降功耗?從ISSCC2017說起

HorizonRobotics,作者譚洪賀,謝謝。

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

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

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

目錄

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、存儲器上的新花樣

使用低功耗工藝

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

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

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

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

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

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

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

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

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

降低數據計算功耗

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

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

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

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

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

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

c.減少操作的複雜度。例如,優化乘法計算,降低乘法計算的精度。

下面就帶著讀者來看看ISSCC上各家高手們是怎麼在這幾方面各顯神通的。

降低weight量化位數

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

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

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

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

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

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

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

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

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

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

比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」。

優化乘法

可以接著上一節繼續說了,還是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。

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,所有乘法計算都被替換成了查表。

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

降低計算精度

其實,前面說的降低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乘吧。你開心就好。

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

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

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

稀疏化

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

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

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

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

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,就會關閉相應位置的乘法,節省計算功耗。

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

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

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

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

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

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

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上做一個又虛又軟的報告,也是能力的一種體現。

降低數據翻轉功耗

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

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

降低數據存儲訪問功耗

借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?」咔嚓咔嚓。

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個周期。你要問這數據靠譜嗎?只能告訴你,哥們用微信問的,信不信由你。

存儲器上的新花樣

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

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

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

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

最後,再來一個有意思的。這是會上的一個poster。作者在6T SRAM上,做了一個獨特的電路,可以在SRAM內就做完乘法。例如,把4bit的weight存在sram內,然後根據輸入的feature數據,編碼得到4bit的控制時序,送入SRAM介面,然後既可以得到4bit乘法結果。聽著是不是很高大上?跑個題,第一作者名字看著很像華人,一問才知,是個韓國人。只好英文交流,累死個人了。

結束語

「吾生也有涯,而知也無涯」,我掉Deep Learning的坑裡了,拉你一把,一起掉下來吧。

作者簡介

譚洪賀,資深IC工程師。博士畢業於清華大學,多年一直從事於數字集成電路開發工作。從DSP、ASIP到特定加解密演算法的ASIC低功耗實現,從音視頻編解碼的高性能設計到計算機視覺、語音識別的高效能實現,逐步進入AI領域。

現任地平線機器人技術資深IC工程師,深度參與AI演算法在晶元端的實現工作。

本文首發於譚洪賀個人知乎,從ISSCC2017的session 14 Deep Learning Processor的幾篇文章出發,分析同行們都用了哪些方法來降低DL 加速器和處理器的功耗,提高能效。

本文適用讀者:對Deep Learning演算法有一定了解的IC工程師,對IC設計和計算機架構有一定了解的演算法工程師。

R

【關於轉載】:轉載僅限全文轉載並完整保留文章標題及內容,不得刪改、添加內容繞開原創保護,且文章開頭必須註明:轉自「半導體行業觀察icbank」微信公眾號。謝謝合作!

【關於徵稿】:歡迎半導體精英投稿(包括翻譯、整理),一經錄用將署名刊登,紅包重謝!簽約成為專欄專家更有千元稿費!來稿郵件請在標題標明「投稿」,並在稿件中註明姓名、電話、單位和職務。歡迎添加我的個人微信號 MooreRen001或發郵件到 [email protected]



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦