How Lossless Is Lossless Speculative Decoding? The Role of Numerical Precision in Orthrus
Ilya Koziev, Leonid Sinev, Ivan Oseledets
cs.CL, cs.AI
2026-09-14
独立复现 Orthrus 后核对轨迹:BF16 下官方与自训模型分别只有 45% 和 43% 与原自回归模型完全一致,换成 FP32 则 1190 条全部对上。
投机解码的卖点很具体:用更快的草稿模型并行猜若干 token,再用原模型一次性验收,验收通过的部分按理应跟原模型自己逐个吐出来完全一样。Orthrus 把这套机制做进同一个模型里,冻住自回归骨干,外挂轻量扩散视角并行出 token,再让骨干做「模型内共识」验收。原论文的核心承诺是严格无损,加速后的输出序列应与原自回归模型逐 token 相同。
这句话在工程上很值钱。真无损的话,加速就只是加速,不必重做对齐,也不必担心分布被改写。但无损是在理想实数算术下成立,还是在生产常用的 BF16 推理里也成立,此前没有独立核对。
Ilya Koziev、Leonid Sinev、Ivan Oseledets 独立实现了 Orthrus 的训练与推理,同时评了官方放出的 chiennv/Orthrus-Qwen3-1.7B,以及他们自己训的同容量模型 Orthrus-1.7B-final。
自训数据做成 on-policy:只取公开数据集的 prompt,用冻住的 Qwen3-1.7B 贪心解码写出回复,丢掉短于 50、长于 1000 字符的 prompt,得到 4,113,358 条。扩散头是 teacher forcing 训的,人类写的续写对不上骨干自己生成时走进的状态,所以要让数据跟着模型轨迹走。8 张 H100 训 1 个 epoch,学习率 2×10⁻⁴,batch 10,block size 8,共 32 个 block,最长 3072 token。这套超参跟原 Orthrus 实验差得很远,正好用来看现象是不是绑在官方训练配方上。
评测分两层。轨迹层用 12 个领域共 1190 条 prompt,英文语法纠错 90 条,其余每域 100 条,覆盖中英代码、故事、语法纠错、数学、诗歌、问答和俄英翻译。生成设定是 greedy、maxnewtokens=128、温度 0,在 RTX 3090 上走 eager attention。逐条比对 Orthrus 的 token 序列是否与 Qwen3-1.7B 完全相同。任务层用 lm-eval-harness 跑 GSM8K、HumanEval、IFEval。同一套评测先在 BF16 跑,再在 FP32 原样重跑。
BF16 下官方 checkpoint 的精确轨迹匹配率只有 0.45 ± 0.03,自训模型 0.43 ± 0.03。按领域差一个数量级:英文语法纠错两边都是 0.88,英文诗歌分别只有 0.11 和 0.08,英文故事生成 0.12 和 0.11。
Tokens Per Forward 衡量一次前向平均落下多少个被接受的 token。自训模型在 12 域里有 10 域更高,官方在英文语法纠错(5.00 vs 4.23)和英文数学(8.08 vs 4.99)上赢。数学域官方 TPF 几乎是自训的 1.6 倍。并行效率跟训练数据绑得很死,跟序列是否无损是两件事。
分叉轨迹的回复条件困惑度更高。官方模型匹配轨迹平均 PPL 1.11,分叉 1.28;自训模型 1.10 对 1.28。控制回复长度和领域之后,log PPL 的 logistic 回归系数分别是 −8.10 和 −10.92,p 值到 3×10⁻¹¹ 和 1.3×10⁻¹⁵。参考模型自己觉得难的回复,更先在有限精度里走偏。
下游分数没有系统性变差:
| 任务 | 指标 | Qwen3-1.7B | 官方 Orthrus | 自训 Orthrus |
| GSM8K | exact match (flexible) | 0.4003 ± 0.0135 | 0.4238 ± 0.0136 | 0.4147 ± 0.0136 |
| HumanEval | pass@1 | 0.4024 ± 0.0384 | 0.3659 ± 0.0377 | 0.4146 ± 0.0386 |
| IFEval | prompt-level loose | 0.2015 ± 0.0173 | 0.2052 ± 0.0174 | 0.2181 ± 0.0178 |
| IFEval | prompt-level strict | 0.1682 ± 0.0161 | 0.1756 ± 0.0164 | 0.1830 ± 0.0166 |
官方 HumanEval 点估计掉到 0.3659,自训略高于基线。论文写明这些差距相对误差条,不能读成显著提升。
换成 FP32,两个模型在全部 1190 条 prompt 上匹配率都是 1.00。分叉随精度消失。
拿下游分数当「无损」证据,会被这篇打脸:分数可以持平甚至略高,token 序列已经分叉。生产环境几乎全是 BF16 或 FP16,论文里写 lossless,读者默认会理解成跟原模型逐 token 一样。要对的是轨迹,并且写明精度。
做投机解码、并行解码或扩散语言模型的人,这篇给了一个便宜的验收标准:greedy 下跟骨干逐序列比对,至少报 BF16 和 FP32 两档。任务分数只能说明大概还能用,不能证明无损。
这是一篇复现加压力测试,没有提出新架构。结论目前绑在 Orthrus 与 Qwen3-1.7B 的组合上,但对所有声称无损的并行解码,同一套问题都该被问一遍。
实验只覆盖 Qwen3-1.7B,没有更大模型和采样解码。maxnewtokens=128,更长生成里分叉只会累积得更多。原因被归到有限精度,但没有定位到具体层或算子:KV cache 状态、attention 累加、共识验收里的比较,哪一处先翻 token,仍然不知道。
自训数据是贪心轨迹蒸馏,训练配方跟官方差很多,TPF 数字不能直接读成 on-policy 一定更好。下游评测没有报告 wall-clock 加速比,看不到 BF16 分叉换来了多少延迟。FP32 全对只说明算法在更高精度下可以无损,不能说明 BF16 的分叉对用户无害。