LLM 推理性能优化从 vLLM 到投机解码的工程实践关键词LLM 推理、vLLM、PagedAttention、量化、投机解码、KV Cache1. 为什么要关心推理性能训练 LLM 是少数大公司的游戏但推理Inference是每一个落地团队都绕不开的成本中心。一个真实的数字一张 A100-80G跑 13B 模型 FP16朴素 HuggingFace pipeline 大约只能稳定支撑5~10 QPS。同一张卡用 vLLM 量化 投机解码可以稳定到40~60 QPS。5~6 倍的差距全部来自工程优化。本文系统梳理这些手段。2. 先看瓶颈LLM 推理为什么慢LLM 推理分两阶段阶段计算特性瓶颈Prefill处理 prompt计算密集算力FLOPsDecode逐 token 生成访存密集显存带宽绝大多数线上场景输入长、输出短但总耗时 70% 花在 Decode 上。Decode 阶段每生成 1 个 token都要把整个模型权重从显存搬一遍——这就是为什么 LLM 推理是带宽 bound而不是算力 bound。理解这一点所有优化手段都能归类降低权重大小→ 量化减少搬运次数→ Batching、KV Cache 优化减少生成步数→ 投机解码、并行解码3. KV Cache理解一切优化的基石Transformer 自回归生成时每一步只新增 1 个 token但需要它和前面所有 token 做 Attention。如果每次都重算复杂度是 O(n²)。KV Cache把历史 token 的 Key 和 Value 缓存下来每步只算新 token 的 K/V复杂度降到 O(n)。但 KV Cache 本身特别吃显存KV_Cache_Size 2 (K和V) × num_layers × num_heads × head_dim × seq_len × batch × dtype_size以 LLaMA-13B、seq_len2048、batch16、FP16 为例KV Cache 单独占用约26 GB——比模型权重还大。显存利用率往往不是被模型撑爆的而是被 KV Cache 撑爆的。4. vLLM 与 PagedAttention把显存当虚拟内存管传统框架给每个序列预分配max_seq_len大小的连续显存——一旦短请求多显存碎片严重利用率不到 30%。PagedAttentionvLLM 的核心创新借鉴 OS 虚拟内存KV Cache 切成固定大小的block如 16 个 token。每个序列维护一张block table逻辑连续物理离散。不同序列可以共享 block如 prefix caching、beam search。收益显存利用率从 ~30% 提升到90%。同一张卡能容纳的并发请求数翻倍以上。系统 prompt 相同时prefix block 可全局复用prefill 时间几乎为 0。实践建议除非你有特殊原因否则 LLM 服务直接用 vLLM 起步不要自己写 generate 循环。5. Continuous Batching吞吐的秘诀朴素的 batchingStatic Batching把 N 个请求凑齐再一起跑跑完一起返回。问题短请求要等长请求一起结束队头阻塞。凑批等待引入额外延迟。Continuous Batching也叫 in-flight batching每个 decode step 之后已完成的序列立刻退出 batch。新到达的请求随时插入空位立即开始 prefill。效果吞吐提升 2~3 倍尾延迟显著下降。vLLM、TGI、TensorRT-LLM 都内置了这一机制。6. 量化用精度换带宽量化把 FP16 权重压成 INT8 / INT4访存量直接减半甚至 1/4。6.1 主流方案对比方案精度性能部署难度适用GPTQINT4快中通用社区生态成熟AWQINT4快中比 GPTQ 精度损失更小SmoothQuantINT8中低精度敏感场景FP8 (H100)FP8极快低有 H100 直接用6.2 实操经验7B~13B 模型INT4AWQ几乎无损强烈推荐。70B 以上INT4 也能接受但建议先做评测。微调过的模型量化前一定要重新跑一次业务评测集不能只看 PPL。6.3 KV Cache 量化很多人忘记 KV Cache 也能量化。FP8 / INT8 KV Cache 在长上下文场景下显存能再省 50%对 32K context 应用是刚需。7. 投机解码Speculative Decoding减少生成步数Decode 阶段每步只产 1 个 token无论模型多大都得跑一遍前向。投机解码用一个小模型先猜K 个 token再用大模型并行验证小模型快速生成 t1, t2, t3, t4 大模型一次性验证一次前向输出 5 个位置的 logits - t1 接受 → t2 接受 → ... - 第一个被拒绝的位置开始重新生成由于大模型的一次前向能并行验证多个位置计算密集而非访存密集整体步数从 N 降到 ~N/3。收益通常2~3 倍 latency 提升且输出与原大模型完全一致采样意义下等价。变种Medusa不用小模型给主模型加几个并行预测头。EAGLE在特征空间投机比 Medusa 接受率更高。Lookahead Decoding完全无 draft 模型的并行解码。实践中对话类应用上 Medusa / EAGLE 性价比最高。8. 系统层优化清单除了模型层系统层也有大量可挖空间CUDA Graph消除每个 step 的 kernel launch 开销decode 阶段提速 10%~20%。FlashAttention-2/3注意力算子重写prefill 阶段性能翻倍。Tensor Parallel单卡放不下时按列切分权重跨 NVLink 通信。Pipeline Parallel多机部署时按层切分配合 micro-batch 隐藏通信。PD 分离Prefill/Decode Disaggregation把 prefill 和 decode 部署到不同节点避免互相干扰是 2024 年大型推理集群的趋势。9. 一个真实的优化路径我们对一个内部 13B 客服模型做的优化A100-80G 单卡阶段配置QPSTTFT(ms)显存baselineHF transformers FP16680028G vLLMPagedAttention ContBatch2235060G AWQ INT4权重量化3828022G FP8 KVCacheKV 量化4527016G Medusa投机解码6227018G10 倍提升硬件没换。这就是工程优化的力量。10. 选型建议不同规模团队的推荐路径小团队 / 起步直接用 vLLM 或 TGI开 AWQ 量化足够支撑前期 99% 的需求。中型团队 / 自有模型vLLM 自定义调度 Medusa head 微调吞吐再提一档。大型集群 / 高 SLATensorRT-LLM PD 分离 多级缓存配合自研调度系统。11. 结语LLM 推理优化的本质是“让显存带宽花在刀刃上”。所有手段——量化、Paging、投机解码——都是在回答同一个问题如何在每次访存中产出更多 token理解这一点再面对铺天盖地的新论文与新框架你就不会迷失在术语里。先用 vLLM 和量化拿到 5 倍提升再考虑投机解码和 PD 分离工程上够用很久了。至此《AI 应用工程化》三部曲完结RAG让模型有知识Agent让模型能做事Inference让模型跑得起、跑得快希望对正在落地 AI 应用的你有所帮助。
LLM 推理性能优化:从 vLLM 到投机解码的工程实践
LLM 推理性能优化从 vLLM 到投机解码的工程实践关键词LLM 推理、vLLM、PagedAttention、量化、投机解码、KV Cache1. 为什么要关心推理性能训练 LLM 是少数大公司的游戏但推理Inference是每一个落地团队都绕不开的成本中心。一个真实的数字一张 A100-80G跑 13B 模型 FP16朴素 HuggingFace pipeline 大约只能稳定支撑5~10 QPS。同一张卡用 vLLM 量化 投机解码可以稳定到40~60 QPS。5~6 倍的差距全部来自工程优化。本文系统梳理这些手段。2. 先看瓶颈LLM 推理为什么慢LLM 推理分两阶段阶段计算特性瓶颈Prefill处理 prompt计算密集算力FLOPsDecode逐 token 生成访存密集显存带宽绝大多数线上场景输入长、输出短但总耗时 70% 花在 Decode 上。Decode 阶段每生成 1 个 token都要把整个模型权重从显存搬一遍——这就是为什么 LLM 推理是带宽 bound而不是算力 bound。理解这一点所有优化手段都能归类降低权重大小→ 量化减少搬运次数→ Batching、KV Cache 优化减少生成步数→ 投机解码、并行解码3. KV Cache理解一切优化的基石Transformer 自回归生成时每一步只新增 1 个 token但需要它和前面所有 token 做 Attention。如果每次都重算复杂度是 O(n²)。KV Cache把历史 token 的 Key 和 Value 缓存下来每步只算新 token 的 K/V复杂度降到 O(n)。但 KV Cache 本身特别吃显存KV_Cache_Size 2 (K和V) × num_layers × num_heads × head_dim × seq_len × batch × dtype_size以 LLaMA-13B、seq_len2048、batch16、FP16 为例KV Cache 单独占用约26 GB——比模型权重还大。显存利用率往往不是被模型撑爆的而是被 KV Cache 撑爆的。4. vLLM 与 PagedAttention把显存当虚拟内存管传统框架给每个序列预分配max_seq_len大小的连续显存——一旦短请求多显存碎片严重利用率不到 30%。PagedAttentionvLLM 的核心创新借鉴 OS 虚拟内存KV Cache 切成固定大小的block如 16 个 token。每个序列维护一张block table逻辑连续物理离散。不同序列可以共享 block如 prefix caching、beam search。收益显存利用率从 ~30% 提升到90%。同一张卡能容纳的并发请求数翻倍以上。系统 prompt 相同时prefix block 可全局复用prefill 时间几乎为 0。实践建议除非你有特殊原因否则 LLM 服务直接用 vLLM 起步不要自己写 generate 循环。5. Continuous Batching吞吐的秘诀朴素的 batchingStatic Batching把 N 个请求凑齐再一起跑跑完一起返回。问题短请求要等长请求一起结束队头阻塞。凑批等待引入额外延迟。Continuous Batching也叫 in-flight batching每个 decode step 之后已完成的序列立刻退出 batch。新到达的请求随时插入空位立即开始 prefill。效果吞吐提升 2~3 倍尾延迟显著下降。vLLM、TGI、TensorRT-LLM 都内置了这一机制。6. 量化用精度换带宽量化把 FP16 权重压成 INT8 / INT4访存量直接减半甚至 1/4。6.1 主流方案对比方案精度性能部署难度适用GPTQINT4快中通用社区生态成熟AWQINT4快中比 GPTQ 精度损失更小SmoothQuantINT8中低精度敏感场景FP8 (H100)FP8极快低有 H100 直接用6.2 实操经验7B~13B 模型INT4AWQ几乎无损强烈推荐。70B 以上INT4 也能接受但建议先做评测。微调过的模型量化前一定要重新跑一次业务评测集不能只看 PPL。6.3 KV Cache 量化很多人忘记 KV Cache 也能量化。FP8 / INT8 KV Cache 在长上下文场景下显存能再省 50%对 32K context 应用是刚需。7. 投机解码Speculative Decoding减少生成步数Decode 阶段每步只产 1 个 token无论模型多大都得跑一遍前向。投机解码用一个小模型先猜K 个 token再用大模型并行验证小模型快速生成 t1, t2, t3, t4 大模型一次性验证一次前向输出 5 个位置的 logits - t1 接受 → t2 接受 → ... - 第一个被拒绝的位置开始重新生成由于大模型的一次前向能并行验证多个位置计算密集而非访存密集整体步数从 N 降到 ~N/3。收益通常2~3 倍 latency 提升且输出与原大模型完全一致采样意义下等价。变种Medusa不用小模型给主模型加几个并行预测头。EAGLE在特征空间投机比 Medusa 接受率更高。Lookahead Decoding完全无 draft 模型的并行解码。实践中对话类应用上 Medusa / EAGLE 性价比最高。8. 系统层优化清单除了模型层系统层也有大量可挖空间CUDA Graph消除每个 step 的 kernel launch 开销decode 阶段提速 10%~20%。FlashAttention-2/3注意力算子重写prefill 阶段性能翻倍。Tensor Parallel单卡放不下时按列切分权重跨 NVLink 通信。Pipeline Parallel多机部署时按层切分配合 micro-batch 隐藏通信。PD 分离Prefill/Decode Disaggregation把 prefill 和 decode 部署到不同节点避免互相干扰是 2024 年大型推理集群的趋势。9. 一个真实的优化路径我们对一个内部 13B 客服模型做的优化A100-80G 单卡阶段配置QPSTTFT(ms)显存baselineHF transformers FP16680028G vLLMPagedAttention ContBatch2235060G AWQ INT4权重量化3828022G FP8 KVCacheKV 量化4527016G Medusa投机解码6227018G10 倍提升硬件没换。这就是工程优化的力量。10. 选型建议不同规模团队的推荐路径小团队 / 起步直接用 vLLM 或 TGI开 AWQ 量化足够支撑前期 99% 的需求。中型团队 / 自有模型vLLM 自定义调度 Medusa head 微调吞吐再提一档。大型集群 / 高 SLATensorRT-LLM PD 分离 多级缓存配合自研调度系统。11. 结语LLM 推理优化的本质是“让显存带宽花在刀刃上”。所有手段——量化、Paging、投机解码——都是在回答同一个问题如何在每次访存中产出更多 token理解这一点再面对铺天盖地的新论文与新框架你就不会迷失在术语里。先用 vLLM 和量化拿到 5 倍提升再考虑投机解码和 PD 分离工程上够用很久了。至此《AI 应用工程化》三部曲完结RAG让模型有知识Agent让模型能做事Inference让模型跑得起、跑得快希望对正在落地 AI 应用的你有所帮助。