arXiv'26 | Wind-MTP:百万上下文里,MTP 草稿头才是那个隐形税
arXiv’26 | Wind-MTP:百万上下文里,MTP 草稿头才是那个隐形税
1. 前言:先把背景交代清楚
你有没有想过这样一个问题:投机解码里的草稿模型,真的是”几乎免费”的吗?
先把投机解码的账本摆出来。每轮解码:
\[L = \frac{T_\text{draft} + T_\text{verify}}{\tau}\]$T_\text{draft}$ 是打草稿的时间,$T_\text{verify}$ 是大模型验收的时间,$\tau$ 是平均每轮被接受的 token 数。过去两年这个领域的工作几乎都能塞进这个公式:
- DFlash(ICML’26):用 Diffusion drafter 替掉 AR drafter,一次 forward 并行草拟整个 block,把 $T_\text{draft}$ 从”随草稿长度线性涨”压成常数;
- DSpark:DeepSeek 线上方案,半自回归 + 置信度调度,同时优化 $\tau$ 和验收预算的分配;
- Cassandra:不训练新模型,直接从 target 模型的权重 bitstream 里抠出一个 drafter,把草稿的训练成本都省了。
这条线的共识是:草稿阶段必须便宜。但所有这些工作(包括这些论文自己)都默认了一个前提——验收那边(target)才是大头,草稿头那点计算可以忽略。
这个前提在 dense 模型 + 短上下文时代基本成立。但这篇 Wind-MTP(arXiv 2607.21535)指出,它正在两个趋势的夹击下失效:
- 上下文爆炸:旗舰模型的上下文已经冲到 1M token。草稿头再轻,它用的也是全量 attention——每猜一个草稿 token,都要把全部历史 KV 读一遍;
- target 越来越快:新一代模型的 target 主干纷纷换上 GDN(Gated DeltaNet)、Mamba2 这类线性/递归注意力,decode 一步的成本本来就被压得很低。
一边膨胀、一边瘦身,结果就是倒挂。论文给出的数字:1M context、γ=6 时,草稿阶段给每个 decode step 白加 92%–138% 的时间——比验收本身还贵。在难任务上原生 MTP 甚至跑输完全不开投机解码的 dense 解码(Qwen-122B code QA 只有 0.80×)——开了投机解码反而更慢,这是最打脸的情况。
解法说破了不值钱:给草稿头的 attention 开一个 4K 的滑动窗口,验收侧原封不动。零训练、无新 kernel、严格无损,1M context 端到端再提速 11%–53%。但”为什么敢砍”和”为什么砍了不崩”,里面的分析做得非常扎实,这才是这篇论文的含金量。
2. 病根:草稿头也在读全量 KV,而且读 γ 遍
先把这笔税的来源拆开。设上下文长度 $S$、草稿深度 $d$(drafter 层数)、每轮草稿长度 $\gamma$。一个 decode 迭代:
\[T_\text{iter} = \underbrace{t_\text{verify}}_{\text{验收 1 次}} + \underbrace{t_\text{draft}^{\text{ctx}}}_{\text{每步读历史 KV}} + \gamma \cdot \underbrace{t_\text{draft}^{\text{fwd}}}_{\text{草稿层 forward}}\]关键在中间那项:MTP 头虽然是”挂在主干上的小头”,但它的 attention 是标准的 full attention——每生成一个草稿 token,都要对全部 $S$ 个历史位置做 attention,把它们的 KV 从 HBM 读一遍。$\gamma$ 个草稿 token 就是 $\gamma$ 遍。
短上下文时这笔开销无感:单层 draft 的 KV 每 token 只有 1–2KB,8–32K 上下文里整个 draft KV 就 8–64MB,全在 L2 cache 里躺着,读了也不心疼。但到 1M context:
- draft 的 KV 膨胀到 1–2GB,每一步 γ 次从 HBM 全量读;
- 论文实测三个模型的 draft KV pool 已占总 KV 显存的 7.7%–11.1%(Qwen-122B 7.7%、Qwen-35B 9.1%、Nemotron 11.1%,正好等于架构里 $1/(F+1)$,F 是 full-attention 层数)。
Table 1 给了三个模型的每步成本(1M、d=7、B=1、bf16 KV、单张 B200):
| 模型 | 原生 MTP | 窗口化后 | 草稿税 |
|---|---|---|---|
| Qwen3.6-35B-A3B | 26.4 ms | 18.3 ms | +44.3% |
| Qwen3.5-122B-A10B | 34.5 ms | 26.5 ms | +30.2% |
| Nemotron-3-120B-A12B | 33.1 ms | 25.8 ms | +28.3% |

nsys 的 kernel 级分解(Table 7,γ=6)更能说明钱的去向——每个迭代拆成 $t_\text{verify}^\text{base}$(裸验收)、$t_\text{verify}^\text{ovh}$(投机记账)和 $t_\text{draft}$ 三段,以 Qwen-35B 为例:12.5 / 4.6 / 12.7 ms,总计 29.7ms。草稿和裸验收几乎一样贵(12.7 vs 12.5)!窗口化后 $t_\text{draft}$ 从 12.7ms 掉到 4.3ms,验收两段纹丝不动——省的全是草稿。
而 $t_\text{draft}$ 里面最大的单个 kernel 是什么?generate_draft_decode_kv_indices——生成草稿 attention 的 KV 索引这一个 kernel 就吃掉 3588μs/iter(Qwen-35B),窗口化后 3.0μs,三个数量级。这个 kernel 干的事就是”枚举全部历史位置给草稿头做 attention”——1M 上下文下枚举本身就是灾难。
3. 解法:只给草稿开窗口
3.1 改动本体:小到一个 PR
Wind-MTP 的实现是把草稿头的 paged block table 截短为 sink 块 + 最近 W 块:
原生草稿 attention 的 block table:
[1, 2, 3, ..., 999993, 999994, ..., 1000000] ← 全部 1M 块
窗口化后:
[1, 2, ..., 64, 995969, 995970, ..., 1000000] ← 64 个 sink + 最近 W=4032 块
W=4032、n_sink=64,即 StreamingLLM 式的”attention sink + 滑动窗口”——4K 窗口只占 1M 的 0.4%,等于把 99% 的草稿 KV 从读取路径上删掉。target 的验收 attention 一个字不动。
配套的第二个改动是 ring buffer:既然草稿只读 n_sink+W 个位置,那 draft KV pool 就没必要按 1M 分配——物理上只开 n_sink + W + d 个槽位循环使用(树宽 k 的 drafter 就是 n_sink + W + d·k),逻辑位置映射到 ring_base(r) + pos mod (n_sink+W+d)。RoPE 已经烘焙在存好的 key 里,块在缩减后的表里排第几不影响得分,所以这个替换对数值完全透明,而且 CUDA-graph 安全。省下来的 7.7–11.1% 显存直接变成多塞一个 1M 请求的能力:原生 MTP 在 B=6 就 OOM 的批次,窗口化能接着跑。
唯一的实现代价:需要跑 Triton 后端做 ring 索引重映射(原生跑 FlashInfer)。后文有消融证明赢的是窗口不是后端。
3.2 为什么严格无损
这点必须单独讲清楚,因为它是所有”改草稿”方案里最容易被质疑的地方。
投机解码的数学保证:输出分布永远由 target 的验收决定——每个草稿 token 都要过 target 的 rejection sampling,被接受的 token 是 target 自己采样的。草稿头只影响”提议什么”,不影响”接受什么”。
所以改草稿头的 attention 不存在分布层面的损失。实测 greedy 输出的差异全部落在验收侧本来就有的 bf16 batched-verify 噪声带内。这是”改草稿”类方案的红利:可以放心对草稿做各种激进的近似,只要验收不动,正确性就有底。(对比那些改验收侧做 lossy verification 的工作,性质完全不同。)

3.3 为什么 acceptance 几乎不掉:三层证据
真正的问题是:把草稿的视野从 1M 砍到 4K,$\tau$ 为什么不崩?这是论文做得最扎实的部分。
第一层:剂量反应曲线(dose-response)。 窗口从 1K/2K/4K/8K/原生 扫过去,Qwen-35B(d=7,多 needle 检索任务)的接受长度 AL = 3.79 / 4.74 / 4.74 / 4.16 / 4.49,TPOT = 4.89 / 3.85 / 3.85 / 4.50 / 6.04 ms。
注意两个反直觉的点:4K 窗口的 AL(4.74)比原生全量(4.49)还高一点,同时 TPOT 从 6.04 降到 3.85。窗口不是”伤质量换速度”,而是存在一个联合最优——太小(1K)不够用,太大(8K/原生)除了变慢没有额外收益。
第二层:逐位置条件接受率 $\alpha_j$。 论文用 SGLang 的逐请求接受直方图 $H[n]$(每轮恰好接受 n 个草稿 token 的步数)定义:
\[\alpha_j = \Pr[\text{accept } j \mid \text{reached } j] = \frac{\sum_{n \ge j} H[n]}{\sum_{n \ge j-1} H[n]}, \qquad \text{AL} = 1 + \sum_{j \ge 1} \prod_{k \le j} \alpha_k\]窗口化后的 $\alpha_j$ 曲线在所有位置上都落在原生曲线的 95% Wilson 置信区间内;$\alpha_1$(只依赖局部预测的第一个位置)完全不变,差距只出现在需要远距离信息的深位置。伤不到要害。
第三层:运行中 A/B 探针——草稿到底改没改主意? 直接在推理过程中对比窗口化前后草稿的 top-1 提议:86%–94% 的步骤完全不变。翻转发生在哪里?统计 flip margin(翻转处 top-1 与 top-2 的概率差):Qwen-35B 和 Nemotron 的翻转集中在 margin≈0.49/0.54 的接近平局位置(全平均 margin 是 5.16/3.02)——本来就要掷硬币的地方,换不换窗口无所谓。唯一的例外是 Qwen-122B:它的翻转发生在 margin 6.80 的高置信位置——这个 drafter 是真的在用远距离上下文(它的 AL 也确实从 5.58 掉到 4.73),但 TPOT 依然净赚。
机制解释收尾:三个模型的草稿头都架在递归混合底座上(Qwen 系是 GDN-MoE,Nemotron 是 Mamba2-hybrid)。远距离信息本来就由递归状态携带,attention 只需要管局部。一个漂亮的证据:窗口内 attention 质量占比,Qwen-35B 0.748、Qwen-122B 0.805,而 Nemotron(NoPE)只有 0.160——它的草稿 attention 本来就不怎么依赖位置,top-1 提议照样保住 86%,因为远处信息在 Mamba2 状态里。
一句话总结这个洞察:这类混合架构的草稿头根本不怎么用长程 attention,却一直在为它付全量的钱。
4. 端到端效果
4.1 主结果(1M、d=7、B=1、RULER niah_multiquery)
| 模型 | vs 原生 MTP | vs dense | AL 变化 | TPOT |
|---|---|---|---|---|
| Qwen3.6-35B | +53% | 2.55× | 4.49→4.74 | 5.94→3.89 ms |
| Qwen3.5-122B | +11% | 1.75× | 5.57→4.74 | 6.09→5.46 ms |
| Nemotron-3-120B | +23% | 1.58× | 3.75→3.61 | 8.77→7.15 ms |

122B 那行值得单独看:AL 明明掉了(5.57→4.74),TPOT 还是降了 11%。成本端的赢大于接受端的输——这也是为什么不能只盯着 acceptance length 评价投机解码系统。
更值得注意的是任务难度维度的规律:窗口优势随难度单调放大——简单多值任务 +4%(AL 5.9)、中等 VT 任务 +17%(AL 4.2)、困难 CWE 任务 +38%(AL 2.8)。原因很简单:低接受率场景原生 MTP 本来就在亏本,窗口把它的成本砍下来,等于把负收益救成正收益。越难的任务越该开窗口,这个方向性结论对线上配置很有指导意义。
4.2 “窗口楔子”随上下文增长
Figure 3 定义了一个干净的指标——matched-acceptance 成本比(用 $\text{AL} \cdot \text{TPOT} = T_\text{iter}$ 消掉接受率,只留纯成本侧的 step_nat/step_win − 1),从 261K 扫到 1M:
- Qwen-35B:+27% → +43%
- Qwen-122B:+24% → +30%
- Nemotron:+17% → +26%
- 每步绝对节省接近翻倍(Qwen-35B:3.4→7.9ms)

上下文越长,省得越多——和行业”上下文越来越长”的方向完全同向。这也是为什么我说这个技巧会快速变成默认配置。
4.3 批量、张量并行与硬件复现
- 单卡 B200 批量扫描(Figure 4):6 个面板里 5 个窗口化 Pareto 占优。Qwen-35B 单用户 218 tok/s(dense 的 2.2×),B=5 峰值吞吐 473 tok/s/GPU(dense 2.1×、原生 1.5×)。唯一例外是 Nemotron + FWE(接受率最低的任务)高并发下 dense 赢峰值吞吐——接受率太低时投机本身就不划算,这锅不该窗口背;
- 2×B200 TP2(Figure 5):全批量、全模型 Pareto 占优,单用户比 dense 快 1.4–2.5×,吞吐天花板比原生再抬 1.15–1.25×;
- H100 + FP8 复现(Table 4,公开 checkpoint RedHatAI/Qwen3.6-35B-A3B-FP8):dense 12.26ms → 原生 7.48ms(1.64×)→ 窗口化 5.05ms(2.43×),AL 还从 4.34 升到 4.53——换卡、换精度结论不变;
- fp8-KV 扫描:窗口化全 cell 赢(+14–46%),但 KV 减半后 Qwen 的百分比收益按比例缩水(1M 处 +46%→+22%)——符合”税 ∝ KV 字节数”的预测,Nemotron 反而几乎不缩水。
4.4 后端消融:赢的是窗口,不是 Triton
一个必须做的诚实消融:原生 MTP 跑 FlashInfer(快后端)8.13ms;原生切到 Triton 50.59ms(6 倍 handicap);窗口化跑 Triton 5.37ms。窗口化在最慢的后端上仍然赢过原生在最快后端上的成绩——收益 attribution 清清楚楚。
4.5 best-depth 对比
每个方法都扫 $d \in {3,5,7,9}$ 取各自最优深度:窗口化对原生的优势区间 1.22–1.58×(Qwen-35B Code-QA 7.95→5.03ms)。没有任何一格的最优深度是 d=9——更深更慢;且 d=9 在 1M 下对 122B/Nemotron 直接 OOM 不可行,窗口化 + ring buffer 反而跑得动。
5. 我的 Take
一,这篇是”草稿成本经济学”的当头一棒。 投机解码这个领域卷了两年”草稿怎么打”(打得更准、打得更长、打得更便宜),这篇提醒大家:草稿的执行成本本身也在被上下文长度通货膨胀侵蚀。$T_\text{draft}$ 在公式里从来不是常数——它是 $O(S)$ 的函数,只是短上下文时代把它当常数没出事而已。1M 时代,”草稿头自带全量 attention”就是个 bug 级的设计遗留。
二,它顺手示范了”改草稿”方案的正确姿势。 验收侧不动 = 无损保证白拿;然后剂量反应、逐位置 $\alpha_j$、A/B 探针三层证据把”为什么敢砍”论证到 kernel 级——尤其是”递归底座已经携带远距离信息,attention 只管局部”这个机制发现,对后续所有混合架构的草稿设计都有参考价值。
三,工程上这是个”没理由不合并”的 PR。 零训练、无新 kernel、严格无损、显存还倒赚 8–11%。我预期”草稿侧窗口化/稀疏化”会像 target 侧的窗口化一样迅速变成推理栈默认配置。和 target 侧的稀疏化(我在 NSA 和 DeepSeek V3.2 DSA 的解读里聊过)对照着看会发现一个对称的图景:target 的 attention 在变稀,drafter 的 attention 也在变稀,两头一起把 decode 从 memory-bound 里往外拽。
如果这篇文章涉及的投机解码、长上下文推理优化你想系统深入,可以看看我之前出版的《动手学AutoML:从 NAS 到大语言模型优化实战》,书里有专门一章讲 LLM 推理效率与 KV Cache 优化,本文讨论的 decode 阶段 memory-bound 问题正是那一章的主线。
