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