Transformer在汽車領(lǐng)域應(yīng)用自然是針對(duì)視覺的,ChatGPT3這種至少需要八張英偉達(dá)A100顯卡的大模型是絕對(duì)無(wú)法出現(xiàn)在汽車上的。視覺類的Transformer以微軟亞洲研究院的Swin Transformer和谷歌大腦的ViT為代表。Swin Transformer出現(xiàn)較早,其出現(xiàn)證明Transformer能大幅超越CNN,即SOTA。
Transformer特別適合多種分類的語(yǔ)義分割應(yīng)用,而語(yǔ)義分割又是OccupancyNetwork的關(guān)鍵。語(yǔ)義分割方面,即使訓(xùn)練數(shù)據(jù)不多,Transformer也能壓倒CNN或FPN。如果是簡(jiǎn)單的目標(biāo)檢測(cè),訓(xùn)練數(shù)據(jù)不多的情況下,CNN基本不落下風(fēng)。
汽車領(lǐng)域擁抱Transformer需要多少AI算力?AI算力需求與輸入像素?cái)?shù)和模型參數(shù)關(guān)系最為密切,要計(jì)算AI算力需求,有一個(gè)關(guān)鍵的名詞:token,其在自然語(yǔ)言處理(NLP)里指最小的詞;在圖像領(lǐng)域,指patch,即最小的圖像“塊”,而tokenization是指將輸入的語(yǔ)言或圖像切割為token的過程,通常transformer是16*16像素,這個(gè)自然是像素越小越好,一句話分詞分的越細(xì),這句話的語(yǔ)義也就更準(zhǔn)確,一句話分的越粗,語(yǔ)義偏差就可能越大。據(jù)此經(jīng)簡(jiǎn)化計(jì)算,200萬(wàn)像素所包含的token數(shù)就是大約1萬(wàn)個(gè)。800萬(wàn)像素就是大約4萬(wàn)個(gè)。
Transformer結(jié)構(gòu)圖
來源:互聯(lián)網(wǎng)
Transformer由N個(gè)相同的層組成,每層包含兩部分,一部分為自注意力,另一部分為MLP,每一層最后都有一個(gè)歸一化。
谷歌的ViT結(jié)構(gòu)
來源:谷歌
視覺領(lǐng)域的Transformer主要是使用了Encoder部分,如上圖所示。
微軟亞洲研究院提出的Swin Transformer結(jié)構(gòu)
來源:微軟亞洲研究院
與谷歌簡(jiǎn)單地硬切割patch有所不同,微軟為了避免太多的token,在token化的過程中下了很多工夫,但實(shí)際計(jì)算量差不多。
Transformer第一步是將輸入圖像轉(zhuǎn)換為嵌入矩陣X,同時(shí)也有空間位置編碼。
位置編碼是采用了三角函數(shù)算法,這個(gè)算法是標(biāo)量計(jì)算,CPU做起來效率最高。
第二步是多頭注意力計(jì)算。
對(duì)于一個(gè)視頻輸入序列X,它需要和權(quán)重參數(shù)模型做矩陣乘法,即和k、v、q的權(quán)重矩陣做乘法。然后,計(jì)算每個(gè)Query(X與q的矩陣乘積)和所有Key(X與k的矩陣乘積)的匹配度,并用這個(gè)匹配度來計(jì)算Value的加權(quán)和:
Attention(Q,K, V) = softmax(Q * K^T / sqrt(d)) * V
這里的Q就是Query,K就是Key,V就是Value(X與v矩陣乘積)。X基本上等同于視頻的token數(shù)量,k、v、q參數(shù)量。總計(jì)算量為2*3*網(wǎng)絡(luò)隱藏層維度h的平方。
把幾個(gè)head自注意力做Concat??傔\(yùn)算量為2*網(wǎng)絡(luò)隱藏層維度的平方
接下來是歸一化層,最后是前饋層。
總計(jì)算量是2*8*網(wǎng)絡(luò)隱藏層維度的平方。
最后累加這三層的總計(jì)算量為(6+2+16=24)*網(wǎng)絡(luò)層數(shù)*網(wǎng)絡(luò)隱藏層維度的平方。
假設(shè)一個(gè)網(wǎng)絡(luò)有520億參數(shù),64層隱藏層,隱藏層的維度是8192,那么每個(gè)token的推理計(jì)算量就是64*24*(8192的平方)=103079215104次運(yùn)算,這個(gè)數(shù)值除以2就是515億,基本等同于網(wǎng)絡(luò)的總參數(shù)量,實(shí)際就是每個(gè)token,推理時(shí)需要兩次運(yùn)算,一次矩陣乘法,一次是累加。
最終計(jì)算量為token數(shù)量*2*網(wǎng)絡(luò)參數(shù)總量。
目前,Transformer視覺模型仍然遠(yuǎn)遠(yuǎn)落后于語(yǔ)言模型。具體而言,SwinTransformer二代參數(shù)大約30億, ViT-E有 40億參數(shù),而入門級(jí)語(yǔ)言模型通常超過 100億 參數(shù),更別說具有5400億參數(shù)的大型語(yǔ)言模型。值得注意的是,谷歌于2023年2月推出了220億參數(shù)的ViT-22B。
假設(shè)我們使用ViT-E模型,輸入八百萬(wàn)像素的視頻,采用16*16的patch,那么token數(shù)大約是4.08萬(wàn)個(gè),通常自動(dòng)駕駛幀率是每秒30幀(即每秒計(jì)算30次),那么每秒運(yùn)算量就是30*4.08萬(wàn)*40億*2=2400萬(wàn)億次,即4896TOPS。如果是200萬(wàn)像素,那么token約為1萬(wàn)個(gè),算力需要1200TOPS。
顯然,這個(gè)算力需求太高,需要降級(jí),視覺Transformer參數(shù)最小為10億個(gè),特斯拉AI日上就寫了其參數(shù)是10億個(gè)。不過,大模型參數(shù)越多,效果越好,然后再降低幀率到15Hz。有人會(huì)說乘積累加如果設(shè)計(jì)的非常好,勉強(qiáng)來說一次計(jì)算也可以完成,即我們常說MAC運(yùn)算。
不過,Transformer每層最后都有非線性的歸一化運(yùn)算,它在每一層之外是串行結(jié)構(gòu),層內(nèi)是并行結(jié)構(gòu),難以實(shí)現(xiàn)一次計(jì)算完成乘積累加;如果是CNN網(wǎng)絡(luò),全并行結(jié)構(gòu),是可以實(shí)現(xiàn),更何況還有位置編碼等標(biāo)量計(jì)算。
最低下限就是15*1萬(wàn)*10億*2=300萬(wàn)億次,即300TOPS。特斯拉一代FSD的算力不過144TOPS。
實(shí)際上,無(wú)論是GPU還是AI加速器,其利用率都是很低的,特別是transformer其獨(dú)特的網(wǎng)絡(luò)結(jié)構(gòu),它是源自串行的RNN網(wǎng)絡(luò),AI加速器或者說AI專用芯片基本上都是針對(duì)矩陣并行計(jì)算設(shè)計(jì)的,幾乎沒考慮過串行。GPU略微好點(diǎn),CPU的效率最高,奈何CPU核心數(shù)太少。
一般GPU的利用率是45%,低的只有30%,最高一般不超過55%,而AI專用芯片估計(jì)只有20-30%。https://arxiv.org/pdf/2104.04473.pdf,這篇文章里有詳細(xì)數(shù)據(jù),由英偉達(dá)、微軟和斯坦福大學(xué)聯(lián)合完成的論文,采用的是1024個(gè)英偉達(dá)A100的運(yùn)算體系,典型的運(yùn)算效率是45%,谷歌的TPV4針對(duì)Transformer做了優(yōu)化,增加了稀疏核,最終的利用率略高,也只是50%,沒做過優(yōu)化的AI專用芯片,最低甚至是0%,完全無(wú)法運(yùn)行。
這樣一來,最低下限又要增加了,按50%的利用率,最低下限是600TOPS。然而這只是兩百萬(wàn)像素,現(xiàn)在國(guó)內(nèi)基本都是800萬(wàn)像素,且不止一個(gè)攝像頭是800萬(wàn)像素。現(xiàn)在我們建設(shè)Transformer只用在一個(gè)800萬(wàn)像素?cái)z像頭上,并且AI處理器只負(fù)責(zé)這一個(gè)攝像頭,即便如此算力還需要2400TOPS,需要10個(gè)Orin-X級(jí)聯(lián),還需要一個(gè)近千美元的PCIe交換機(jī)。實(shí)際上即便是在學(xué)術(shù)領(lǐng)域,目前最高的視覺Transformer的分辨率是1536*1536=236萬(wàn)像素,這可是在1024個(gè)A100顯卡上運(yùn)行的。
除了處理器本身,還有一個(gè)瓶頸,那就是存儲(chǔ)帶寬。在算力需求不高的時(shí)代,處理器的延遲主要來自存儲(chǔ)系統(tǒng),因?yàn)樘幚砥鬟\(yùn)算力很強(qiáng),但到了1000TOPS時(shí)代,處理器的延遲成了最主要的構(gòu)成。
CPU控制GPU工作的流程
來源:互聯(lián)網(wǎng)
GPU和AI芯片都是協(xié)處理器,也就是Device,CPU才是Host主機(jī)。GPU和AI芯片與鼠標(biāo)、鍵盤、顯示器、打印機(jī)一樣都算是外設(shè),任務(wù)的分派和調(diào)度,數(shù)據(jù)流的控制以及數(shù)據(jù)的讀取與寫入均受CPU控制。數(shù)據(jù)首先是在CPU指令調(diào)度下才讀取的,數(shù)據(jù)整形(如果AI芯片或GPU內(nèi)部有標(biāo)量運(yùn)算單元也可以做)后再交給GPU,計(jì)算完后再傳輸給CPU寫入內(nèi)存。
某些系統(tǒng)會(huì)有DMA如MCU,DMA是指無(wú)需經(jīng)過CPU的直接存儲(chǔ),但需經(jīng)過數(shù)據(jù)總線,數(shù)據(jù)總線帶寬未必有內(nèi)存寬;DMA主要是緩解CPU的工作壓力,因?yàn)镸CU內(nèi)部的CPU性能很弱。數(shù)據(jù)中心也有一些基于通訊協(xié)議的DMA,通常只用于數(shù)據(jù)中心的多顯卡系統(tǒng)。
AI運(yùn)算的過程由CPU發(fā)起,取指令、譯碼、讀取數(shù)據(jù)、運(yùn)算、寫入結(jié)果。由于Transformer的權(quán)重模型太大,至少1GB以上,所以無(wú)法放進(jìn)芯片內(nèi)部,只能放在DRAM內(nèi)部,每一次運(yùn)算都需要調(diào)取權(quán)重模型一次,計(jì)算完的結(jié)果還要寫入存儲(chǔ)DRAM。
前面我們看到,由于Transfomer需要超高算力,處理器本身計(jì)算消耗的時(shí)間已經(jīng)是延遲的最低下限,沒有留給讀取和寫入存儲(chǔ)系統(tǒng)的時(shí)間,馮諾依曼架構(gòu)又是數(shù)據(jù)和指令是分開存儲(chǔ)的,無(wú)法同時(shí)讀取。換言之,存儲(chǔ)系統(tǒng)讀取權(quán)重模型和寫入結(jié)果的時(shí)間必須快到可以忽略不計(jì)。即便我們假設(shè)寫入結(jié)果的時(shí)間可以忽略,但是高達(dá)1GB權(quán)重的讀取時(shí)間要做到可以忽略不計(jì),那么需要存儲(chǔ)帶寬達(dá)到1TB/s,那么每次讀取權(quán)重模型的時(shí)間可以接近1毫秒,可以忽略不計(jì)。實(shí)際存儲(chǔ)帶寬也是有利用率,通常不會(huì)到80%。
最新的GDDR6X最高可以做到1TB/s的帶寬,但這只是最小10億的參數(shù)量,典型視覺transformer的參數(shù)量是30-40億,存儲(chǔ)帶寬需要3-4TB/s,英偉達(dá)4萬(wàn)美元的H100PCIe的帶寬不過2.04TB/s。
最后我們來簡(jiǎn)單計(jì)算一下訓(xùn)練所需要的計(jì)算量,語(yǔ)言大模型的訓(xùn)練量30000億個(gè)Token,換算成800萬(wàn)像素就是681小時(shí)左右的視頻,訓(xùn)練需要一次前向反饋和一次反向傳播,還需要一次中間激活,大約是推理運(yùn)算量的4倍。
我們將參數(shù)量取30億,訓(xùn)練681小時(shí)的運(yùn)算量為3萬(wàn)億*30億*8=720萬(wàn)億億,假設(shè)用128個(gè)英偉達(dá)A100(FP16算力是312TOPS)做訓(xùn)練,GPU利用效率是45%,那么需要大約4.7天訓(xùn)練完成。128個(gè)英偉達(dá)A100,目前價(jià)格大約是128*50萬(wàn)人民幣=6400萬(wàn)人民幣,從訓(xùn)練的角度看,大型車企還是撐的住的。
審核編輯:劉清
評(píng)論