Lesson 01 · 目标用时 15 分钟

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. 一次迭代的四段契约

1 · Propose 便宜的 draft 分布 q 自回归提出 γ 个候选 token。
2 · Score 目标模型 p 对整条候选路径做一次 causal forward,产出 γ+1 组分布。
3 · Accept 从左到右检查候选;只能提交首个拒绝之前的最长前缀。
4 · Correct 首个拒绝处按修正分布采一个 token;若全接受,则从最后一组目标分布采 bonus token。

设当前已提交前缀为 x≤t,draft 提出 y₁, y₂, …, yγ。目标模型一次前向得到:

p₁(· | x≤t), p₂(· | x≤t,y₁), …, pγ+1(· | x≤t,y₁,…,yγ)

注意第 i 组 logits 位于候选路径的第 i 个位置,并且通过 causal mask 只能看到它左边的 token。因此它与把目标模型沿同一条路径逐 token 运行所得的条件分布相同;区别只是这些位置在硬件上被并行处理。

3. 为什么首个拒绝后必须停止

prefix y₁ ✓ y₂ ✓ y₃ ✗ y₄ ?

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₄ 吗?

本节压缩

主阅读

阅读 Leviathan et al., Section 2.1–2.3 的 Algorithm 1。遇到不清楚的条件分布或 KV 状态问题,直接向我追问;下一课会逐项推导 Algorithm 1 中最容易被误抄的两条公式。