0
雷鋒網(wǎng)按:本文作者譚洪賀,資深I(lǐng)C工程師。博士畢業(yè)于清華大學(xué),多年一直從事于數(shù)字集成電路開發(fā)工作。從DSP、ASIP到特定加解密算法的ASIC低功耗實現(xiàn),從音視頻編解碼的高性能設(shè)計到計算機(jī)視覺、語音識別的高效能實現(xiàn),逐步進(jìn)入AI領(lǐng)域?,F(xiàn)任地平線機(jī)器人技術(shù)資深I(lǐng)C工程師,深度參與AI算法在芯片端的實現(xiàn)工作。
本文首發(fā)于譚洪賀個人知乎,從ISSCC2017的session 14 Deep Learning Processor的幾篇文章出發(fā),分析同行們都用了哪些方法來降低 DL 加速器和處理器的功耗,提高能效。
本文適用讀者:對 Deep Learning 算法有一定了解的 IC 工程師,對 IC 設(shè)計和計算機(jī)架構(gòu)有一定了解的算法工程師。
▼
先來一張slide鎮(zhèn)鎮(zhèn)場,tutorial上Verhelst總結(jié)了近幾年VLSI和ISSCC會議上發(fā)表的一些結(jié)果。其中,灰色的圖標(biāo)應(yīng)該都是ISSCC2017以前的結(jié)果。這張圖體現(xiàn)了性能、錯誤率、能效三方面的trade off。
性能上,大家似乎很難超GPU,但是能效上,可以算是秒殺。大家都喜歡拿自己的數(shù)據(jù)和NVIDIA的GPU比較,然后可以給出很漂亮的對比結(jié)果,甩出NVIDIA幾條街。
但是大家也不要興奮,學(xué)術(shù)界成果給出的數(shù)據(jù),總是不能閉著眼睛就接受的。大家都是過來人,都懂的。
目錄
1、使用低功耗工藝。涉及14.1,14.5
2、降低數(shù)據(jù)計算功耗
2.1 降低weight量化位數(shù)。涉及14.2
2.2 優(yōu)化乘法。涉及14.2
2.3 降低計算精度。涉及14.5
2.4 稀疏化。涉及NVIDIA,combricon,leuven
3、降低數(shù)據(jù)翻轉(zhuǎn)功耗。涉及14.3
4、降低數(shù)據(jù)存儲訪問功耗。涉及14.6,14.7
5、存儲器上的新花樣
一般提到低功耗工藝,可能大家普遍想到的還是foundary的low power工藝,HVT/LVT library等。
在ISSCC 2017的session 14上,出現(xiàn)了SOI工藝的身影。有幾家以可穿戴或IOT為應(yīng)用目標(biāo)的研究機(jī)構(gòu)已經(jīng)使用SOI工藝來做DL processor了。
下表列出了ISSCC2017上的幾篇文章使用的工藝。session中有有兩篇使用了FDSOI工藝,F(xiàn)orum中,ETH Zurich的PULP項目的芯片也使用了28nm FDSOI。
作為做IOT等低功耗產(chǎn)品所喜歡的工藝,F(xiàn)D-SOI工藝的優(yōu)點是,
a.well和襯底 間的寄生電容很小,漏電小,減少了靜態(tài)功耗。
b.可以通過控制Body Bias的電壓,來控制晶體管的工作。
如果加入正偏壓,可以提高器件響應(yīng)速度,增強(qiáng)性能;如果加入負(fù)偏壓,相當(dāng)于可以關(guān)掉晶體管,使晶體管只有很低的漏電流,大概是1pA/micron的水平。
這種方式關(guān)閉、開啟電路器件的方式,要比power gate控制速度快。
不過,工藝這件事,不是你想用哪家就可以用哪家的事情。ISSCC上發(fā)文章的都還是以高校研究院所為主。對他們來說,SOI工藝的成本還是太高。你看KAIST的文章,前兩年是65nm,這兩年的文章還是以65nm為主。
14.1的文章用圖形顯示現(xiàn)在流行了幾家Net里的操作以及參數(shù)的數(shù)量級。可以看到,為了解決更復(fù)雜的應(yīng)用和提高準(zhǔn)確度,操作數(shù)量和參數(shù)數(shù)量都很嚇人。
從14.1的另外一張圖中可以看到,對于AlexNet的不同layer,操作和參數(shù)的數(shù)量是不同的。尤其是,對于卷基層和全連接層,操作以及參數(shù)的數(shù)量都差別較大。
再看14.2的一張圖,對于卷基層、全連接層和RNN,操作和參數(shù)的數(shù)量差別也很大。不用太糾結(jié)與14.1的區(qū)別,14.2這里沒有提這些模型參數(shù)的具體來源。
因此,直觀地,在不能大幅降低算法精度的前提下,為了降低功耗,可以拍腦袋想出好幾方面
a.減少參與操作的數(shù)據(jù)或參數(shù)的數(shù)量。例如,稀疏化方案。
b.減少操作數(shù)的字長。例如,降低weight量化位數(shù)。
c.減少操作的復(fù)雜度。例如,優(yōu)化乘法計算,降低乘法計算的精度。
下面就帶著讀者來看看ISSCC上各家高手們是怎么在這幾方面各顯神通的。
2.1 降低weight量化位數(shù)
14.2提出了一種在線調(diào)整的動態(tài)定點方法。從給出的對比圖中可以看出,這個方法可以只使用4bit來量化weight,達(dá)到其他方法8bit的精度。
這個方法的理論基礎(chǔ)是,對于每一層,weight的最大值是不一樣的,weight參數(shù)的分布也是不一樣的。
在我們知道weight分布大概是一個高斯分布的基礎(chǔ)上,可能只需要關(guān)心3個σ以內(nèi)的weight數(shù)值。那么,每一層有效的weight數(shù)值的取指范圍就會不一樣。
如果,將每一層weight數(shù)值都乘以一個不同的系數(shù),例如,左移或右移幾bit,那么,就有可能將不同層的weight分布轉(zhuǎn)換為相同或相近的分布形態(tài)。
進(jìn)一步的,就可以在保留精度的基礎(chǔ)上,用相同的bit來進(jìn)行量化。
理論基礎(chǔ)很簡單,所以必然是有牛人認(rèn)識到這個問題的。
14.2引用的一個方法是基于離線學(xué)習(xí)的動態(tài)定點方法,就是在訓(xùn)練學(xué)習(xí)的過程中確定每一層weight表示的小數(shù)點位置。這是依賴于訓(xùn)練數(shù)據(jù)的。
14.2的方法是在線調(diào)整的動態(tài)定點方法。在實際計算過程中,每層根據(jù)累加器的計算溢出情況,修改一次fraction point位置。
從其給出的結(jié)果看,全部使用4bit字長來表示weight,效果還不錯。除了最初幾幀,使用4bit字長所能得到的score,和使用32bit浮點的結(jié)果是差不多的。
從能效的對比結(jié)果看,還是很有效果的。但是,文章中的能效數(shù)據(jù)的提高,并不只是依賴于這個方法(還是用了基于LUT的乘法,稍后介紹)。
BNN
比4bit更激進(jìn)的,可以是2bit。最極端的,weight可以是1bit。當(dāng)weight變?yōu)?bit的時候,就成了一種特殊的網(wǎng)絡(luò)——BNN(binary neutral network)。
近來研究BNN的也不少,只是ISSCC2017的正式論文里還沒有專門針對BNN的。ISSCC2017最后一天的forum里(forum好貴),來自ETH Zurich的PULP項目做的處理器對BNN的計算進(jìn)行了專門優(yōu)化。需要贊的是,他們的加速器的名字比較?!猋odaNN。Yoda,對,就是Starwars 里面的絕地武士,Yoda大師,"small in size but wise and powerful"的Yoda大師。親愛的做IC的兄弟們,“May the force be with you”。
2.2 優(yōu)化乘法
可以接著上一節(jié)繼續(xù)說了,還是14.2這篇文章,用查找表的方式來代替乘法運(yùn)算。
作者將輸入乘法器的16bit數(shù)據(jù)分割為4個4bit數(shù)。16bit乘法變成4個4bit乘法然后求和的運(yùn)算。為了快速實現(xiàn)4bit乘法,作者使用了查表的方式。作者將weight的奇數(shù)倍結(jié)果預(yù)先存到LUT內(nèi)(偶數(shù)倍不需要真的存下來),乘法就變成了查表。這個方法是要結(jié)合這篇文章的動態(tài)策略(見上一節(jié))來使用的。
看到這里,如果你想問“這種形式的乘法器和16bit直接乘相比,究竟能省多少功耗?”,那么說明你可以在工程師這條路上走的更遠(yuǎn)、飛的更高。答案,我也不知道。除了圖里顯示的邏輯電路,你還得考慮,weight的寬度,weight的選擇電路實現(xiàn),等等。理論上,weight的寬度是不限制的。但是,weight的寬度會影響部分積PP0/1/2/3、部分和PS1/2的寬度。
14.2中,最后將w的寬度定為了4bit。
14.2還提出了一種基于量化表的乘法實現(xiàn)方式,以降低全連接層(FCL)的計算功耗。作者將訓(xùn)練得到的FCL的浮點weight值進(jìn)行非均勻分布的量化??梢允?-7 bit的量化。以4bit量化為例,得到16個量化后的weight值,然后針對一個輸入數(shù)據(jù)i,分別乘以16個weight值,計算得到16個乘法結(jié)果,存為table。14.2的設(shè)計中,如果是4bit量化,可以同時存8個這種table(如果對weight做7bit量化,只能存一個table)。在做FCL計算時,先取8個數(shù)點,得到8個table,然后把這8個輸入點相關(guān)的所有MAC計算做完,可以得到輸出點的部分和。然后,再選另外8個輸入點,產(chǎn)生新的8個table,繼續(xù)計算部分和。不斷循環(huán),得到輸出層的所有結(jié)果。基于這種方法,除了建立table,所有乘法計算都被替換成了查表。
根據(jù)文章描述,減少了99%的乘法計算量,降低了75%的片外存儲器的帶寬。這對降低功耗都是有積極貢獻(xiàn)的。從對比結(jié)果看,能效優(yōu)勢明顯。哦,對了,需要提一下,用來對比的是han song的EIE那篇文章,電壓一欄的數(shù)據(jù)明顯不對(不要贊我有一雙發(fā)現(xiàn)美的眼睛)。
2.3 降低計算精度
其實,前面說的降低weight的量化位數(shù),也可以算是一種降低計算精度。只要能滿足應(yīng)用需求就行。
但是,這一節(jié)說的降低計算精度,是另外的事情。
14.5文章里,提到了DVAFS。作為一個IC工程師,DVFS自然知道的。那么DVAFS是什么鬼?看英文,Dynamic-Voltage-Accuracy-Frequency-Scaling。好吧,字面意思知道了,具體呢?
其實,Dynamic Accuracy并不是ISSCC2017的文章里首次提出來的概念。14.5的文章作者M(jìn)oons引用了自己JSSC2016上的文章,見圖。有的時候,兩個4bit數(shù)相乘時,結(jié)果的LSB可能并不重要,只需要MSB結(jié)果就可以了。于是,直接算一下兩個4bit數(shù)的高2bits相乘的結(jié)果就可以了。這就是dynamic accuray的概念了。至于,什么時候需要4bit乘的結(jié)果,什么時候只需要高2bit乘的結(jié)果,誰知道呢。動態(tài)的意思就是說,自己看著辦吧。對結(jié)果準(zhǔn)確度要求高的時候,用4bit乘吧;對功耗要求高的時候,用2bit乘吧。你開心就好。
既然提到了DVAFS,就簡單說說吧。上面提到的DVAS中,如果只做2bit乘,會有其他3/4的乘邏輯沒有工作。此時,可以利用其中的一部分,同時做另外一個2bit乘法。這樣,同時就做了兩個2bit乘法。從效率角度看,相當(dāng)于頻率提高了一倍。
14.5中,根據(jù)算法或應(yīng)用需要,可以動態(tài)配置乘法器,為一個16bit乘法,或者是2個8bit乘法,或是4個4bit乘法。這就是DVAFS和DVAS的區(qū)別了。
有心的人可能早就發(fā)現(xiàn)了,14.2中基于LUT的可配置乘法器也是可以當(dāng)做4個4bit乘、2個8bit乘或是1個16bit乘的。哎呦,不錯哦。
2.4 稀疏化
(ISSCC2017對稀疏化沒有特別值得談的亮點,本節(jié)純屬贈送)
稀疏化是Deep learning算法的一個趨勢,對硬件加速器或處理器的設(shè)計實現(xiàn)有較大的影響。但是,稀疏化并不是為了降低功耗而出現(xiàn)的。先有算法的稀疏化,然后設(shè)計加速器和處理器的吾等苦*們就要考慮如何應(yīng)對這種奇葩的情況。
先簡單掃盲一下,稀疏化可以分為feature稀疏化和weight稀疏化。
feature稀疏化:feature經(jīng)過卷積計算后,再經(jīng)過ReLU,就會變得稀疏。找張圖看吧,不多說了。
weight稀疏化:用來做卷積的kernel中的weight參數(shù),可以有一部分為0。
如果不管稀疏化,還用原來的加速器或處理器來執(zhí)行稀疏化后的算法,那么就會有很多浪費(fèi)的存儲和計算。所以,稀疏化給IC工程師帶來了一系列問題。
-ReLU計算之后的0值,要不要存儲到片外memory或片內(nèi)sram內(nèi)?
-稀疏化的weight參數(shù),怎么存儲?0元素要不要存?
-大量的0元素,如果存在memory里,很浪費(fèi)空間。如果不存,電路讀feature或weight的時候,怎么知道哪些數(shù)據(jù)是0,哪些不是?
-有0元素參與的乘運(yùn)算,怎么處理?調(diào)用MAC直接計算一下a*0?還是直接bypass MAC?
ok,好多問題。有沒有一臉的懵圈?
真想看看同行們是怎么做的,遺憾的是,ISSCC2017上的幾篇文章,都沒有太多針對稀疏化的新的亮點。那就用上搬山、 卸嶺之能,開動發(fā)丘、摸金之術(shù),隨便看看吧。
LEUVEN的ENVISION
來自leuven的14.5的這篇文章里,提到使用了sparse network。但是,這不是他們今年的新亮點,這是他們VLSI2016上的工作。見圖,sparsity的信息存儲在GUARD SRAM中,用來控制乘法器模塊是否進(jìn)行計算。如果乘數(shù)為0,F(xiàn)RD SRAM中的index會是0,就會關(guān)閉相應(yīng)位置的乘法,節(jié)省計算功耗。
直接上VLSI2016上的文章的截圖。在GRD SRAM的幫助下,功耗可以優(yōu)化1.9x。借用moons這篇文章的一張表,可以看到稀疏化帶來的好處。
Eyeriss
由于在ISSCC2017會場見到了vivienne,就把她們ISSCC2016的牛文eyeriss拿出來說說吧(這奇怪的邏輯也是沒誰了)。
Eyeriss在處理稀疏化的feature上的做法是:壓縮。設(shè)計了一種壓縮方式,將稀疏化的feature壓縮后存儲到外部DRAM內(nèi)。效果呢,如下圖,可以降低存儲空間??紤]到DRAM訪問的功耗不小,也算是降低了功耗。
在處理有關(guān)0值參與的乘法運(yùn)算時,eyeriss使用了skip的方法:遇到0,跳過乘法計算(從圖上看,實際是計算的0*0),跳過weight參數(shù)的讀取,可以節(jié)省PE的功耗45%。
總結(jié)一下,針對稀疏化,eyeriss做了三點:不從ram中讀0值,不做乘0的乘法,壓縮片外數(shù)據(jù)存儲。都可以降低功耗。
此外,還有兩個報告提及了稀疏化。
NVIDIA
NVIDIA在ISSCC2017最后一天的forum上做了報告。
NVIDIA報告基本上都在講Han Song的那篇EIE的peper,有興趣的去翻翻吧。
寒武紀(jì)
同樣在forum上,寒武紀(jì)的報告把diannao家族深情地回憶了一遍,沒有提及cambricon指令集(ISA屬于計算機(jī)架構(gòu)了,ISCA上講才合適嘛),也沒有提及用于sparse neural network的Cambricon-X加速器(處女座要哭,作為DL加速器,竟然不是diannao家族成員。起名cambricon-X,竟然不是cambricon 指令集的擴(kuò)展。這聽起來不make sense啊)。
對cambricon-X感興趣的,自行g(shù)oogle學(xué)術(shù)吧。哦,對不起,上不去,百度學(xué)術(shù)吧。繼續(xù)吐槽,百度挺不錯的,能在最硬的國際會議的forum上做一個又虛又軟的報告,也是能力的一種體現(xiàn)。
14.3文章中做了些有意思的工作,分析了一下weight的分布,發(fā)現(xiàn)weight是均值為0的高斯分布。如果用傳統(tǒng)的二進(jìn)制補(bǔ)碼(TC)的方式表示,負(fù)數(shù)表示中為1的bit會很多。而如果用符號位+幅值(SM)的方式表示,可以降低為1的bit數(shù),進(jìn)而就可以減少計算的翻轉(zhuǎn)率,從而降低計算功耗。
廢話少說,直接上圖。實驗結(jié)果顯示,SM的功耗略低于TC。下圖,只看最左邊三個數(shù)據(jù)既可以了。
借ISSCC2016的那篇Eyeriss的一張slide??煽吹?,數(shù)據(jù)訪問所帶來的功耗要遠(yuǎn)大于計算的功耗。因此,可以從兩方面著手,降低系統(tǒng)執(zhí)行Deep Learning算法時的memory訪問功耗。
一,減少存儲功耗。例如,前面說的稀疏化,減少了feature和weight,通過壓縮或者特殊設(shè)計的存儲方式,就可以降低存儲空間。不再累述。
二,減少訪問功耗。這方面今年有幾篇文章都有亮點。
14.6
先看14.6的文章,又是KAIST的。不得不吐槽,看人家的IEEE Fellow,學(xué)生發(fā)ISSCC跟bbs上灌水似得(不知道bbs是啥的,沒關(guān)系,說明你很年輕)。去年在ISSCC2016的session14上灌了4篇文章,今年在session14上灌了兩篇。
書回正傳,14.6首先將feature乘以矩陣kernel近似成了兩步乘以向量的運(yùn)算。然后,引入一種定制的7T bit-cell的SRAM,可以支持行方向和列方向兩種讀取模式,即其所謂的conventional r/w和transposed r/w。
分析一下,將矩陣分解成獨立的兩個向量,可以減少weight參數(shù)數(shù)量,減少weight讀取次數(shù);引入transposed r/w,可以一個周期讀取列方向多個數(shù)據(jù),可以減少訪問sram列方向的次數(shù)。綜合下來,給出的實驗結(jié)果表明,可以降4.2倍activity factor。
但是,這不是功耗數(shù)據(jù)。從其分解的操作來看,對kernel為n*n的卷積運(yùn)算來說,至少多做了n次乘法。并且,T-SRAM的面積是傳統(tǒng)6T SRAM的1.4倍。所以,實際上T-SRAM的效果可能沒有那么有吸引力。
在會議的Demo現(xiàn)場中,撞到KAIST的大佬HJ YOO,自然要討論一下這個T-SRAM。HJ YOO很自豪地地表示這個T-SRAM是他們自己設(shè)計的,而不是三星給做的。并且,YOO Fellow說,如果google過他,應(yīng)該知道他一開始就是做memory出身的。好吧,服了u。來來來,“May I take a photo with you?”咔嚓咔嚓。
14.7
這是Michigan大學(xué)的一篇文章。它將PE可以訪問的memory分為四級,每級的大小不同。對于經(jīng)常訪問的數(shù)據(jù),放在L1;很少訪問的數(shù)據(jù),放到L4。
這種做法的出發(fā)點很容易理解。sram size(圖中的bank size)越大,每次訪問所需的能量越多,也就是讀取一個數(shù)據(jù)所浪費(fèi)的能量越多。所以,將數(shù)據(jù)分級存儲到不同size的sram中。存在bank小的sram的數(shù)據(jù),雖然訪問頻繁,但是每次訪問的能量少。存在bank size大的sram里的數(shù)據(jù),雖然每次訪問的能量大,但是訪問次數(shù)少。
如果你以為這就結(jié)束了,那就太小看ISSCC文章的水平了。在不訪問sram的時候,sram也是有靜態(tài)功耗的。IC界處理這種情況的常用方法是,使用有retention功能的sram。在低功耗模式下,關(guān)閉sram 的工作電源,但是保留一個可以保持sram存儲內(nèi)容的電壓。
這篇文章在使用有retention功能的sram的方式上,使用了動態(tài)控制的方法。除了動態(tài)控制正常的sram控制信號,還動態(tài)的控制sram的PG_EN信號。不只是動態(tài)控制不同level的sram,還包括每級sram里的不同bank。
從結(jié)果看,的確還不錯。作為一個ICer,需要提的問題是:Dynamic Drowsy Mode下,SRAM的訪問時間與alway on 比,有多少延遲?直接點,SRAM上電時間是多少?這個答案俺知道,不到100ns。如果系統(tǒng)跑在100M,要等10個周期。你要問這數(shù)據(jù)靠譜嗎?只能告訴你,哥們用微信問的,信不信由你。
Forum上,PULP用了SCM。第一次聽說SCM,哥們有點慌,被業(yè)界甩了好幾條街的樣子。趕緊看看是什么鬼,原來就是用standard cell做的memory哈。摒棄標(biāo)準(zhǔn)6T的SRAM,用這個SCM,必然是有好處的。好處就是和standard cell一樣,在VDD降到很低時,依然可以工作。對比之下,6T SRAM的工作電壓只能降到0.7伏左右。
但是,沒有絕對的事情。本人跑去聽了ISSCC2017的另外一個session,這個session的主題就是“SRAM”。
先來一個ISSCC2016發(fā)布的總結(jié)性的趨勢圖。即使到14nm,SRAM的電壓似乎也只能到0.75V。SRAM的VDD的降低程度,在40nm以后一直趕不上logic的VDD降幅。
session12.3的文章中,TSMC做了一個10nm的針對移動應(yīng)用的sram??梢钥吹?,這個sram的工作電壓范圍很寬。
最后,再來一個有意思的。這是會上的一個poster。作者在6T SRAM上,做了一個獨特的電路,可以在SRAM內(nèi)就做完乘法。例如,把4bit的weight存在sram內(nèi),然后根據(jù)輸入的feature數(shù)據(jù),編碼得到4bit的控制時序,送入SRAM接口,然后既可以得到4bit乘法結(jié)果。聽著是不是很高大上?跑個題,第一作者名字看著很像華人,一問才知,是個韓國人。只好英文交流,累死個人了。
結(jié)束語
“吾生也有涯,而知也無涯”,我掉Deep Learning的坑里了,拉你一把,一起掉下來吧。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。