引言
你有没有过这样的体验:向AI助手问一个问题,它思考了几秒钟,然后给你一段精彩的回答。你惊叹于它的智能,但那个“几秒钟”的等待,总让你觉得差了点什么。
另一边,ChatGPT、Claude、文心一言这些产品,背后的大模型一个比一个强大,参数量动辄上千亿,能写诗、能编程、能看病。但一旦把它们部署到实际产品中,问题就来了——响应慢、成本高、并发一上来就崩。
这就是大模型行业的“最后一公里”问题:模型很聪明,但用起来很慢。
这背后不是算力不够,而是推理架构的工程挑战。本文从技术角度拆解,为什么大模型推理这么难,以及业界是如何解决这个问题的。
一、大模型推理的独特困境
要理解大模型推理为什么难,先要理解它和传统AI推理的区别。
1.1 传统推理 vs 自回归生成
传统AI模型(比如图像分类、目标检测)的推理是一次性的:输入一张图,模型计算一次,输出一个结果。整个过程是固定长度的计算,输入有多大,计算量就有多大。
大模型(比如GPT系列)的推理完全不同。它是自回归生成的:模型一次只生成一个token(大约0.75个英文单词),然后把新生成的token拼接到输入中,再生成下一个token。生成一段100个token的回答,模型要跑100次。
这意味着什么?生成一个短回答的计算量,是图像分类的几十倍甚至上百倍。而且随着对话变长,计算量线性增长——聊得越久,越慢。
1.2 推理的两个阶段:Prefill和Decoding
大模型的每一次生成,可以拆成两个阶段:
Prefill阶段(预填充):模型读取用户输入的prompt,并行计算所有token的注意力矩阵。这个阶段计算密集,但只做一次。
Decoding阶段(逐词生成):模型一个一个地生成新token,每生成一个,都要重新计算当前token与之前所有token的注意力。这个阶段是内存密集型的——主要的瓶颈不是算力,而是把模型权重从显存搬到计算单元的速度。
用一个比喻来理解:Prefill像是“阅读理解”——模型先把你的问题完整看一遍;Decoding像是“逐词回答”——每说一个字,都要回想一下前面说过的所有字。回答越长,回想的工作量越大。
1.3 KV Cache:用内存换时间
为了解决Decoding阶段重复计算的问题,业界引入了KV Cache(键值缓存)。
原理很简单:在Prefill阶段计算好的注意力键值对,缓存起来,Decoding阶段直接复用,不需要重新计算。这是一种典型的“用空间换时间”——牺牲显存,换取更快的生成速度。
KV Cache的代价不小。以LLaMA-7B模型为例,生成2048个token时,KV Cache大约占用1-2GB显存。如果同时处理多个请求(比如同时服务10个用户),光是KV Cache就要吃掉10-20GB显存——这已经是一张A10显卡的全部容量了。
KV Cache的存在,让大模型推理的显存占用变成动态的:短对话占得少,长对话占得多。这让资源调度变得异常复杂。
二、推理延迟的三大瓶颈
说清楚了原理,我们再来拆解延迟来自哪里。
2.1 访存带宽:被忽略的罪魁祸首
很多人以为大模型慢是因为计算量大。其实不然。
计算一次矩阵乘法,GPU要做的算术运算次数是固定的。但把模型权重从显存搬到计算单元(SM)这个过程,消耗的时间往往比计算本身还多。这是因为显存带宽的增长速度远低于算力的增长速度。
用数字说话:一张NVIDIA A100显卡的算力是312 TFLOPS(每秒312万亿次浮点运算),但显存带宽只有1.5 TB/s。对于LLaMA-7B(约70亿参数),每生成一个token,需要把整个模型权重从显存中读取一遍。70亿个FP16参数占用14GB显存,读取一次需要约9毫秒——这还没开始算,光是把权重搬过来就花了9毫秒。
这就是为什么大模型推理被称为访存密集型任务:瓶颈不在计算,在搬运数据。
2.2 动态批处理的权衡
为了提升吞吐量,推理系统会使用动态批处理:把多个用户的请求攒在一起,一次性提交给GPU计算。
这样做的好处是减少GPU的空闲时间——GPU的并行能力很强,一次算1个请求和一次算8个请求,时间差不了太多。坏处是:攒请求的过程需要等待,会让单次请求的延迟增加。
批处理大小 | 单请求延迟 | 整体吞吐量 |
1 | 50ms | 20 req/s |
8 | 65ms | 123 req/s |
32 | 120ms | 267 req/s |
64 | 210ms | 305 req/s |
从数据可以看出:批处理大小从1增加到8,吞吐量提升了6倍,延迟只增加了30%;但从8增加到64,吞吐量只提升了2.5倍,延迟却翻了3倍。这是一个需要精细调优的权衡。
2.3 变长序列的处理效率
用户的输入长度是随机的——有的只问一句话,有的贴一篇论文。GPU对这种变长序列的处理效率很低。
原因在于GPU的并行计算模型:它要求所有请求的计算形状一致。处理变长序列时,系统会把所有请求填充(padding)到同一个长度,短的请求后面补上无效数据。这会导致大量算力浪费在填充数据上。
极端情况下,9个短请求和1个长请求一起批处理,计算量可能比单独处理10个长请求还大——因为填充带来了巨大的浪费。
三、业界的主流优化方案
面对这些困境,学术界和工业界提出了一系列解决方案。
3.1 量化:让模型变“轻”
量化是目前最成熟、最有效的加速手段。核心思想:把模型权重从高精度(FP16)转换成低精度(INT8、INT4)。
FP16的每个数值用16位表示,INT8只用8位——体积缩小一半,INT4缩小到四分之一。体积变小意味着:显存占用减少、访存时间缩短、推理速度变快。
量化的代价是精度损失。好消息是,现代量化技术(如GPTQ、AWQ)可以把精度损失控制在0.5%-1%以内,对于大多数应用场景完全可以接受。
实测数据显示,INT8量化后的LLaMA-7B模型,推理速度提升约2倍,显存占用减少50%;INT4量化的速度提升约3-4倍,显存占用减少75%。
3.2 FlashAttention:IO感知的注意力算法
标准的Attention计算需要把整个注意力矩阵(序列长度×序列长度)写入显存再读出。当序列很长时(比如处理一篇长文档),这个矩阵可能大到几十GB,远超显存容量。
FlashAttention的核心洞察是:为什么不直接在SRAM(片上高速缓存)里计算注意力,省掉写入显存的过程?
FlashAttention通过分块计算和重排序,把注意力矩阵的计算拆成多个小块,每个小块完全在SRAM内完成,不需要中间结果写入显存。效果惊人:在长序列场景下,FlashAttention比标准Attention快2-4倍,显存占用从二次方降到线性。
目前FlashAttention已经成为大模型推理的事实标准,主流的推理框架(vLLM、TensorRT-LLM)都内置了这项技术。
3.3 PagedAttention:操作系统的灵感
vLLM提出的PagedAttention借鉴了操作系统的虚拟内存思想。
传统方案的KV Cache是连续存储的——每个请求的KV Cache占用一块连续的内存空间。当请求长度变化时,需要频繁地分配、释放、移动内存,导致显存碎片化,利用率通常在60%-70%。
PagedAttention把KV Cache分成固定大小的“页”(通常16KB或64KB),不要求连续存储。这带来了两个好处:显存利用率提升到90%以上,可以零拷贝地共享公共前缀(比如系统提示词)。
实测中,vLLM的吞吐量是传统方案的10-20倍——这不是渐进式改进,是数量级的颠覆。
3.4 推测解码:用“小聪明”换速度
这是最反直觉的优化:用一个小模型来帮大模型“猜词”。
原理如下:小模型(比如参数量只有1亿)生成速度很快,但质量一般。大模型(参数量100亿)质量高,但生成慢。推测解码让两个模型协同工作——小模型先快速生成若干个候选token,大模型一次性验证这些token是否正确。
因为大模型验证一批token的计算量和生成一个token差不多,整体速度就上来了。在代码生成等确定性较强的场景,推测解码可以将推理速度提升2-3倍。
四、不同场景的选型建议
大模型推理没有放之四海皆准的方案,决策需要基于具体场景。
场景 | 延迟要求 | 吞吐量要求 | 推荐方案 |
实时对话机器人 | <500ms | 中 | INT4量化 + FlashAttention + 小批处理 |
离线批量处理 | 不敏感 | 极高 | INT8量化 + 大批处理 + PagedAttention |
长文档摘要 | 中等 | 低 | FlashAttention + 推测解码 |
边缘设备部署 | <100ms | 低 | INT4/INT8量化 + 小模型蒸馏 |
如果你的场景是实时对话:优先保证延迟,采用小批处理(batch size 4-8),配合INT4量化和FlashAttention。
如果你的场景是离线批处理:优先保证吞吐量,采用大批处理(batch size 32-64),配合PagedAttention提高显存利用率。
如果你的场景是长上下文(比如处理几十页的PDF):FlashAttention是必备技术,PagedAttention也能帮助管理动态增长的KV Cache。
五、总结与展望
大模型推理的“最后一公里”问题,本质上是一个系统工程问题——不是模型不够强,而是怎么让它在实际场景中跑得又快又便宜。
目前业界的优化方向正在从“单一技术突破”转向“全栈协同优化”:
算法层:量化和稀疏化在持续演进,1-bit量化已经开始进入实用阶段
系统层:PagedAttention开创了新的思路,未来可能会出现更多借鉴操作系统设计的技术
硬件层:GPU厂商开始在芯片中集成专门的Attention计算单元,推理速度有望再提升一个数量级
对于开发者和企业来说,选择推理方案时应该记住三个原则:
先用最简单的方案跑通,不要过早优化
识别真正的瓶颈——是访存带宽、计算能力,还是显存容量?
系统性评估——延迟、吞吐、成本三者之间的权衡,没有完美的方案,只有最适合的取舍
回到开头的问题:为什么AI很聪明,但用起来很慢?
答案不是“算力不够”,而是“我们还在学习如何让聪明的大脑跑得更快”。大模型从“能用”到“好用”,需要的不是更聪明的模型,而是更聪明的工程。