Draft–Verify 的系统契约
本节只解决一个问题:一次投机迭代到底做了什么,以及为什么“一次目标模型前向”能够确认多个位置。
自回归分解要求 xₜ₊₂ 依赖 xₜ₊₁。这是否意味着目标模型在验证 4 个 draft tokens 时必须串行运行 4 次?
1. 慢的不是算术总量,而是串行 critical path
标准 decode 在第 t 步先读入模型权重和历史 KV,得到 p(xₜ₊₁ | x≤t),采出 token 后才能开始下一步。生成 N 个 token 因而需要 N 次目标模型串行调用。
在 batch 较小的在线解码里,每一步常常受模型权重、KV cache 的内存带宽以及 tensor-parallel collective 延迟限制。一次只处理一个新 token,GPU 的矩阵计算能力没有被充分填满。Chen et al. 将这点拆为 linear layers、attention/KV 读取和 all-reduce 三类开销,并指出:对一小段已知 continuation 做并行 scoring,延迟可能接近单 token decode。
自回归生成不能预先知道未来 token;但如果某个便宜过程先给出一条候选未来,目标 Transformer 就可以像 teacher forcing 一样,一次为候选路径的所有位置计算 logits。
2. 一次迭代的四段契约
q 自回归提出 γ 个候选 token。
p 对整条候选路径做一次 causal forward,产出 γ+1 组分布。
设当前已提交前缀为 x≤t,draft 提出 y₁, y₂, …, yγ。目标模型一次前向得到:
注意第 i 组 logits 位于候选路径的第 i 个位置,并且通过 causal mask 只能看到它左边的 token。因此它与把目标模型沿同一条路径逐 token 运行所得的条件分布相同;区别只是这些位置在硬件上被并行处理。
3. 为什么首个拒绝后必须停止
p₄ 是在 … y₂, y₃ 这个上下文下算出的。一旦 y₃ 被拒绝并替换为 z₃,真正的上下文变成 … y₂, z₃;此前算出的 p₄ 与后续 hidden/KV 都属于错误分支,不能提交。
acceptance 不是逐个独立保留“所有正确 token”,而是提交 longest accepted prefix。首个拒绝之后,即使某个候选碰巧等于新路径上的目标采样,它的 logits 也来自错误条件,必须废弃。
4. 每轮为什么至少前进 1,最多前进 γ+1
首 token 就拒绝
接受 0 个 draft,但在拒绝位置按目标修正分布采 1 个 token。因此仍前进 1。
γ 个全部接受
目标前向还计算了候选块之后的 pγ+1,可再采一个 bonus token。因此前进 γ+1。
这给出投机解码的结构性收益:每次昂贵目标调用仍至少有 baseline 的一个 token 进展,命中时则把多个串行 decode step 压进一次验证调用。这里还没有解释“随机采样时如何不改变分布”;那正是下一课的核心。
5. KV cache 应如何理解
| 状态 | 能否提交 | 原因 |
|---|---|---|
| 已接受 draft prefix 对应的 target KV | 能 | 它们位于最终输出的真实因果路径上。 |
| 首个被拒 draft token 的 target KV | 不能直接提交 | 输出 token 会被 correction token 替代;需要为真实 token 建立对应状态。 |
| 拒绝位置之后的 target KV | 不能 | 它们依赖已经被否定的候选前缀。 |
| 全接受时 bonus token 之前的 target KV | 能 | 整条候选路径被确认;bonus token 自己通常在后续 decode 建 KV。 |
具体引擎可以预留槽位、批量写入后 truncate,或让 attention backend 返回可提交长度;实现不同,但“只让真实输出路径进入持久 decode state”这个契约不变。
候选 y₁,y₂ 被接受,y₃ 被拒绝。目标模型对 y₄ 的 logits 已经算好,而且 y₄ 恰好等于下一轮目标模型的 argmax。现在能直接提交 y₄ 吗?
本节压缩
- 投机解码减少的是昂贵 target model 调用的串行次数,不保证减少 FLOPs。
- 候选路径已知后,causal Transformer 能一次并行算出路径上每个位置的条件分布。
- 验证只能提交最长接受前缀;首拒之后的 logits、hidden state 与 KV 全部失效。
- 每轮产出范围是
[1, γ+1]个 token。
阅读 Leviathan et al., Section 2.1–2.3 的 Algorithm 1。遇到不清楚的条件分布或 KV 状态问题,直接向我追问;下一课会逐项推导 Algorithm 1 中最容易被误抄的两条公式。