很多人會問,,為什么沒有英偉達,?目前所有主流深度學(xué)習運算主流框架后端都是英偉達的CUDA,包括TensorFlow,、Caffe,、Caffe2、PyTorch,、mxnet,、PaddlePaddle,CUDA包括微架構(gòu)和指令集以及并行計算引擎,。CUDA壟斷了深度學(xué)習或者也可以說壟斷了人工智能,,這一點類似ARM的微架構(gòu)和指令集。CUDA強大的生態(tài)系統(tǒng),,造就了英偉達牢不可破的霸主地位,。深度學(xué)習的理論基礎(chǔ)在上世紀五十年代就已經(jīng)齊備,無法應(yīng)用的關(guān)鍵就是缺乏像GPU這樣的密集簡單運算設(shè)備,,是英偉達的GPU開創(chuàng)了人類的深度學(xué)習時代,,或者說人工智能時代,CUDA強化了英偉達的地位,。你可以不用英偉達的GPU,,但必須轉(zhuǎn)換格式來適應(yīng)CUDA。
CUDA開啟了并行計算或多核運算時代,,今天人工智能用的所有加速器都是多核或眾核處理器,,幾乎都離不開CUDA。CUDA程序構(gòu)架分為兩部分:Host和Device,。一般而言,,Host指的是CPU,Device指的是GPU或者叫AI加速器,。在CUDA程序構(gòu)架中,,主程序還是由CPU 來執(zhí)行,而當遇到數(shù)據(jù)并行處理的部分,,CUDA 就會將程序編譯成 GPU能執(zhí)行的程序,,并傳送到GPU。而這個程序在CUDA里稱做核(kernel),。CUDA允許程序員定義稱為核的C語言函數(shù),,從而擴展了C語言,在調(diào)用此類函數(shù)時,,它將由N個不同的CUDA線程并行執(zhí)行N次,,這與普通的C語言函數(shù)只執(zhí)行一次的方式不同。執(zhí)行核的每個線程都會被分配一個獨特的線程ID,可通過內(nèi)置的threadIdx變量在內(nèi)核中訪問此ID,。在 CUDA 程序中,,主程序在調(diào)用任何 GPU內(nèi)核之前,必須對核進行執(zhí)行配置,,即確定線程塊數(shù)和每個線程塊中的線程數(shù)以及共享內(nèi)存大小,。你可以不用英偉達的GPU,但最終都離不開CUDA,,也就是需要轉(zhuǎn)換成CUDA格式,,這就意味著效率的下降。所以英偉達是參考級的存在,。
從CUDA的特性我們不難看出,,單獨的AI加速器是無法使用的。今天我們分析三款可用于智能駕駛領(lǐng)域的AI加速器,,分別是高通的AI100,,華為的昇騰,特斯拉的FSD,。這其中高通AI100比較少見,。
高通AI100最早于2019年4月在深圳的高通AI開放日露面,2020年9月量產(chǎn),。AI100是高通目前唯一的AI推理運算加速器,,定位四個方面的應(yīng)用:一是數(shù)據(jù)中心的邊緣計算,二是5G行動邊緣計算,,三是智能駕駛與智能交通,,四是5G基礎(chǔ)設(shè)施。
AI100有兩個側(cè)重點:一是5G游戲,,AI100發(fā)布當天邀請了VIVO手機,、騰訊王者榮耀開發(fā)團隊利用AI100現(xiàn)場開了一場電玩競賽,即把部分運算放到5G邊緣服務(wù)器上,,減輕手機端的負載。二是智能交通和智能駕駛,,高通自動駕駛Ride平臺的AI加速器很有可能就是AI100的車規(guī)翻版,。
高通特別展示了AI100在智能交通/智能駕駛領(lǐng)域的應(yīng)用。
同時支持24路200萬像素幀率25Hz的圖像識別,,特斯拉的FSD不過是同時8路130萬像素幀率30Hz的圖像識別,,性能至少是特斯拉FSD的3倍。 AI100可以像刀片服務(wù)器那樣應(yīng)用,,用PCIe交換機最多16個級聯(lián),。
最高每瓦有12.37TOPs的算力,特斯拉FSD是36瓦的功耗,,AI部分估計大約為24瓦,,每瓦只有大約3TOPs每瓦的算力,,英偉達的Orin大致為5.2TOPs每瓦的算力。
上圖為高通AI100內(nèi)部框架圖,。設(shè)計很簡潔,,16個AI核,內(nèi)核與內(nèi)核之間是第四代PCIe連接,,帶寬有186GB/s,,8通道的PCIe網(wǎng)絡(luò),然后再與各種片上網(wǎng)絡(luò)(NoC),,包括存儲NoC,、運算NoC和配置NoC通過PCIe總線連接。片上存儲器容量高達144MB,,帶寬136GB/s,。外圍存儲器為256Gb的LPDDR4。支持汽車行業(yè)的ISO26262安全標準,,即ASIL,,達到B級。
NoC是多核AI處理器的核心技術(shù)之一,,特斯拉FSD只有兩個NPU,,很可能用不到NoC而用比較落后的總線技術(shù),不過高通和華為都用到了,。
NoC的詳細理論就不說了,,可以理解為一個運行在PE與存儲之間的通訊網(wǎng)絡(luò)。NoC技術(shù)和網(wǎng)絡(luò)通信中的OSI(Open System Interconnection)技術(shù)有很多相似之處,,NoC技術(shù)的提出也是因為借鑒了并行計算機的互聯(lián)網(wǎng)絡(luò)和以太網(wǎng)絡(luò)的分層思想,,二者的相同點有:支持包交換、路由協(xié)議,、任務(wù)調(diào)度,、可擴展等。NoC更關(guān)注交換電路和緩存器的面積占用,,在設(shè)計時主要考量的方面也是這些,。NoC的基本組成為:IP核、路由器,、網(wǎng)絡(luò)適配器以及網(wǎng)絡(luò)鏈路,,IP核和路由器位于系統(tǒng)層,網(wǎng)絡(luò)適配器位于網(wǎng)絡(luò)適配層,。針對NoC的這四個基本組成,,也衍生出了許多的研究方向和優(yōu)化途徑。
常見AI加速器的NoC如上表。需要指出高通和華為都用了Arteris,,這家公司實際是高通的子公司,,高通在2013年11月收購了這家僅有43人的法國小公司,今天中國幾乎所有的大中型芯片公司都是其客戶,,包括瑞芯微,、國民技術(shù)、華為,、全志,、炬力、展訊等,,可以說都在給高通打工,。英特爾在2019年收購了Netspeed,F(xiàn)acebook在2019年收購了Sonics,,這兩家的NoC使用面遠不如高通的Arteris,。
每個AI核內(nèi)部框架如上,主要分4個部分,,分別是標量處理,、向量處理、存儲處理和張量處理,。深度學(xué)習中經(jīng)常出現(xiàn)4種量,,標量、向量,、矩陣和張量,。神經(jīng)網(wǎng)絡(luò)最基本的數(shù)據(jù)結(jié)構(gòu)就是向量和矩陣,神經(jīng)網(wǎng)絡(luò)的輸入是向量,,然后通過每個矩陣對向量進行線性變換,,再經(jīng)過激活函數(shù)的非線性變換,通過層層計算最終使得損失函數(shù)的最小化,,完成模型的訓(xùn)練,。
標量(scalar):一個標量就是一個單獨的數(shù)(整數(shù)或?qū)崝?shù)),不同于線性代數(shù)中研究的其他大部分對象(通常是多個數(shù)的數(shù)組),。標量通常用斜體的小寫字母來表示,,標量就相當于Python中定義的x=1。
向量(Vector),,一個向量表示一組有序排列的數(shù),通過次序中的索引我們能夠找到每個單獨的數(shù),,向量通常用粗體的小寫字母表示,,向量中的每個元素就是一個標量,向量相當于Python中的一維數(shù)組。
矩陣(matrix),,矩陣是一個二維數(shù)組,,其中的每一個元素由兩個索引來決定,矩陣通常用加粗斜體的大寫字母表示,,我們可以將矩陣看作是一個二維的數(shù)據(jù)表,,矩陣的每一行表示一個對象,每一列表示一個特征,。
張量(Tensor),,超過二維的數(shù)組,一般來說,,一個數(shù)組中的元素分布在若干維坐標的規(guī)則網(wǎng)格中,,被稱為張量。如果一個張量是三維數(shù)組,,那么我們就需要三個索引來決定元素的位置,,張量通常用加粗的大寫字母表示。
不太嚴謹?shù)卣f,,標量是0維空間中的一個點,,向量是一維空間中的一條線,矩陣是二維空間的一個面,,三維張量是三維空間中的一個體,。也就是說,向量是由標量組成的,,矩陣是向量組成的,,張量是矩陣組成的。
標量運算部分可以看作一個小CPU,,控制整個AI Core的運行,。標量計算單元可以對程序中的循環(huán)進行控制,可以實現(xiàn)分支判斷,,其結(jié)果可以通過在事件同步模塊中插入同步符的方式來控制AI Core中其它功能性單元的執(zhí)行流水,。它還為矩陣計算單元或向量計算單元提供數(shù)據(jù)地址和相關(guān)參數(shù)的計算,并且能夠?qū)崿F(xiàn)基本的算術(shù)運算,。復(fù)雜度較高的標量運算如數(shù)據(jù)流量控制則由專門的AI CPU通過算子完成,,AI處理器是無法單獨工作的,必須要外置的CPU給予配合,。
華為昇騰系列內(nèi)核架構(gòu),。圖片來源:互聯(lián)網(wǎng)
華為的昇騰910即Davinci Max,和高通AI100一樣,,也是8192個Int8,,4096個FP16,。不過昇騰910是訓(xùn)練用的,高通AI100是推理用的,,但910不計成本使用HBM2代存儲,,性能遠超AI100。
上圖為特斯拉FSD信號內(nèi)部流轉(zhuǎn),,相干流量即深度學(xué)習的數(shù)據(jù)流量需要CPU控制,,當然也不只是為深度學(xué)習服務(wù)。 圖像識別深度學(xué)習中運算量最大的卷積部分實際就是矩陣的乘和累加,??梢苑纸鉃?維的標量或者叫算子(即權(quán)重)與2維的向量即輸入圖像乘和累加。
上圖為特斯拉FSD神經(jīng)網(wǎng)絡(luò)架構(gòu),,特斯拉把矩陣的乘和累加簡單寫成了MulAccArray,。特斯拉做芯片剛剛?cè)腴T,F(xiàn)SD上除了NPU是自己做的外,,其余都是對外采購的IP,。NPU方面,主要就是堆砌MAC乘和累加單元,,在稍微有技術(shù)含量的標量計算領(lǐng)域,,特斯拉沒有公布采用何種指令集,應(yīng)該是沒什么特色,。華為和高通都是采用了VLIW,。
高通的向量處理器可以簡單看作一個DSP。眾所周知,,高通的AI技術(shù)來源于其DSP技術(shù),,高通對DSP非常青睞,而已經(jīng)失去生命力的VLIW超長指令集非常適合用在深度學(xué)習上,,深度學(xué)習運算算法非常單一且密集度極高,,并不需要通用場景下的實時控制。并且其程序運行有嚴格的時間要求,,cache這種不可控時間的結(jié)構(gòu)就不適合了,,通常采用固定周期的TCM作為緩存,這樣內(nèi)存訪問時間就固定了,。有了上述的特征,,靜態(tài)編譯在通用場合下面臨的那些困難就不存在了,而DSP其更高效的并行運算能力和簡化的硬件結(jié)構(gòu)被完全發(fā)揮出來,。
AI100為了考慮多種應(yīng)用場合,,有FP16和Int8兩種精度陣列,Int8即8位整數(shù)精度是智能駕駛領(lǐng)域最常見的,,F(xiàn)P16則是游戲,、AR/VR領(lǐng)域常用的,。Int8有8192個,F(xiàn)P16有4096,,特斯拉則是9216個Int8陣列,如果AI100只考慮智能駕駛,,在總面積(差不多可等同于成本)不變的情況下算力還可以再提高不少,。
上圖為特斯拉NPU部分流程與裸晶分布,算力理論峰值只是根據(jù)MAC數(shù)量簡單計算得出,,實際存儲器是瓶頸,,存儲器能讓算力大打折扣,這也是為什么訓(xùn)練用AI芯片都不惜成本用HBM內(nèi)存的原因,。特斯拉的芯片上,,大部分都給了SRAM,也是為了解決存儲器瓶頸問題,。這里常見到兩個單位,,GiB和GB,GB是十進制,,GiB是二進制,,1GiB=(1024*1024*1024)B=1073741824B,1GB=(1000*1000*1000)B=1000000000B,,1GiB/1GB=1073741824/1000000000=1.073741824,。要求精度不高的話,可以直接替換,,高通AI100有144MB的片上存儲,,特斯拉只有32MiB,高通顯然可以碾壓特斯拉的,,此外外圍的LPDDR4存儲上,,高通也是碾壓特斯拉,特斯拉帶寬只有63.58 GiB/s,,高通AI100是136GB/s,。
最后說算力,AI處理器對比似乎離不開算力對比,,實際單獨講算力數(shù)據(jù)毫無意義,,上圖是高通AI100在五個數(shù)據(jù)集上的表現(xiàn),我們可以看到性能與效率差別巨大,,AI算力越強,,其適用面就越窄,與深度學(xué)習模型的捆綁程度就越高,,換句話說,,AI芯片只能在與其匹配的深度學(xué)習模型上才能發(fā)揮最大性能,,換一個模型,可能只能發(fā)揮芯片10%的性能,,所有AI芯片目前的算力數(shù)據(jù)都是理論峰值數(shù)據(jù),,實際應(yīng)用中都無法達到理論峰值,某些情況下,,可能只有峰值算力的10%甚至2%,。100TOPS的算力可能會萎縮到2TOPS。
在芯片領(lǐng)域,,特斯拉只能算是小學(xué)生,,只要有意愿,高通,、英特爾,、英偉達、華為,、AMD,、聯(lián)發(fā)科、三星都能碾壓特斯拉,。