LLM 推理优化:Speculative Decoding 与 KV Cache
LLM 推理慢,主要慢在 decode(逐 token 生成)阶段。本文讲清两个最值钱的优化:KV Cache(别重复算历史)和 Speculative Decoding(小模型起草、大模型验证,并行多 token)。加上连续批处理和量化,能把推理吞吐拉到一个数量级。
本文要点
- 主题聚焦:大模型、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
LLM 推理慢,是上量后的核心瓶颈。但"慢"不是均匀的——理解两个阶段、两个优化,你能把推理速度拉到一个数量级。这篇讲自部署 LLM 时最值钱的优化手段。
一、先理解:LLM 推理的两个阶段
LLM 生成一次回答,分两段:
1. Prefill(预填充):处理输入 prompt,算出所有位置的 KV。这一步可以并行(一次算完整个 prompt),所以快——首 token 延迟主要花在这。
2. Decode(解码):逐个生成输出 token,每个 token 依赖前一个,严格串行。输出 1000 token = 1000 次串行前向。总延迟主要花在这。
所以优化重点:prefill 靠并行(已经够快),decode 靠减少串行步数或让每步更快。下面两个优化都针对 decode。
二、KV Cache:别重复算历史
decode 时,每生成一个新 token,理论上要重新算一遍前面所有 token 的注意力。这显然浪费——前面的部分没变,重复算是无谓开销。
KV Cache:把前面所有层的 Key/Value 缓存住,生成新 token 时直接复用,只算新 token 的部分。
效果:decode 每步的计算量从 O(序列长度) 降到 O(1),速度提升巨大。这是 LLM 推理的基础优化,几乎所有推理框架默认开。
代价:显存。KV cache 占显存(随序列长度 × 层数 × 维度增长),长上下文/高并发下 KV cache 可能比模型权重还占显存。所以衍生了优化:
- PagedAttention(vLLM):把 KV cache 分页管理,减少碎片、提升显存利用率。这是 vLLM 吞吐高的核心。
- 量化 KV cache:fp16 → fp8/int8,省一半显存。
- KV cache 卸载:长上下文时部分卸到 CPU/SSD。
KV cache 是"用显存换速度"。理解它,你才理解为什么长上下文/高并发特别吃显存。
三、Speculative Decoding:用小模型加速大模型
KV cache 优化了"每步更快",但 decode 还是串行(一步一个 token)。Speculative Decoding(投机解码) 打破串行:让一个小模型先"猜"接下来几个 token,大模型一次性并行验证这些猜测。
小模型(draft) 快速生成 k 个候选 token: [t1, t2, t3]
大模型(target) 一次性并行算这 k 个位置 → 验证哪些对
├ 猜对的: 直接接受(大模型不用单独算)
└ 猜错的: 从错的位置重新生成
关键洞察:大模型并行验证 k 个 token 的成本,约等于它自己生成 1 个 token(因为并行)。所以如果小模型猜得准(比如 k=4 个里中 3 个),大模型一次"有效推进"3 个 token,速度近 3 倍。
效果:在猜得准的场景,吞吐提升 2–3 倍,且输出完全等价(大模型验证过的,质量无损)。
适用条件:
- 有小模型可用(draft model,通常是同家族小几号的)。
- 小模型猜得准(任务和小模型能力匹配;纯创意写作猜不准、加速有限)。
- 推理框架支持(vLLM、TensorRT-LLM、TGI 都支持)。
代价:猜不准时浪费算力(验证了但没接受)。整体仍是净收益,但有边界。
四、连续批处理(Continuous Batching)
传统批处理:等一批请求都到齐再一起算,或等一批都完成再下一批。问题:请求长短不一,短的等长的,GPU 空转。
连续批处理(也叫 in-flight batching / dynamic batching):请求随到随进、完成即出,每一步动态组批。短的完成就移出、新的加进来,GPU 始终满载。
效果:吞吐大幅提升(vLLM、TGI 的核心能力之一)。和 PagedAttention 配合,是高并发推理的标配。
五、量化:让模型本身更轻
模型权重量化(fp16 → int8/int4),直接降显存、提速度:
- 显存降一半到 1/4(同样 GPU 跑更大模型)。
- 推理更快(int8/int4 计算更快)。
- 代价:轻微质量损失(int4 在部分任务可察觉,int8 基本无损)。
主流:AWQ、GPTQ、fp8(新硬件)。vLLM 等框架原生支持加载量化模型。
六、组合起来:一个推理优化清单
自部署 LLM 提速,按 ROI 排序:
- KV Cache(默认开,基础)。
- 连续批处理 + PagedAttention(用 vLLM 等框架,高并发必备)。
- 量化(AWQ/GPTQ,省显存+提速,质量可控)。
- Speculative Decoding(有合适小模型时,吞吐再翻倍)。
- prefix/prompt caching(相同前缀复用 KV,system prompt 固定场景大省)。
前三个是"标配",后两个是"进阶"。叠起来,单卡吞吐能比朴素推理高一个数量级。
七、什么时候自己优化 vs 用 API
这些优化主要针对自部署(你在跑自己的推理服务)。
- 调商业 API:优化是供应商的事,你只能控制 prompt(缩短、用 prompt caching)和并发。
- 自部署:上述优化全适用,是省卡、提吞吐的核心。
所以**"自部署要不要做推理优化"不是选择题,是必做题**——不优化的自部署,成本和延迟都没竞争力。
小结
LLM 推理优化,理解两阶段、掌握两件套:
- 两个阶段:prefill(并行,快)+ decode(串行,慢,优化重点)。
- KV Cache:别重算历史,"用显存换速度"。PagedAttention 进一步优化显存。
- Speculative Decoding:小模型猜、大模型验证,打破串行、吞吐翻倍、质量无损。
- 加上连续批处理 + 量化 + prompt caching,自部署推理能快一个量级。
记住一句:LLM 推理的瓶颈不是"算力不够",而是"串行解码 + 显存浪费"。优化这两点的工具(KV cache、speculative decoding、PagedAttention)都已经成熟,自部署 LLM 不做这些优化,等于浪费你买的 GPU。
Related