目前,全局性的端到端自動(dòng)駕駛都是基于大語(yǔ)言模型LLM或多模態(tài)大模型的。
這是站在巨人肩上,這種全局性的端到端自動(dòng)駕駛可以減少95%以上的自動(dòng)駕駛開(kāi)發(fā)人員,研發(fā)成本大幅降低。不過(guò)這種設(shè)計(jì),對(duì)運(yùn)算芯片的存儲(chǔ)帶寬要求很高,而算力完全可以忽略不計(jì)。
本文主要根據(jù)https://www.baseten.co/blog/llm-transformer-inference-guide和https://arxiv.org/pdf/2404.14294之A Survey on Efficient Inference for Large Language Models撰寫,大模型或者說(shuō)LLM的推理延遲95%以上取決于存儲(chǔ)帶寬,算力大小基本可以忽略不計(jì)。
當(dāng)前的主流 LLM 基本都是 Decoder Only 的 Transformer 模型,其推理過(guò)程可分為兩個(gè)階段:
與傳統(tǒng)的CNN 模型推理不同,大語(yǔ)言模型的推理通常會(huì)分成 prefill 和 decoding 兩個(gè)階段。每一個(gè)請(qǐng)求發(fā)起后產(chǎn)生的推理過(guò)程都會(huì)先經(jīng)歷一個(gè) Prefill 過(guò)程,prefill 過(guò)程會(huì)計(jì)算用戶所有的輸入,并生成對(duì)應(yīng)的KV 緩存,再經(jīng)歷若干個(gè) decoding 過(guò)程,每一個(gè) decoding 過(guò)程,服務(wù)器都會(huì)生成一個(gè)字符,并將其放入到 KV 緩存當(dāng)中,之后依次迭代。由于 decoding 過(guò)程是逐個(gè)字符生成的,每一段答案的生成都需要很長(zhǎng)時(shí)間,會(huì)生成很多字符,所以 decoding 階段的數(shù)量非常多,占到整個(gè)推理過(guò)程的 90% 以上。在 Prefill 過(guò)程中,雖計(jì)算量很大,因?yàn)橐淮涡酝瓿捎脩糨斎氲乃性~的計(jì)算,但它只是一次性的過(guò)程,所以在整個(gè)推理中只占不到 10% 的時(shí)間。
Prefill階段還包括把用戶的輸入進(jìn)行向量化即tokenize,Decoding 階段不需要 tokenize。每一次做 decoding 都會(huì)直接從計(jì)算開(kāi)始,整個(gè)decoding 過(guò)程會(huì)占掉 80% 的時(shí)間,而后面的 sampling,也就是采樣生成詞的過(guò)程,也要占掉 10% 的時(shí)間。但它會(huì)有一個(gè) detokenize 的時(shí)間,detokenize 是指生成了一個(gè)詞之后,這個(gè)生成的詞是個(gè)向量,需要把它解碼回文本,這一操作大概會(huì)占掉 5% 的時(shí)間,最后將這個(gè)生成的詞返回給用戶。
首Token階段,延遲取決于算力大小,后續(xù)decoding階段,延遲取決于存儲(chǔ)帶寬。并發(fā)量或批處理batch size也很重要,簡(jiǎn)單地說(shuō),batch size越高,計(jì)算單元的利用效率就越高,因?yàn)樗强梢圆⑿械模虚g產(chǎn)生的KV 緩存會(huì)很高,batch size高到一定階段,KV緩存會(huì)超過(guò)總內(nèi)存,以至于無(wú)法計(jì)算,徹底死機(jī)。自動(dòng)駕駛系統(tǒng)的給定時(shí)間段內(nèi)只會(huì)有一個(gè)任務(wù)請(qǐng)求,大致可看成batch size是1,而ChatGPT這樣可能會(huì)同時(shí)接到多個(gè)任務(wù)需求。自動(dòng)駕駛系統(tǒng)就無(wú)需考慮KV緩存溢出。Batch size太低,意味著計(jì)算單元的利用率就很低。
我們來(lái)計(jì)算自動(dòng)駕駛系統(tǒng)端到端推理所需要的時(shí)間,總推理時(shí)間是首個(gè)token產(chǎn)生的時(shí)間加每秒token與token的乘積。Total generation time = prefill time + number of tokens * time/token。
先來(lái)計(jì)算prefill time,Prefill time = number of tokens * ( number of parameters / accelerator compute bandwidth),這里的加速器計(jì)算帶寬就是算力。
Token數(shù)是多少呢?token,它在NLP自然語(yǔ)言處理中指最小的詞,在圖像領(lǐng)域,指patch,即最小的圖像“塊”。tokenization指將輸入的語(yǔ)言或圖像切割為token的過(guò)程,這個(gè)自然是像素越小越好,很簡(jiǎn)單的道理,一句話分詞分的越細(xì),這句話的語(yǔ)義也就更準(zhǔn)確,一句話分的越粗,語(yǔ)義偏差就可能越大。假設(shè)我們使用谷歌的ViT-E模型,輸入800萬(wàn)像素的視頻,采用16*16的patch,那么token數(shù)大約是4.08萬(wàn)個(gè),如果是200萬(wàn)像素,那么token差不多是1萬(wàn)個(gè),采用INT8精度,假設(shè)大模型的參數(shù)量是70億,芯片算力是77TOPS,那么prefill時(shí)間是10000*70億/77TOPS=886毫秒。
每token所費(fèi)時(shí)間=total number of bytes moved (the model weights) / accelerator memory bandwidth,采用INT8精度,假設(shè)大模型的參數(shù)量是70億,芯片存儲(chǔ)帶寬是68GB/s,可以計(jì)算7GB/68=10毫秒,那么總時(shí)間為886+10000*10=100886毫秒,即100.9秒鐘,首個(gè)token所須要的時(shí)間不到1%,可以忽略,99%的延遲都由存儲(chǔ)帶寬決定。同時(shí)這個(gè)延遲太高了,高速自動(dòng)駕駛須要的幀率是25Hz-30Hz,也就是說(shuō)一次推理所消耗的時(shí)間不能超過(guò)40毫秒,顯然,直接用transformer做自動(dòng)駕駛完全不可能。需要指出谷歌的這個(gè)ViT模型本身的參數(shù)量是很小的,基礎(chǔ)模型只有8600萬(wàn)參數(shù),我們只是用ViT模型將視頻tokenization,ViT的二代將16*16擴(kuò)張為32*32,token數(shù)量會(huì)減少到原來(lái)的1/4,即使如此也無(wú)法用于自動(dòng)駕駛當(dāng)中。
常見(jiàn)芯片存儲(chǔ)帶寬統(tǒng)計(jì)
直接在自動(dòng)駕駛領(lǐng)域內(nèi)用大模型是不可能的,解決辦法有兩個(gè),一個(gè)是減少token輸入數(shù)量,另一個(gè)是降低大模型的參數(shù)量。
實(shí)際上,目前所有量產(chǎn)車型的圖像特征提取都還是10年前就在使用的CNN,即使再多優(yōu)化,直接用transformer處理視頻都完全不可能,而CNN是典型的非端到端。
骨干網(wǎng)還是基于CNN的RegNET,國(guó)內(nèi)大多用ResNet50,這是2015年由大神何凱明提出的,至今仍長(zhǎng)盛不衰。
至于降低模型參數(shù)是不大可能的,眾所周知,大模型之所以性能好就是因?yàn)閰?shù)足夠多,目前無(wú)論哪個(gè)領(lǐng)域,模型的參數(shù)量都在飛速增長(zhǎng)。
自動(dòng)駕駛領(lǐng)域很長(zhǎng)一段時(shí)間內(nèi)都還是BEV+OCC的天下,實(shí)際就算是BEV+OCC時(shí)代,存儲(chǔ)帶寬的重要性也不亞于算力。很簡(jiǎn)單,數(shù)據(jù)訓(xùn)練量越大,最后得出的模型參數(shù)量自然就越高,算法的不斷迭代就是模型參數(shù)的不斷增長(zhǎng),模型參數(shù)越大,存儲(chǔ)帶寬所造成的延遲就越明顯,而端到端大模型時(shí)代則是完全可以忽略算力因素。
免責(zé)說(shuō)明:本文觀點(diǎn)和數(shù)據(jù)僅供參考,和實(shí)際情況可能存在偏差。本文不構(gòu)成投資建議,文中所有觀點(diǎn)、數(shù)據(jù)僅代表筆者立場(chǎng),不具有任何指導(dǎo)、投資和決策意見(jiàn)。