Mirror Speculative Decoding: Breaking the Serial Barrier in LLM Inference

Apple · Bhendawade, Nishu, Kundu, Bartels, Cho, Belousova · 2025-10 (v2: 2025-12-11) · arXiv:2510.13161
关键词: speculative decoding · early exit · heterogeneous accelerators · GPU+NPU · speculative streaming · branch-complete rollout

速读卡片 (TL;DR)

一句话:把 draft 从"target 输出之后才开始跑"提前到"target 中间层 early-exit 时就开始 branch-complete 速推",并把 draft 物理上搬到 NPU、target 留在 GPU——把 SD 从串行 pipeline 改成双向、异构、并行的镜像结构,在 14B–66B target 上拿到 2.8×–5.8× wall-time。

2.8–5.8×
SpecBench wall-time speedup
+30%
vs EAGLE-3(最强 baseline)
GPU+NPU
异构跨加速器并行

立场:这不是一个新 draft 架构,而是一个 system–algorithm co-design:用早退信号 + 跨设备 overlap 把 EAGLE-3 框定的 acceptance–latency 折衷曲线整体下移,代价是要有一颗 NPU(或第二类加速器)。


1 · 动机:为什么 SD 卡在串行墙上

1.1 历史脉络:从 Leviathan 2023 到 EAGLE-3 的"局部最优陷阱"

把时间线拉一下,SD 的演化基本就是沿着同一条 Pareto 曲线在挪点:

但所有这些仍然是单一加速器、单一时间轴上的串行:draft 必须先把 γ 步推完,target 才能开 verification(或 verification 必须等 target 完整 forward 才出 logits)。本文用一句话把这条天花板拍死:

"larger speculative modules improve acceptance at the cost of higher draft construction latency, while smaller ones reduce overhead but lower acceptance and limit speedup. ... Eq. 5 exposes the core limitation: improvements in acceptance must compensate for the added draft latency, intrinsically coupling acceptance with latency."
Vanilla SD (serial) draft AR γ tokens target 1× forward(verify γ+1 位) ≈ T_draft + T_target Mirror-SD (parallel) target 1..ℓ_e EE target ℓ_e+1..N(GPU) draft branch-complete(NPU) FV ≈ T_target + T_rv (T_draft 被吃掉)
同一组 draft/target、同样 γ,vanilla SD 把 draft 和 target 接成一条线;Mirror-SD 在 ℓ_e=N/2 处早退,target 后半截 (suffix) 与 draft 在不同设备上同时跑。理论上 draft 时间被 target suffix 完全吸收,只剩两个 token-channel 的 rendezvous(EE / FV)在临界路径上。

1.2 别的方案为什么不够

方案动了什么本质代价
更大的 draft / 更深 EAGLE↑ acceptance ρdraft 时间 T_draft 同步上升,串行链条更长
更小的 draft / Medusa head↓ T_draftacceptance 跌,γ 受限
Tree draft (SpecInfer / EAGLE-2)多分支并行验证verification 时 attention pattern 变贵,draft 还是要 AR
Async / pipeline 两 step 重叠把 step t+1 的 draft 提前到 step t 的 verify 中policy lag(用旧 logits)→ acceptance 漂移
Lookahead / PLD / REST(retrieval)不用 draft 模型,用 n-gram 或 KV 检索域外失效,长尾 ρ 低
Mirror-SD用 target 自己的中间层做 draft 触发器,跨设备 overlap需要异构硬件 + 一次小 cross-device 通信

本文最尖锐的 framing 是:前面所有方法都在 "acceptance ↔ latency" 这条二维曲线上挪——你想要 acceptance 高就要付 latency。Mirror-SD 不是挪,而是给曲线加一个新的维度("跨设备时间"),让 draft 时间在临界路径上消失。

1.3 为什么"对称速推"不平凡

简单想:既然 target 的中间层 hidden 已经"差不多知道下一个 token 是什么了"(Pal et al. 2023 早就报过 logit lens 现象),那为啥不在中间层就让 draft 启动?三个非显然的难点:

  1. Early exit 的分布 ≠ 最终分布。如果你直接拿 ℓ_e 层的 token 提交,会污染输出分布(违反 lossless)。所以 early exit 只能当路标(top-κ 候选 + 概率),最终接受还是要看第 N 层 logits。
  2. Draft 收到 top-κ 路标后,要替每一个候选准备好后续 γ 步——这是 branch-complete。不是 draft 一条线 γ 个 token,而是 κ 棵深度 γ 的子树。κ=8、γ=7 时 draft batch 显著膨胀,如何让它仍能在 target suffix 时间内跑完?这逼出了 SS draft + NPU 上的特殊 sharding。
  3. "Mirror" 的另一半:target 同时也在为 draft 做 correction。当 draft 选错分支(early-exit top-κ 没命中真正的下一 token),target 在第 N 层算出 correction 后,要么命中树里某条预算分支(reuse,见 §3),要么必须 fallback 重新启 draft。这一对称(draft 在猜 target / target 在校 draft)就是名字里"mirror"的来源。

把这三件事合在一起:Mirror-SD 既不是单纯"提早启 draft"(那只是 early-exit decoding),也不是"换硬件"(那只是异构推理),而是三件事必须同时成立才能保 lossless 又拿到加速。这是它跑 v.s. 看起来"好像谁都能想到"的差距所在。


2 · 背景速查

符号含义
γspeculative window 长度(本文默认 7)
κearly-exit top-κ 宽度(默认 8)
ℓ_eearly-exit 层(默认 N/2,目标网络中点)
p(ℓ)把 LM head 应用在第 ℓ 层 hidden 上得到的 proxy 分布
p(N)target 最终(top layer)分布,验证就用它
M_tearly-exit 信道载荷:top-κ token IDs + log-probs,大小 O(Bκ)
A_tstep t 的 accepted-prefix 长度(0..γ)
𝓣_tdraft 在 NPU 上以 M_t 为 κ 个根、深度 γ 的"假设树"
τ = A_t + 1第一次 mismatch 的 depth(correction 位置)
SSSpeculative Streaming(本作者 2024 年的 multi-stream attention)
SPDSPD draft 架构(Kim et al. 2025),把 N_d 层切成两段、每段 G_D 个 track
G_T / G_Dtarget / draft 的 TP degree(本文都是 8)
Δ ≜ T_targetℓ_e+1:N"overlap budget":target suffix 时间,draft 要钻进这个窗口
Ω_κ(ℓ_e)top-κ overlap mass:在 q=p(N) 下落入 top-κ(p(ℓ_e)) 的概率,fallback frequency 的下界控制者

Vanilla SD 复习一遍。step t:

  1. draft 从 (x, y_
  2. target 一次 forward 算出 p(N)(·| y_
  3. 取最长前缀 r,使所有 ŷ_{t+j} = argmax p(N);若 r<γ,补一个 correction token c,从 (p(N) − p(draft))+ 重采(stochastic 模式)。
  4. commit y_{t+1:t+r}(+ c),进入下一 step。

关键观察:第 2 步 target forward 必须等第 1 步 draft 完成,这就是"serial barrier"。


3 · 方法 A:Early-exit + branch-complete 速推

3.1 关键动作:在 ℓ_e 层"分叉"

step t 开始,target 像往常一样跑 1..ℓ_e 层。在 ℓ_e 层,做两件事 同时:

NPU 这边,draft 收到 κ 个候选根之后,同时对每一个 v_i 跑深度 γ 的 rollout(branch-complete):

∀ i∈{1..κ}, ∀ r∈{1..γ}: ŷ′(i)t+1:t+r ∼ fd(· | y<t, x, ŷt+1=vi)

这个"对每个候选都把后面 γ 步铺开"就是 branch-complete。draft 不再是一条直线,而是 κ 棵深度 γ 的树,合在一起记作 𝓣_t

Target (GPU) L1 L_{ℓ_e} M_t = top-κ L_{ℓ_e+1} L_N → p(N) verify Draft 𝓣_t (NPU, branch-complete) v₁ v₂ v₃ ··· v_κ 深度 γ=3 每个 v_i 都展开 γ 步连续 token,总共 κ·γ 个节点
Target 在 ℓ_e 层泄露 top-κ 候选 → NPU 上 draft 同时为每一个候选 v_i 跑出深度 γ 的预测;target 后半段 ℓ_e+1..N 与这棵树同时跑。最终 verifier 拿到 p(N),在树里挑那条与 target 真采样匹配的分支提交。
GPU(target stack) h_t^{(ℓ_e)} = layer ℓ_e 输出 W_LM · h_t^{(ℓ_e)} → softmax Top-κ → M_t = {(v_i, log p̃_i)} token channel O(Bκ) bytes · μs 级 NPU(draft) 收到 M_t 的 κ 个根 batch 维 κ 路 SS draft forward 每 step 出 η̄ 个 token → κ 棵深度 γ 的 hypothesis tree 𝓣_t 同时:GPU 继续 ℓ_e+1..N → p^{(N)}
Early-exit signal flow 单独看一眼。注意 W_LM 是target 自己原本的 LM head(不是新训的 head),只是在 ℓ_e 层提前借来用一下。这里没有任何额外训练开销——比 EAGLE 系列要训 draft head + EAGLE-3 还要 multi-layer fusion 的方案更轻。target 这边的额外计算只是一次 (LM_head × κ-best)。

3.2 Verification vs. reuse 规则

target 跑完到 N 层得到 p(N),沿"当前 draft 选定路径"做标准 SD verify,得到 A_t。两种情况:

关键的"reuse"判定:被 commit 的 prefix Πt+ = (accepted...,c) 在不在 𝓣_t 已经预算好的 paths 里?

Πt+ ∈ Pathsτ(𝓣_t) ⇒ reuse;否则 fallback(整 draft 重启)

Reuse 命中 = 下一 step 的 draft 不用重来,直接拿树里那条分支当新 window;fallback = draft 必须从被修正后的 context 重新 rollout,白费一次 NPU 时间。

3.3 Worked example: 一个 token "积" 的命运

设 target = Qwen3-32B,N=64,ℓ_e=32,κ=8,γ=7。当前 prefix = "微积" 之后,要预测下一个字。

  1. target 跑完 32 层,LM head(h(32)) → p(32)。top-8 = ["分", "学", "公", "(", "方", "在", "运", "的"](假设)。把这 8 个 token + log-prob 通过 token channel 发给 NPU(8 项 × bf16,几十字节)。
  2. 同一时刻:GPU 继续跑 33..64 层。NPU 上,draft 同时在 batch 维度展开 8 棵 γ=7 的树,例如对 "分":"分→法→是→一→种→重→要" 之类。SS draft 实际只需 J ≤ ⌈γ/η̄⌉ 步(后面会讲),通常 J=2~3 而非 7。
  3. GPU 第 64 层算出 p(64),argmax = "分"——命中 v_1!
  4. 用 "分" 这条分支沿深度 verify:draft 给 "分→法→是" 而 target 给 "分→法→中"。则 A_t=2(接受了 "分", "法"),τ=3,correction c="中"。
  5. 检查 reuse:Πt+=("分","法","中") 在不在树里?如果 draft 在 "分→法" 的 depth-2 节点下还展开了多个分支(包括 "中"),那就 reuse 命中,下一 step 直接用预算好的 "分→法→中→…" 当 window;否则 fallback。

反向论证: 如果不做 branch-complete(只让 draft 给一条线),那么 step t 的 fallback 概率 = P(target argmax ≠ draft 选的那个根 v*),通常 30%–50%——白费一半。Branch-complete 把它降到 P(ct+τ ∉ 任何已展开 path),实测 0.1–0.3(见 §8 fallback 曲线)。


4 · 方法 B:Speculative Streaming on draft(只动 draft,不动 target)

问题:branch-complete 让 draft 要在很短时间内吐出 κ·γ 个 token。如果 draft 还是普通 AR,要 γ 个内部步——很可能撑爆 overlap budget Δ。

解法:把作者自己 2024 年的 Speculative Streaming (SS) 装到 draft 上(不是装到 target 上,这个区分很重要)。SS 的核心是 multi-stream attention:每一层除了主 stream Mt(ℓ),还附带 γ 个 lookahead stream St,j(ℓ)(j=1..γ),每个 lookahead 只看前面已 verified 部分 + 比它早的 lookahead。一次 forward 同时给出:

每个内部 step 因此能吐 η_j ≥ 1 个 token,平均 η̄ > 1。要覆盖 γ 个 token,只需 J ≤ ⌈γ/η̄⌉ 步而不是 γ 步。实测 J ≈ 2–3 时,T_draft 砍掉 50%+。

为什么 SS 必须装在 draft 而不是 target?SS 改写 forward 内部的 attention mask,等于改了 next-token 分布;装到 target 就破坏了 lossless 保证(commit 用的不再是原始 p(N))。装到 draft 没事,因为 draft 任何输出最终都要拿 target 的 p(N) 验证,所以语义不动。
x_0 y_m verified prefix M_t main(verify 上轮) S_{t,1} S_{t,2} S_{t,3} γ 个 lookahead stream 一次 forward 产出: y_{m+1} y_{m+2} y_{m+3} η_j ≈ 2–4 tokens / draft step → J ≤ ⌈γ/η̄⌉ 步,而非 γ 步;T_draft 显著缩短,容易钻进 Δ overlap 窗口
Speculative Streaming 用 multi-stream attention 把"verify 上一轮"和"提议下 γ 个"压在一次 forward 里。draft 装上 SS,J 从 7 降到 2–3,T_draft(γ) 也对应下降——这正好是把 Mirror-SD 推进"完全 hide 在 Δ 之内"那个 zero-slope 区域的关键钥匙。

5 · 方法 C:GPU↔NPU 异构 sharding

这一节是论文最"systems"的部分,也是 EAGLE-3 没做的(EAGLE-3 把 draft 和 target 全堆在 GPU 上,共享 KV)。Mirror-SD 用 8 张 GPU + 8 颗 NPU(Apple M2 Ultra 系统),分工:

角色设备Sharding每 step 同步次数
Target(N=64,32B)8 张 M2 Ultra GPUMegatron-style TP:每 MHA / MLP 块 2 次 all-reduce2N = 128 次 / step
Draft(N_d=16,0.6B)8 颗 NPUSPD:layers 切 2 段,每段 G_D=8 个 track,每 track 一颗 NPU 常驻自己的 weight shard2 次 / step(段边界 1 次 + 输出端 1 次)

SPD 这件事关键到不能含糊。普通 TP 是每一层都要 all-reduce,因为权重是按 hidden dim 切的。SPD 把 draft 的 N_d 层切成两段,段内每个 NPU 跑全部层(用自己那份权重 shard),段间才同步。代价是每个 NPU 都要装一份权重,但 draft 才 0.6B,16 层 × 256 hidden / shard 完全装得下。

Target on 8 GPUs (Megatron TP) L1 MHA → all-reduce L1 MLP → all-reduce L2 MHA → all-reduce ⋮ 共 2N = 128 collectives L_{ℓ_e}: emit M_t (top-κ) → token channel L_{ℓ_e+1} … L_N (overlap with draft) L_N → p^{(N)} → verify Draft on 8 NPUs (SPD) segment 1 (layers 0–7) NPU0L0..7 NPU1L0..7 NPU7L0..7 all-reduce #1 segment 2 (layers 8–15) NPU0L8..15 NPU1L8..15 NPU7L8..15 all-reduce #2 → logits 总共仅 2 次 collective / draft step M_t (O(Bκ)) draft path → verify
异构 sharding 全图。target 仍是标准 Megatron-style:每层 2 次 all-reduce。draft 用 SPD:每段每个 NPU 装"整段"权重 shard,段内零通信,段间一次 all-reduce。draft 整 forward 只 2 次 collective,而不是普通 TP 的 2N_d=32 次。这就是为什么 draft 容量可以扩(0.6B 而不是 60M)而不撑爆 overlap budget Δ。

跨设备 token channel:每 step 两次小消息——M_t(early exit)和 final verify 触发——都是 O(Bκ) 个 token IDs + log-probs(bf16),通过 GPU→CPU→NPU 拷贝走。论文说微秒级,几乎可忽略。


6 · Latency 公式 + 灵敏度

把上面三件事合到一个 step 的时间公式里:

T_Mirror = T_target1:ℓ_e + T_rv(ee) + max{T_targetℓ_e+1:N, T_draftgen(γ)} + T_rv(fv)

记 Δ ≜ T_targetℓ_e+1:N(overlap budget,target 后半段时间)。

情形T_Mirror对比 vanilla SD
T_draftgen(γ) ≤ Δ (理想)T_target + T_rvvanilla = T_target + T_draftgen;省了 T_draft 减去 T_rv
T_draftgen(γ) > Δ (draft dominated)T_target1:ℓ_e + T_draftgen(γ) + T_rv仍省了 Δ(target 后半段被 hide),但 draft 把临界路径拉长

所以本作的全部工程目标可以用一句话总结:把 draft 时间塞进 Δ 这个时间窗里。方法 B (SS) 缩 T_draft;方法 C (SPD) 把 draft sync 从 2N_d 砍到 2;ℓ_e 选在 N/2 让 Δ 最大化但又保证 early-exit 信号还够准。

6.1 灵敏度小表

调旋钮影响权衡
↑ κ (top-κ 宽度)Ω_κ ↑ → fallback ↓ → 复用率高draft 树变大,T_draft↑;token channel payload ↑(O(Bκ))
↑ γ (window 长度)每接受一次产出更多 tokenT_draft↑,可能掉出 Δ;且 Δ 取决于 N - ℓ_e
↓ ℓ_e (浅一点)Δ ↑(给 draft 更多时间)p(ℓ_e) 离 q 远 → Ω_κ ↓ → fallback ↑
↑ ℓ_e (深一点)Ω_κ ↑(命题 2 严格证明:fallback 单调下降)Δ ↓,draft 没时间钻进 overlap
↑ B (batch size)更多 token 摊销 GPU computedraft compute ∝ B·κ·γ 也涨,且 NPU 受 channel 限制;论文 B≥16 时砍 κ 到 4/2/1

论文实测 sweet spot:κ=8, ℓ_e = N/2, γ=7。这个组合在 SpecBench 6 个域 (Humanities/Math/Roleplay/STEM/Coding/Math-reasoning) 上 fallback frequency 都落在 0.1–0.3,Ω_κ 接近饱和。

命题 1 + 2:为什么 κ 越大越好,ℓ_e 越深越好(直觉版)

命题 1(κ 单调):把 top-κ 集合扩大只会"添根",不会"减根",所以 fallback 只能不增。极限 κ→|V|,fallback→0。bound 是 FF ≤ 1 − Ω_κ(ℓ_e)。

命题 2(ℓ_e 单调):logit lens 现象保证 p(ℓ) 随 ℓ→N 收敛到 q。Ω_κ(ℓ) ≥ q(S*) − 2κ ε_ℓ,ε_ℓ→0 时 Ω_κ→max,fallback bound 也对应下降。如果 q 的 top-κ 边界有 margin,ε_ℓ 足够小后 Top-κ(p(ℓ)) = Top-κ(q) 完全一致,fallback 触底。

这两条单调性同时存在,但 ℓ_e 增加会缩 Δ,所以才需要中点 ℓ_e=N/2 这种折中——κ 那边没有这么尖锐的约束(只要 κ 不超过 channel 带宽即可),所以 κ=8 已经接近 saturation。


7 · Worked example:一条序列穿过双 pipeline

把 §3.3 的"积分"例子完整跑一遍,把所有计时也填进去。Qwen3-32B,N=64,ℓ_e=32,γ=7,κ=8,M2 Ultra GPU+NPU 集群 (×8)。

时刻 0(target step t 开始): commit 到 prefix "微". 假设 target 单层 ≈ 0.4 ms。

时间(ms)GPU(target)做什么NPU(draft)做什么注释
0–12.8跑 L1..L32(prefix forward)T_target1:ℓ_e=32×0.4=12.8 ms
12.8L32 → LM head → top-κ M_t = ["分","学","公","(","方","在","运","的"]同时:GPU 把 M_t 扔进 token channel
12.8 + 几 μsL33..L64 继续NPU 收到 M_t,启动 8 棵 γ=7 树token channel: 8 IDs × bf16 ≈ 16 B
12.8–25.6L33..L64(用 SPD-fused matmul + 2 collective)SS draft:J=3 步,每步 2 个 lookahead,共出 8 棵深度 7 的 partial treeΔ=12.8 ms;T_draft^gen ≈ 11 ms (J=3 × 3.5 ms)
25.6L64 → p(N);argmax = "分"把 8 棵树的 logits 通过 token channel 推回 GPUfinal verify rendezvous
25.6 + ε沿 v="分" 这棵树往下 verify;match 到深度 2,τ=3,c="中"idle / 准备下一 stepA_t = 2,γ-A_t = 5(本步 commit 3 个 token: 分、法、中)
25.6 + ε检查 reuse:("分","法","中") 在 𝓣_t 的某条 path 里? 命中 → 下 step 直接接这一 step e2e ≈ 26 ms 出 3 token,有效 8.7 ms/token

对比 vanilla SD 同 prefix:需要 draft AR 7 步(7×3.5≈24.5 ms)+ target 整 forward(64×0.4=25.6 ms)= 50 ms,假设接受 2 个产出 3 token,16.7 ms/token。≈1.9× 加速,与 Math 域报的 5×–5.8× 相比稍低,因为这只是 single step 的简化估计;实际增益还要乘上"reuse 把下 step T_draft 也省了"那部分。

关键观察:在 12.8–25.6 ms 这 12.8 ms 窗口内,GPU 的 32 层 suffix 与 NPU 的 8×7 棵 draft 树同时跑。这 12.8 ms 的"draft 时间"在 vanilla SD 里是裸暴露在临界路径上的。这就是 Mirror-SD 拿到加速的物理来源。

8 · 实验关键结果 + 30% 拆分

8.1 SpecBench 主表(摘录)

Target任务 (T=0)EAGLE-3Mirror-SDΔ %
Qwen3-14BMath reasoning3.36×5.32×+58%
Qwen3-14BTranslation2.53×4.13×+63%
Qwen3-14BRAG2.66×3.49×+31%
Qwen3-14BMulti-turn conv3.29×3.70×+12%
Qwen3-32BMath reasoning3.77×5.84×+55%
Qwen3-32BQA2.76×3.04×+10%
Mistral-24B / OPT-66B多任务2.8–4.5×(通泛化,见 Fig 4)

"30% 平均"是几十个 task × temperature × model 的 micro-average。从分布看:长输出、高确定性的任务(数学、翻译、长 reasoning)增益最大(高 acceptance + 长 window 都能稳定 hide draft);高熵任务(多轮对话、QA)增益最低(频繁 fallback 把 NPU 计算白白浪费)。

8.2 30% 增益拆分(我的解读)

论文没给一张正经的 ablation table 把 30% 切成 (cross-device + mirror + early-exit + SS) 四个分量,但从 Fig 4 (OPT/Mistral 上的 4-way) 和 Fig 6 (SS 单独 speedup) 能反推:

vanilla SD 2.0× + SS draft 2.4× +0.4 + Mirror overlap 3.1× +0.7 + NPU sharding 3.5× +0.4 + branch-complete 3.8× +0.3 分量(经验估计): SS draft → ~30% overlap (early-exit) → ~40% SPD on NPU → ~20% branch-complete reuse → ~10%
把 EAGLE-3 → Mirror-SD 的 +30% 拆四块(粗略,基于 Fig 4 的 4-way 对比 + Fig 6 SS draft-only speedup ≈ 2× + Apdx D.1 batched 数据)。最大的一块是 early-exit 触发的 overlap,因为它直接吃掉了一段在 vanilla 里裸暴露的 T_draft;NPU sharding 主要让 draft 容量能从 60M 上到 0.6B 而不撑爆 Δ;branch-complete 的贡献来自 reuse 命中(下一 step 不重启 draft)。

8.3 Fallback 曲线(Apdx E.4)

论文给了 6 个域的 FF (fallback frequency) vs κ × ℓ_e 曲线:

8.4 Batching 影响(Apdx D.1)

B 从 8 → 128:vanilla SD 加速从 2.84× 跌到 1.77×;Mirror-SD 从 3.05× 跌到 1.95×。两者都跌(因为 target verify 越来越主导),但 Mirror-SD 始终领先。论文的对策是随 B 增大动态缩 κ(κ=8 → 4 → 2 → 1)以控制 draft 端 compute——这意味着大 B 部署时 mirror 优势会变小,但仍存在。


9 · 与同类工作对比

工作核心 trick与 Mirror-SD 的关键差异
EAGLE-3 (02)multi-layer fusion + token-level head 共享 hidden单设备、单时间轴;acceptance 高但 T_draft 仍在临界路径
DFlash (07)DraftAttention + tile-aware sparsification专攻 draft 内部的 attention overhead;Mirror-SD 是把整个 draft 搬出 GPU
Hidden States Drift (08)分析 EAGLE 在 RL post-training 中 hidden states 漂移诊断性论文;Mirror-SD 对 RL 不敏感(因为 draft 0.6B 完整训自 UltraChat,不依赖 target hidden 形态稳定)
SpecInfer / Tree draftscandidate tree + tree-aware verifyMirror-SD 也用树(branch-complete),但树是 NPU 上离线生长的,verify 沿"被 target 选中的那条路径"走,不需要 tree-aware attention
Async / pipeline SD(LlamaRL 等)step t+1 的 draft 提前到 step t 的 verify 中它们靠"用旧 logits"换并行,有 policy lag;Mirror-SD 严格 lossless,因为最终 commit 永远基于 p(N)
Draft-larger 路线(更深 / 1.7B 自回归 draft)更准的 draft → ρ↑本文 Fig 3a 直接画了:vanilla SD 用 1.7B AR draft 也跑到 acceptance ≈ 4.5,但 latency 同步爆掉;Mirror-SD 用 0.6B SS draft 在更低 latency 拿到同等 acceptance
CALM / MoD(early-exit decoding)shallow exit 直接 commit它们牺牲 lossless;Mirror-SD 只把 early-exit 当"路标",最终 commit 仍走完整 N 层

立场总结: 90% 的 SD 改进论文都在"单一加速器内"挖榨;Mirror-SD 把 axis 加到"跨加速器异构 + 早退路标 + 双向校正"。代价是需要 NPU——这是它的硬件假设,也是它的硬伤。


10 · 局限 / 个人 take / 待验证问题

论文承认的局限

我的疑问

  1. 真无 NPU 能复现多少?把 NPU 替换成"target 同集群里的另一组 GPU + DGL 切到 PCIe 通道",overlap 还在,但带宽完全不同。希望看 H100-only ablation。
  2. RL post-training 的 hidden states drift(见 08 号笔记)对 mirror 多敏感? 早退用的是 target 中间层,如果 RL 让中间层漂移加快(早期 fine-tune 后 logit lens 退化),Ω_κ 会跌得多猛?
  3. 30% 拆分中"branch-complete reuse"那 10% 是否过高估?论文没单独 ablate,我从 fallback 0.1–0.3 推测的;实测 reuse rate 想看个真实曲线。
  4. τ=0 vs τ=1 的差距并不剧烈,意味着 Mirror-SD 对 stochastic decoding 也稳。但 nucleus / top-p 没测,top-κ 在 ℓ_e 是硬切的——和 nucleus sampler 在 N 层组合可能违反 lossless。
  5. γ=7、κ=8 是否对所有 14B–66B 都最优?论文说"是",但 OPT-66B 比 Qwen3-14B 大 5 倍,Δ 也大 5 倍,直觉上 OPT 应该可以承受更激进的 γ。
  6. "Mirror" 的真正双向是不是被夸大了?读全文,target 主要在做 verify + 给 correction;draft 在做 branch-complete。论文修辞上说"target speculates correction paths for the draft",我看更像"target 给 single-token correction,draft 自己看在不在树里" — 这并不算 target 在主动 speculate。

记忆点

立场 把 acceptance–latency 二维曲线加第三维(跨设备时间)
公式 T_Mirror = T_target1:ℓ_e + max{Δ, T_draft^gen} + T_rv;Δ=N-ℓ_e 层
钥匙 early-exit top-κ 路标 + branch-complete 树 + SS draft + SPD-on-NPU,四件事缺一不可
默认 γ=7, κ=8, ℓ_e=N/2, draft 0.6B, G_T=G_D=8
硬伤 需要异构加速器(NPU);单 GPU 集群直接 fall back 到 vanilla
数字 14–66B target 上 SpecBench 2.8–5.8×;比 EAGLE-3 平均 +30%;Math reasoning 上 5.84×
命题 FF ≤ 1 - Ω_κ(ℓ_e),κ 单调,ℓ_e 单调(eq.bounded by logit-lens convergence)

精读笔记 v1 · 2026-05-07 · 配套 PDF: /data/szhang967/papers/paper-notes/spec-rl/MirrorSD_2510.13161.pdf
相关:01 NeMo-RL × EAGLE-3 · 02 EAGLE evolution · 07 DFlash · 08 Hidden States Drift