L4.2 推理加速机制
三维坐标
layer: L4(推理与 Serving)|level: Senior|pillar: 训推框架上一篇我们把推理引擎的「骨架」(PagedAttention、连续 batching)搭了起来。本篇聚焦让同一块卡多榨出 2–5× 吞吐的四类正交加速机制:用投机采样砍 decode 步数、用 Prefix Caching 砍重复计算、用量化砍显存与带宽、用动态 batching + 准入控制在 SLA 约束下把利用率拉满。它们可叠加,是 Senior 工程师做推理性价比治理的核心工具箱。
学习目标
- 前置知识:读过 L0.2(Roofline / 算力墙·显存墙,知道为什么 decode 卡在显存带宽)、L1.1(FP8 低精度与 E4M3/E5M2 的硬件根因)、以及本层 L4.1(PagedAttention 与连续 batching 的引擎骨架)。会写基础 Python、用过 HuggingFace
transformers跑过一次推理即可。 - 学完产出:① 能用「draft–verify + 拒绝采样」一句话讲清投机采样为何是无损加速,并用接受率 α 估算加速比;② 能说清 Prefix Caching 的块级哈希与 Copy-on-Write 如何同时省 prefill 算力和 KV 显存,知道「最稳定的内容放最前面」的工程铁律;③ 能区分 AWQ(激活感知)/GPTQ(二阶误差补偿)/FP8(硬件原生)三条量化路线的量化对象、位宽与硬件依赖,给出选型判据;④ 能用排队论 解释「利用率拉满」与「守住尾延迟」为何天然冲突,并用准入控制 + 优先级分队列设计一套 SLA 守护方案;⑤ 亲手对同一小模型做 AWQ / GPTQ 4bit 量化,量出显存、TPOT 与 perplexity 三项指标的真实兑换比。
- 阅读姿势:盯住一条主线——推理加速的所有机制,本质都在回答「如何让每次从 HBM 搬权重多干有用功」。投机采样把多步 decode 合成一次 verify、Prefix Caching 让重复前缀只搬一次、量化把每次搬的位宽减半、动态 batching 把一次搬运摊给整批请求;四者正交、可叠加,但都受同一道显存带宽墙约束。
背景与现状
LLM 推理的根本矛盾,是 decode 阶段是「访存密集(memory-bound)」而非「算力密集」:每生成一个 token,都要把整个模型权重从 HBM 搬一遍进 SM,但实际只算一个 token 的 GEMV,算力利用率常常低于 5%。这意味着——GPU 的 FLOPS 大量空转,瓶颈在显存带宽。所有推理加速机制,本质都在回答同一个问题:如何让每次「搬权重」干更多有用功。
四大机制对应四条不同的「省」路径:
- 投机采样(Speculative Decoding):让小模型一次猜多个 token,大模型一次性并行验证——把多次访存密集的 decode 合并成一次算力密集的 verify,省的是 decode 步数。
- Prefix Caching:系统 prompt、few-shot、多轮历史的 KV 完全相同,没必要重算——省的是重复 prefill 计算与显存。
- 量化(Quantization):把 FP16 权重压成 INT8/INT4/FP8,省的是显存占用与访存带宽,让 memory-bound 的 decode 直接变快。
- 动态 batching + 准入控制:把零散请求拼成大 batch 摊薄权重搬运成本,省的是单请求的边际权重读取,同时用排队论守住 SLA。
业界信号:vLLM 把 Automatic Prefix Caching、Speculative Decoding、FP8/AWQ/GPTQ 量化全部内置为开箱即用开关;TensorRT-LLM 把投机采样与 INT4-AWQ 作为核心卖点;DeepSeek、Qwen 等模型发布时直接附带官方 AWQ/GPTQ/FP8 权重。这说明加速机制已从「论文 trick」沉淀为推理框架的标准配置层,Senior 工程师的价值在于「在给定 SLA 与精度预算下,组合并调参这些开关」。
原理与架构
2.1 投机采样:draft–verify 的并行化魔法
投机采样的核心洞察:验证 K 个 token 和验证 1 个 token,对大模型而言访存成本几乎相同(都只搬一遍权重),但前者把 K 步串行 decode 压成了 1 步并行 forward。
关键数学保证:投机采样通过拒绝采样(rejection sampling) 确保输出分布与「纯大模型采样」严格相同——它是无损加速,不改变模型行为。设 draft 模型在每个位置的接受率为 α,每轮草稿长度 K,则期望每次大模型 forward 产出的 token 数为:
- 加速比直接由接受率 α 决定:α 越高(draft 与 target 分布越接近),加速越大。实践中 α 常在 0.6–0.8,对应 2–3× 的 wall-clock 加速。
- draft 模型选型权衡:用更大的 draft 模型 → α 更高但 draft 本身更慢;用 EAGLE/Medusa 这类「自投机」(额外预测头复用 target 隐状态)→ 几乎零额外模型成本。这是工程上的核心调参点。
| 投机方案 | draft 来源 | 优点 | 代价 |
|---|---|---|---|
| 独立 draft 模型 | 同系列小模型(如 7B verify + 1B draft) | 实现直接 | 多一个模型占显存 |
| Medusa | target 上挂多个并行预测头 | 无独立模型 | 需训练 head,α 偏低 |
| EAGLE / EAGLE-2 | 复用 target 特征层做自回归 draft | α 高、显存省 | 实现复杂 |
| n-gram / 提示查找 | 从 prompt 里查重复片段 | 零模型成本 | 仅在 RAG/长上下文重复场景有效 |
2.2 全链路 Prefix Caching: 让相同前缀只算一次
多轮对话、固定系统 prompt、few-shot 模板的共同特征是:大量请求共享一段完全相同的前缀。Prefix Caching 把这段前缀的 KV Cache 计算并缓存,后续请求命中即跳过 prefill。
工程要点:
- 块级哈希 + Copy-on-Write:vLLM 的 Automatic Prefix Caching 以 PagedAttention 的 block(如 16 token)为粒度对前缀内容做哈希,相同哈希链共享同一物理块;某请求要在共享块上续写时,触发 CoW 复制,避免污染他人缓存。
- 显存复用 = 算力复用:命中前缀既省了 prefill 算力(首 token 延迟 TTFT 大降),又通过物理块共享省了 KV 显存(同一份系统 prompt 不再为每个请求各存一份)。
- 全链路扩展:长上下文场景下 KV 体积超过 HBM 时,可做 KV offload(HBM→DRAM→NVMe 分层)与跨实例的 prefix 缓存共享(如 LMCache),把「会话级复用」升级为「集群级复用」。
- 失效与淘汰:缓存按 LRU 淘汰;前缀一旦有一个 token 不同,后续块全部 miss——这要求把最稳定的内容(系统 prompt)放在最前面。
2.3 量化:用精度换显存与带宽
decode 是 memory-bound 的,把权重位宽减半,访存量减半,decode 近乎线性加速,同时显存占用对应下降(7B FP16 ≈ 14GB → INT4 ≈ 4GB)。代价是数值精度损失,核心难点是如何在低位宽下保住精度。
四类量化的本质区别:
| 方案 | 量化对象 | 核心思想 | 位宽 | 硬件依赖 | 适用 |
|---|---|---|---|---|---|
| INT8(W8A8) | 权重+激活 | 对称/非对称线性量化,per-tensor/per-channel | 8bit | 通用 | 服务端通吃、精度损失小 |
| AWQ | 仅权重(W4A16) | 激活感知:靠激活幅度找出 ~1% 显著权重通道并缩放保护 | 4bit | 推理快、校准轻 | 显存吃紧的 decode 主导场景 |
| GPTQ | 仅权重(W4A16) | 二阶误差补偿:用 Hessian 逐列量化并把误差转移到后续权重 | 3/4bit | 校准较重 | 极致压缩、精度可控 |
| FP8 | 权重+激活 | 浮点低精度,保留指数位动态范围 | 8bit | 需 Hopper/Ada | 近无损、训推统一 |
需要强调的是:AWQ 与 GPTQ 都是 W4A16(4bit 权重、16bit 激活),区别在「怎么挑要保护的权重」——AWQ 看激活分布(前向信息),GPTQ 看 Hessian(二阶曲率信息)。FP8 则是另一条路:不压位宽到 4bit,而是用硬件原生浮点格式,在 H100 上既快又几乎无损,是数据中心新主流。