智能駕駛是一個(gè)復(fù)雜的系統(tǒng),單單計(jì)算AI算力意義不大,并且AI算力數(shù)字有非常多的操作空間。汽車(chē)領(lǐng)域的算力通常是整數(shù)8位精度下的算力,這種算力也只是針對(duì)傳統(tǒng)CNN當(dāng)中計(jì)算量最大的卷積運(yùn)算,這種算力的取得不需要任何技術(shù)門(mén)檻,簡(jiǎn)單堆砌MAC(乘積累加)陣列即可獲得。不計(jì)成本的話,任何廠家都可以取得數(shù)千TOPS的算力,但每個(gè)廠家有自己的市場(chǎng)定位,有成本考量,自然就有了算力高低。
圖片來(lái)源:Synopsys
上圖是Synopsys推出的一款I(lǐng)P,最高支持8個(gè)NPU,達(dá)到3500TOPS的算力,單個(gè)NPU也可達(dá)到440TOPS的算力,并且這個(gè)算力是不參雜任何水分的,完全靠MAC數(shù)量獲得。
衡量算力最客觀的數(shù)據(jù)應(yīng)該是MAC數(shù)量,用MAC數(shù)量和運(yùn)行頻率可以計(jì)算出算力值,這沒(méi)有任何弄虛作假的空間,比如谷歌TPU V1有65000個(gè)MAC,頻率為700MhHz,算力即為65000*700M*2=91TOPS(每個(gè)指令包含兩次計(jì)算);特斯拉初代FSD每個(gè)NN包含2*9216個(gè)MAC,頻率為2GHz,算力就是2*9216*2*2*2000=73.7TOPS。
智能駕駛領(lǐng)域早已不是傳統(tǒng)CNN的領(lǐng)域,Transformer相對(duì)CNN可謂有著翻天覆地的變化。芯片從設(shè)計(jì)到正式量產(chǎn)需經(jīng)過(guò)一個(gè)漫長(zhǎng)的過(guò)程,可能是2-4年。因此現(xiàn)在市面上流行的嵌入式智能芯片基本上是源自于2年甚至更長(zhǎng)時(shí)間之前的設(shè)計(jì),而那時(shí)候設(shè)計(jì)的嵌入式智能芯片很大概率未考慮Transformer的情況,因?yàn)楫?dāng)時(shí)可能大部分市面上流行的還是以CNN為主的模型,很難部署Transformer。
對(duì)AI模型來(lái)說(shuō),可分為浮點(diǎn)和整數(shù)兩大類,其中整數(shù)通常用于推理,浮點(diǎn)用于訓(xùn)練。根據(jù)IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE 754)的定義,浮點(diǎn)又可分為雙精度即FP64,單精度即FP32,半精度即FP16,浮點(diǎn)計(jì)數(shù)是利用浮動(dòng)小數(shù)點(diǎn)的方式使用不同長(zhǎng)度的二進(jìn)制來(lái)表示一個(gè)數(shù)字,與之對(duì)應(yīng)的是定點(diǎn)數(shù)。同樣的長(zhǎng)度下浮點(diǎn)數(shù)能表達(dá)的數(shù)字范圍相比定點(diǎn)數(shù)更大,但浮點(diǎn)數(shù)并不能精確表達(dá)所有實(shí)數(shù),而只能采用更加接近的不同精度來(lái)表達(dá)。單精度的浮點(diǎn)數(shù)中采用4個(gè)字節(jié)也就是32位二進(jìn)制來(lái)表達(dá)一個(gè)數(shù)字,雙精度浮點(diǎn)數(shù)采用8個(gè)字節(jié)也就是64bits來(lái)表達(dá),當(dāng)然半精度浮點(diǎn)數(shù)也就是采用16bits了。因?yàn)椴捎貌煌粩?shù)的浮點(diǎn)數(shù)的表達(dá)精度不一樣,所以造成的計(jì)算誤差也不同,對(duì)于需要處理的數(shù)字范圍大且需要精確計(jì)算的科學(xué)計(jì)算來(lái)說(shuō),就要求采用雙精度浮點(diǎn)數(shù);而對(duì)于常見(jiàn)的多媒體和圖形處理計(jì)算,32位的單精度浮點(diǎn)計(jì)算已經(jīng)足夠了;對(duì)于要求精度更低的機(jī)器學(xué)習(xí)等一些應(yīng)用來(lái)說(shuō),半精度16位浮點(diǎn)數(shù)就可以甚至8位浮點(diǎn)數(shù)就已經(jīng)夠用了。
對(duì)AI芯片來(lái)說(shuō),不同的精度,浮點(diǎn)或整數(shù)需要各自獨(dú)立的計(jì)算單元。要支持浮點(diǎn)運(yùn)算需要特殊的寄存器和單獨(dú)的浮點(diǎn)數(shù)據(jù)加載指令,通用型CPU需要單獨(dú)添加浮點(diǎn)運(yùn)算處理器即FPU來(lái)完成浮點(diǎn)運(yùn)算。早期車(chē)載領(lǐng)域主要是CNN模型,為簡(jiǎn)化運(yùn)算,基本上都是只能做整數(shù)運(yùn)算,不能也不需要做浮點(diǎn)運(yùn)算,但Transformer不同,它的歸一化層和Softmax一般是半精度浮點(diǎn)數(shù)據(jù)格式即FP16,當(dāng)然工具鏈軟件可以做一個(gè)轉(zhuǎn)換,但這樣效率會(huì)下降很多甚至直接數(shù)據(jù)溢出報(bào)錯(cuò),遠(yuǎn)不如原生態(tài)支持的好。
浮點(diǎn)運(yùn)算不同的精度也需要設(shè)計(jì)不同的寄存器,CPU里的FPU可以同時(shí)支持不同精度的浮點(diǎn)運(yùn)算,但在GPU里針對(duì)單精度和雙精度就需要各自獨(dú)立的計(jì)算單元,不過(guò)半精度就不需要獨(dú)立的計(jì)算單元。例如英偉達(dá)的RTX3090單精度性能(FP32)達(dá)到35.7TFLOPS,遠(yuǎn)超A100的19.5TFLOPS,F(xiàn)P16性能達(dá)到285TFLOPS,也接近A100的312TFLOPS。但3090價(jià)格遠(yuǎn)低于A100 GPU,這是因?yàn)锳100定位于全面通用型AI加速,A100需要考慮雙精度運(yùn)算,因?yàn)橛邢拊南∈杈仃嚽蠼馄?,還有復(fù)雜表面流場(chǎng)的計(jì)算離不開(kāi)雙精度,而同樣算力雙精度耗費(fèi)晶體管數(shù)量是單精度的4-8倍,換句話說(shuō)同樣算力,雙精度運(yùn)算消耗的成本是單精度的4-8倍。而RTX3090是圖形領(lǐng)域的,主要是FP32數(shù)據(jù)格式,完全不考慮科學(xué)運(yùn)算的FP64,成本自然降低很多。
FP32可以兼容INT8,但FP32的成本相對(duì)INT8要高至少4倍,因此英偉達(dá)單獨(dú)搞出來(lái)張量計(jì)算單元即tensor core來(lái)應(yīng)對(duì)INT8,只留少量的FP32,向下兼容沒(méi)問(wèn)題,但不能向上兼容。
圖片來(lái)源:英偉達(dá)
以英偉達(dá)Orin為例,包含2048個(gè)CUDA核心,這是針對(duì)FP32的,F(xiàn)P32精度下算力為5.2TOPS,INT8格式下算力為167TOPS,還包含64個(gè)張量核心,這是針對(duì)所謂DLA的,原生態(tài)INT8格式,算力為87TOPS,合計(jì)為275TOPS。如果英偉達(dá)放棄FP32,全改為張量核心,那么算力上1000TOPS易如反掌,但英偉達(dá)還是考慮Orin盡可能地覆蓋更大的市場(chǎng),畢竟汽車(chē)市場(chǎng)太小了,所以添加了CUDA核心。
再以華為為例,華為每個(gè)計(jì)算核心里有三種運(yùn)算資源,分別是標(biāo)量、矢量和張量,張量基本可等同于AI運(yùn)算。
圖片來(lái)源:華為
其中張量計(jì)算即圖中的3D CUBE,每個(gè)CUBE包含4096個(gè)FP16 MACs,8192個(gè)INT8 MACs,一個(gè)MAC是包含兩個(gè)Ops,因此如果運(yùn)行頻率是1GHz,那FP16算力就是1G*2*4096=8TOPS。INT8算力就是16TOPS。FP16也可以在INT8下運(yùn)算,此時(shí)算力翻倍,合計(jì)就是32TOPS算力。
AI芯片嚴(yán)格來(lái)講,AI加速器和GPU都是針對(duì)并行計(jì)算設(shè)計(jì)的,在CNN時(shí)代非常合適,但在后CNN時(shí)代,出現(xiàn)了很多串行計(jì)算,對(duì)AI加速器非常不友好,對(duì)CPU和DSP非常友好。例如NMS。Transformer就是如此,它不僅需要串行計(jì)算算力,還需要足夠的存儲(chǔ)帶寬支持,單純的AI算力數(shù)值在Transformer面前毫無(wú)意義。實(shí)際不僅Transformer,很多CNN的變種也是如此,如目前主流的YOLOV4、YOLOV5、RESNET50。
我們把AI算子分為串行型和并行型,其中串行型通常都是逐點(diǎn)元素型element-wise,它有兩個(gè)特點(diǎn),一是通常是串行運(yùn)算,二是有大量的存儲(chǔ)數(shù)據(jù)動(dòng)作,非常消耗存儲(chǔ)帶寬。它們對(duì)算力需求很低,但存儲(chǔ)要求很高,最適合此類運(yùn)算的是DSP,因?yàn)镈SP是哈佛架構(gòu),數(shù)據(jù)和指令總線分開(kāi),效率高。但DSP編譯器非常難搞,只能用在汽車(chē)這種封閉體系內(nèi)。其次是CPU,通用性很強(qiáng),針對(duì)并行計(jì)算的GPU和AI芯片不適合此類逐點(diǎn)運(yùn)算,遇到此類計(jì)算,通常都是退回到CPU中運(yùn)算,這也是為何英偉達(dá)和微軟都要費(fèi)盡心機(jī)自研CPU的主要原因。
微軟剛剛發(fā)布的自研CPU:Cobalt 100,采用128核心ARM NeoverseN2架構(gòu)。
Transformer的計(jì)算過(guò)程
上圖是Transformer的計(jì)算過(guò)程,在此計(jì)算過(guò)程中,矩陣乘法是典型的計(jì)算密集型算子,也叫GEMM,通用矩陣乘法。存儲(chǔ)密集型算子分兩種,一種是矢量或張量的神經(jīng)激活,多非線性運(yùn)算,也叫GEMV,也就是通用矩陣矢量乘法。另一種是上面說(shuō)的逐點(diǎn)元素型element-wise。
圖片來(lái)源:Samsung
上圖是三星對(duì)GPT大模型workload分析,在運(yùn)算操作數(shù)量上,GEMV所占的比例高達(dá)86.53%,在大模型運(yùn)算延遲分析上,82.27%的延遲都來(lái)自GEMV,GEMM所占只有2.12%,非線性運(yùn)算也就是神經(jīng)元激活部分占的比例也遠(yuǎn)高于GEMM。
圖片來(lái)源:Samsung
上圖是三星對(duì)GPU利用率的分析,可以看出在GEMV算子時(shí),GPU的利用率很低,一般不超過(guò)20%,換句話說(shuō)80%的時(shí)間GPU都是在等待存儲(chǔ)數(shù)據(jù)的搬運(yùn)。還有如矩陣反轉(zhuǎn),嚴(yán)格地說(shuō)沒(méi)有任何運(yùn)算,只是存儲(chǔ)行列對(duì)調(diào),完全是存儲(chǔ)器和CPU在忙活。解決辦法很簡(jiǎn)單且只有一個(gè),就是用HBM高寬帶內(nèi)存,缺點(diǎn)很明顯,很貴,完全無(wú)法用在汽車(chē)領(lǐng)域。
除了Transformer外,還有一些新技術(shù),典型的有NMS和Depthwise,后者在移動(dòng)領(lǐng)域如手機(jī)上非常常見(jiàn),如MobileNets架構(gòu)。NMS則在車(chē)載領(lǐng)域流行,是Non-Maximum Suppression的縮寫(xiě),即非極大值抑制。其思想是搜索局部最大值,抑制非極大值。NMS算法在不同應(yīng)用中的具體實(shí)現(xiàn)不太一樣,但思想相同。NMS在計(jì)算機(jī)視覺(jué)任務(wù)中得到了廣泛的應(yīng)用,例如邊緣檢測(cè)、人臉檢測(cè)、目標(biāo)檢測(cè)(DPM,YOLO,SSD,F(xiàn)aster R-CNN)等。NMS對(duì)傳統(tǒng)的卷積加速或者說(shuō)AI專用芯片就很不友好。
非極大值抑制的流程如下:根據(jù)置信度得分進(jìn)行排序,選擇置信度最高的比邊界框添加到最終輸出列表中,將其從邊界框列表中刪除,計(jì)算所有邊界框的面積,計(jì)算置信度最高的邊界框與其它候選框的IoU。刪除IoU大于閾值的邊界框,重復(fù)上述過(guò)程,直至邊界框列表為空。排序部分是典型的串行計(jì)算,AI芯片完全無(wú)法加速。實(shí)際類似NMS的計(jì)算不少,這類計(jì)算用DSP加速是最合適的。
Synopsys提出一種新方法,就是給NPU增加一個(gè)矢量DSP來(lái)處理此類計(jì)算。Depthwise也適合用DSP處理,手機(jī)上流行的Mobilenets是Depthwise典型代表,對(duì)NPU來(lái)說(shuō)不合適,這也是高通手機(jī)AI特別強(qiáng)的地方,高通一直是堅(jiān)持用DSP的,當(dāng)然DSP不適合做并行計(jì)算。
AWS兩代Inferentia對(duì)比
上圖是亞馬遜兩代Inferentia的對(duì)比,二代Inferentia是在2023年4月發(fā)布的,針對(duì)Transformer做了優(yōu)化,每個(gè)NeuronCore-v2都是一個(gè)獨(dú)立的異構(gòu)計(jì)算單元,具有四個(gè)主要引擎:張量(Tensor)、向量(Vector)、標(biāo)量(Scalar)和GPSIMD引擎。張量引擎針對(duì)矩陣運(yùn)算(基本可等同于卷積運(yùn)算甚至傳統(tǒng)AI運(yùn)算)進(jìn)行了優(yōu)化。標(biāo)量引擎針對(duì)ReLU(整流線性單元)函數(shù)等元素運(yùn)算進(jìn)行了優(yōu)化。向量引擎針對(duì)非元素向量操作進(jìn)行了優(yōu)化,包括批量歸一化或池化。GPSIMD類似于DSP,不過(guò)主要做控制流運(yùn)算符。
Transformer時(shí)代,傳統(tǒng)的AI芯片難以生存,某種意義上講,傳統(tǒng)的AI芯片不存在了,因?yàn)門(mén)ransformer需要標(biāo)量(CPU)、向量(矢量,GPU)、張量、逐點(diǎn)矢量(DSP)運(yùn)算資源,把這么多資源整合在一起,顯然不能叫AI芯片了。
免責(zé)說(shuō)明:本文觀點(diǎn)和數(shù)據(jù)僅供參考,和實(shí)際情況可能存在偏差。本文不構(gòu)成投資建議,文中所有觀點(diǎn)、數(shù)據(jù)僅代表筆者立場(chǎng),不具有任何指導(dǎo)、投資和決策意見(jiàn)。