· 王思腾 · 大模型工程 · 10 分钟阅读
LLM 推理优化:大模型为什么慢,以及如何提速降本
大模型推理是自回归逐 token 生成,显存带宽是瓶颈。本文讲清 Prefill/Decode 两阶段、KV Cache 的作用与开销,再逐个聊连续批处理、PagedAttention(vLLM)、量化(INT8/INT4)、投机解码、FlashAttention 与并行策略,以及延迟与吞吐怎么权衡。

大模型应用最大的运营成本往往不是训练,而是推理(inference):用户每发一句话,模型都要实时计算。一次生成可能要几秒、占用昂贵的 GPU。理解推理为什么慢,才能谈优化。本文从原理出发,梳理当前主流的推理加速技术。
一、为什么大模型推理慢且贵
大模型是自回归(autoregressive)生成的:它不是一次性输出整句,而是一个 token 一个 token 地生成,每个新 token 都要把模型完整跑一遍前向计算。
两个关键事实:
- 参数量巨大:70 亿~数千亿参数,权重本身就要占数十 GB 显存;
- 逐 token 串行:生成第 100 个 token 必须等前 99 个算完,无法并行跳过。
而且推理阶段常常是显存带宽受限(memory-bound),而非算力受限——瓶颈在于“把庞大的权重从显存搬到计算单元”的速度,而不是算术运算本身。这决定了优化方向:减少要搬运的数据、提高 GPU 利用率、压缩模型。
二、两个阶段:Prefill 与 Decode
一次推理分两个性质不同的阶段:
| 阶段 | 做什么 | 计算特征 |
|---|---|---|
| Prefill(预填充) | 一次性处理整个输入 prompt,算出每个 token 的表示 | 计算密集(compute-bound),可大规模并行 |
| Decode(解码) | 逐 token 生成输出,每步只算 1 个新 token | 访存密集(memory-bound),GPU 利用率低 |
- Prefill 像“批量读题”,一次并行处理所有输入 token;
- Decode 像“逐字写字”,每步都要加载全部权重却只产出 1 个 token,单请求时 GPU 大量算力闲置。
这就引出了推理优化的核心抓手之一:别让 GPU 在 Decode 阶段闲着。
三、KV Cache:空间换时间
生成每个新 token 时,都要用到前面所有 token 的注意力(Attention)。如果每步都重算全部历史,代价是 O(n²)。
KV Cache 的做法是:把之前每个 token 的 Key、Value 张量缓存下来,生成新 token 时只计算新 token 的部分、复用缓存。这把重复计算省掉了,是现代推理的标配。
但代价是显存占用随上下文长度和并发数线性增长:
- 上下文越长、并发越高,KV Cache 占的显存越多,甚至超过模型权重;
- KV Cache 管理得好不好,直接决定能同时服务多少用户。
围绕 KV Cache 的优化是推理引擎的核心战场。
四、关键优化技术
1. 连续批处理(Continuous Batching)
传统静态批处理要等一批里最长的请求生成完才能释放整批,短请求被拖慢、GPU 空转。
连续批处理(也叫动态批处理 / in-flight batching)以 token 为粒度调度:
- 每个解码步,把当前所有活跃请求动态组成一个 batch 一起算;
- 某请求生成结束就立即退出、新请求立即插入,不必等整批;
- 极大提升 Decode 阶段的 GPU 利用率和吞吐。
这是 vLLM、TGI 等推理引擎高吞吐的基础。
2. PagedAttention 与 vLLM
KV Cache 的显存碎片和浪费是大问题。vLLM 提出 PagedAttention,借鉴操作系统虚拟内存分页思想:
- 把 KV Cache 切成固定大小的块(block/page),逻辑上连续、物理上可不连续;
- 按需分配、跨请求共享(如相同 prompt、beam search),显著减少碎片和预留浪费;
- 结果是显存利用率大幅提升,相同显存下并发量可达数倍。
vLLM 因此成为开源推理服务的事实标准之一。
3. 量化(Quantization)
用更低的数值精度存储权重和计算,减少显存占用和数据搬运:
| 精度 | 说明 |
|---|---|
| FP16/BF16 | 训练/推理常用基准 |
| INT8 | 8 位整数量化,精度损失通常很小 |
| INT4 | 4 位,压缩更激进,体积约为 FP16 的 1/4 |
- 方法:GPTQ、AWQ(权重量化,离线校准);SmoothQuant、W8A8(权重+激活);
- 收益:显存大降、访存减少 → 单卡能装更大模型、Decode 更快;
- 代价:极低比特可能损失效果,需评测;通常要推理引擎和 GPU(如 INT8/INT4 指令)支持。
4. 投机解码(Speculative Decoding)
用一个小模型(draft)快速猜测接下来的几个 token,再用大模型(target)一次并行验证这一串猜测对不对:
- 猜对的 token 直接采纳,猜错的丢弃重算;
- 利用“验证多个 token 可并行”的特性,在不损失输出质量的前提下降低延迟;
- 适合小模型命中率高的场景。
5. FlashAttention
标准 Attention 要把中间的注意力矩阵写回显存,I/O 开销大。FlashAttention 通过分块计算、融合算子,尽量在 GPU 高速缓存(SRAM)里完成、减少对显存的读写,显著加速 Prefill 和长上下文,并省内存。它不改变计算结果,是“免费”的工程加速。
6. 模型与并行层面
- 模型蒸馏 / 用小模型:能用 7B 解决就别上 70B;任务路由让简单请求走小模型(对应 Agent 文章里的路由模式)。
- 张量并行(Tensor Parallelism):把单层权重切到多卡,适合单个大模型放不下;
- 流水线并行(Pipeline Parallelism):把不同层放到不同卡,适合多机;
- 前缀缓存 / Prompt 缓存:对重复的系统提示词、公共前缀缓存 KV,多请求共享。
五、延迟 vs 吞吐:两个目标
推理优化要先分清你优化什么:
- 面向在线对话:关注首 token 延迟(TTFT)和每 token 延迟(TPOT/ITL),用户要“秒回、打字流畅”,倾向小 batch、低延迟;
- 面向离线批处理:关注总吞吐(tokens/s)和成本,可大 batch、高并发、激进量化。
工程上常通过连续批处理、合理的最大并发、前缀缓存在两者间平衡,并对在线/离线用不同部署。
六、常用推理框架
| 框架 | 特点 |
|---|---|
| vLLM | PagedAttention、连续批处理、高吞吐,开源主流 |
| TensorRT-LLM(NVIDIA) | 极致性能,算子/量化深度优化,运维较重 |
| SGLang | 结构化生成、RadixAttention 前缀复用 |
| TGI(HuggingFace) | 易部署,生态成熟 |
| llama.cpp / Ollama | CPU/单卡、量化本地运行,适合边缘与开发 |
| 云托管 | 各云厂 Serverless 推理 API,免运维、按量计费 |
七、落地建议清单
- 先选对模型大小:小模型能达标就不用大模型,配合路由;
- 上推理引擎:用 vLLM/SGLang 等获得连续批处理与 PagedAttention;
- 开前缀缓存:系统提示词、公共上下文复用 KV;
- 试量化:INT8/INT4(AWQ/GPTQ)显存立省,务必做效果评测;
- 长文本优化:FlashAttention、合理上下文长度、必要时用 KV 量化;
- 区分在线/离线部署,分别优化延迟与吞吐;
- 建立监控:TTFT、TPOT、吞吐、显存、每千 token 成本,用数据驱动调优。
八、小结
LLM 推理的本质矛盾是:自回归逐 token 生成 + 访存受限。优化围绕三条主线展开:
- 喂饱 GPU——连续批处理、PagedAttention/vLLM 提升 Decode 利用率与 KV 管理;
- 减少搬运与计算——KV Cache、FlashAttention、量化、前缀缓存、蒸馏小模型;
- 对齐业务目标——在线重延迟、离线重吞吐,用监控和评测持续权衡。
把这些手段组合起来,同样的模型往往能在不牺牲体验的前提下,把吞吐提升数倍、成本砍掉一大半——这正是大模型从 demo 走向规模化落地的关键工程能力。
本文由 AI 辅助创作,所有内容仅供交流与参考。


