目前,全局性的端到端自动驾驶都是基于大语言模型LLM或多模态大模型的。
这是站在巨人肩上,这种全局性的端到端自动驾驶可以减少95%以上的自动驾驶开发人员,研发成本大幅降低。不过这种设计,对运算芯片的存储带宽要求很高,而算力完全可以忽略不计。
本文主要根据https://www.baseten.co/blog/llm-transformer-inference-guide和https://arxiv.org/pdf/2404.14294之A Survey on Efficient Inference for Large Language Models撰写,大模型或者说LLM的推理延迟95%以上取决于存储带宽,算力大小基本可以忽略不计。
当前的主流 LLM 基本都是 Decoder Only 的 Transformer 模型,其推理过程可分为两个阶段:
与传统的CNN 模型推理不同,大语言模型的推理通常会分成 prefill 和 decoding 两个阶段。每一个请求发起后产生的推理过程都会先经历一个 Prefill 过程,prefill 过程会计算用户所有的输入,并生成对应的KV 缓存,再经历若干个 decoding 过程,每一个 decoding 过程,服务器都会生成一个字符,并将其放入到 KV 缓存当中,之后依次迭代。由于 decoding 过程是逐个字符生成的,每一段答案的生成都需要很长时间,会生成很多字符,所以 decoding 阶段的数量非常多,占到整个推理过程的 90% 以上。在 Prefill 过程中,虽计算量很大,因为要一次性完成用户输入的所有词的计算,但它只是一次性的过程,所以在整个推理中只占不到 10% 的时间。
Prefill阶段还包括把用户的输入进行向量化即tokenize,Decoding 阶段不需要 tokenize。每一次做 decoding 都会直接从计算开始,整个decoding 过程会占掉 80% 的时间,而后面的 sampling,也就是采样生成词的过程,也要占掉 10% 的时间。但它会有一个 detokenize 的时间,detokenize 是指生成了一个词之后,这个生成的词是个向量,需要把它解码回文本,这一操作大概会占掉 5% 的时间,最后将这个生成的词返回给用户。
首Token阶段,延迟取决于算力大小,后续decoding阶段,延迟取决于存储带宽。并发量或批处理batch size也很重要,简单地说,batch size越高,计算单元的利用效率就越高,因为它是可以并行的,但中间产生的KV 缓存会很高,batch size高到一定阶段,KV缓存会超过总内存,以至于无法计算,彻底死机。自动驾驶系统的给定时间段内只会有一个任务请求,大致可看成batch size是1,而ChatGPT这样可能会同时接到多个任务需求。自动驾驶系统就无需考虑KV缓存溢出。Batch size太低,意味着计算单元的利用率就很低。
我们来计算自动驾驶系统端到端推理所需要的时间,总推理时间是首个token产生的时间加每秒token与token的乘积。Total generation time = prefill time + number of tokens * time/token。
先来计算prefill time,Prefill time = number of tokens * ( number of parameters / accelerator compute bandwidth),这里的加速器计算带宽就是算力。
Token数是多少呢?token,它在NLP自然语言处理中指最小的词,在图像领域,指patch,即最小的图像“块”。tokenization指将输入的语言或图像切割为token的过程,这个自然是像素越小越好,很简单的道理,一句话分词分的越细,这句话的语义也就更准确,一句话分的越粗,语义偏差就可能越大。假设我们使用谷歌的ViT-E模型,输入800万像素的视频,采用16*16的patch,那么token数大约是4.08万个,如果是200万像素,那么token差不多是1万个,采用INT8精度,假设大模型的参数量是70亿,芯片算力是77TOPS,那么prefill时间是10000*70亿/77TOPS=886毫秒。
每token所费时间=total number of bytes moved (the model weights) / accelerator memory bandwidth,采用INT8精度,假设大模型的参数量是70亿,芯片存储带宽是68GB/s,可以计算7GB/68=10毫秒,那么总时间为886+10000*10=100886毫秒,即100.9秒钟,首个token所须要的时间不到1%,可以忽略,99%的延迟都由存储带宽决定。同时这个延迟太高了,高速自动驾驶须要的帧率是25Hz-30Hz,也就是说一次推理所消耗的时间不能超过40毫秒,显然,直接用transformer做自动驾驶完全不可能。需要指出谷歌的这个ViT模型本身的参数量是很小的,基础模型只有8600万参数,我们只是用ViT模型将视频tokenization,ViT的二代将16*16扩张为32*32,token数量会减少到原来的1/4,即使如此也无法用于自动驾驶当中。
常见芯片存储带宽统计
直接在自动驾驶领域内用大模型是不可能的,解决办法有两个,一个是减少token输入数量,另一个是降低大模型的参数量。
实际上,目前所有量产车型的图像特征提取都还是10年前就在使用的CNN,即使再多优化,直接用transformer处理视频都完全不可能,而CNN是典型的非端到端。
骨干网还是基于CNN的RegNET,国内大多用ResNet50,这是2015年由大神何凯明提出的,至今仍长盛不衰。
至于降低模型参数是不大可能的,众所周知,大模型之所以性能好就是因为参数足够多,目前无论哪个领域,模型的参数量都在飞速增长。
自动驾驶领域很长一段时间内都还是BEV+OCC的天下,实际就算是BEV+OCC时代,存储带宽的重要性也不亚于算力。很简单,数据训练量越大,最后得出的模型参数量自然就越高,算法的不断迭代就是模型参数的不断增长,模型参数越大,存储带宽所造成的延迟就越明显,而端到端大模型时代则是完全可以忽略算力因素。
免责说明:本文观点和数据仅供参考,和实际情况可能存在偏差。本文不构成投资建议,文中所有观点、数据仅代表笔者立场,不具有任何指导、投资和决策意见。