Orthrus: Memory-Efficient Parallel Token Generation via Dual-View Diffusion
速读卡片 (TL;DR)
一句话:把一个轻量级 diffusion attention head 拼到冻结的 AR Transformer 上, 两条 attention path 共享同一份 KV cache — AR head 做 prefill 构建 high-fidelity KV, diffusion head 做一次前向并行预测 K=32 个 future token, 然后用 frozen AR head 自己做严格 left-to-right 的 intra-model consensus 验证 (greedy 时 argmax 匹配, T>0 时退化为 Leviathan-style 拒绝采样). 结果: lossless · 平均 5-6× 加速 · 仅 ~4.5 MiB O(1) KV cache 开销 · 仅 16% 参数可训 · 单 8×H200 节点 24 小时训完.
立场:这是用 spec-decoding 验证协议 + diffusion drafter但把 drafter 和 verifier 焊到同一个 transformer 里共享 KV的结构性创新 — 不再有"外部 drafter" 与"verifier" 的二元区分, 也不再有 redundant KV cache. 论文把它叫 "intra-model speculative", 是 DFlash / EAGLE-3 这条 block-diffusion-drafter 线的下一站.
前置阅读: Orthrus 是 spec-rl 系列里"块扩散 drafter"这一支的延续, 看本文前建议过一遍 07_DFlash (理解 block diffusion drafter 的一次前向出整块 marginals 是怎么回事), 以及 15_Lossless_Proof_Tutorial (rejection sampling 为什么 lossless). Orthrus 的 consensus mechanism 在 greedy 下退化为 argmax 等价检查, T>0 时直接复用 Leviathan/Chen 2023 的拒绝采样.
§1 动机: AR sequential bottleneck vs diffusion 的 lossy 并行
1.1 两条裂变路径的死结
作者用一段非常 clean 的 framing 把整个加速器领域归约成两难选择:
AR: exact causal conditioning 保证 fidelity, 但强制 sequential — 解码 N 个 token = N 次 forward, memory-bandwidth bound.
Diffusion (MDM): 并行出整块, 但 conditional independence 假设让 joint distribution 偏离 AR target — long-horizon reasoning 上 drift 累积.
作者拿 Fast-dLLM-v2 当反面教材: 它把 pre-trained AR 改造成 block diffusion, 在 MATH-500 上掉了 11 分; 而且为了挽回 coherence 还要 multi-step iterative denoising, 把理论上的并行加速优势又吃掉一大块, 最终 wall-clock 加速反而微薄.
1.2 论文的根本主张
Orthrus 不试图把 AR 改成 diffusion (Fast-dLLM-v2/Dream/SDAR 等都是这条路, 全部要 50-580B token 继续预训), 也不接受 diffusion 的 lossy. 它的招法是:
W_Q^diff, W_K^diff, W_V^diff),
形成第二条 attention path — 这条 path 在同一份 KV cache 上做双向 attention, 一次出 K 个 future token.
然后用 frozen AR head 自己验证, lossless 直接复用 spec decoding 的拒绝采样数学.
说白了 — diffusion 部分只是个"并行 drafter", AR 部分既当 prefill 又当 verifier, KV 完全共享. 这是 EAGLE-3 / DFlash 这条线的极简化结晶: 不再有外置 drafter, 没有 redundant KV.
1.3 在 spec-rl 系列里的位置
看 spec-rl 16 篇前作走过的路:
- EAGLE-1/2/3 (#02): 外置 feature-space drafter, 树形 expand, target frozen, drafter 单独训.
- DFlash (#07): drafter 换成 block diffusion, 一次前向出整块 marginals, 但取 argmax 串成单 trajectory, 浪费 marginal 分布信息.
- DDTree (#16): 在 DFlash 之上加 best-first heap 树, 把 marginal 分布的信息榨干.
- Hidden States Drift / KVShot (#08): 探讨 drafter 与 target 之间 hidden vs KV 该共享什么, KV-only reuse 才稳.
- SV (#13): companion-model 风格验证, info-gain 动态 verify length.
Orthrus 像是把这些经验汇拢: 不要外置 drafter (省 KV) + diffusion 出整块 (DFlash 思路) + frozen target 自己验 (lossless) + KV 严格共享 (KVShot 启示) + greedy 一致即接受 (类似 Medusa 的 typical acceptance 但更严格). 把外置 drafter 这一历史包袱彻底丢掉.
§2 方法: 双视图 (Dual-View) 架构
2.1 网络结构 — 在每层旁边加 (W_Q^diff, W_K^diff, W_V^diff)
对每一层 transformer block, Orthrus 都注入一组额外的 Q/K/V 投影矩阵, 这就是 trainable 的 diffusion view. 输出 logits 共用同一个 LM head — 也就是说, 唯一新增的可学权重就是每层 3 个矩阵, 总共占 ~16% 参数. AR 路径和原本一模一样, 整个 backbone 冻结.
注意: Kdiff, Vdiff 只存在于当前那块 K 个 future positions 内部 (transient, 用完即扔) — 真正用来当"历史"的 KAR/VAR 是原封不动的, 这就是 O(1) KV cache 开销的来源.
2.2 Prefill 与 generation 阶段的角色分工
| 阶段 | 谁执行 | 做什么 | KV cache 变化 |
|---|---|---|---|
| Prefill (prompt 处理) | frozen AR backbone | 标准 causal self-attention 处理 prompt | 构建 high-fidelity KAR≤t, VAR≤t |
| Generation - Step 1 (并行投影) | diffusion head | 一次 forward 出 K 个候选 token (anchor + K-1 个 mask 位置) | 读 KAR + transient Kdiff; 后者一次后丢 |
| Generation - Step 2 (一致性验证) | frozen AR head | 把 diffusion 投影出来的整个 K-token block 喂一次 causal forward, 拿 pAR(·|context, ŷ1:k-1) 与 ŷk 对比 | 把接受的前缀的 AR-KV 永久 append 进共享 cache |
关键的概念分裂在于: AR path 永远只对"已确定的真序列"做 causal forward, 因此它产出的 K/V 一定是 ground-truth quality 的 KV. Diffusion path 用来对"还没确定的 K 个 future 位置"做双向 投影, 它的 KV 不入历史 cache.
2.3 "为什么不需要外置 drafter KV cache" — O(1) 的来源
标准 spec decoding 里, drafter 通常是独立的小模型, 它有自己的 KV cache, 跟着 target 序列长度一起线性增长 — 8B target + 1.5B drafter, 那 drafter 的 KV cache 大约 = target 的 (d_drafter / d_target) × (L_drafter / L_target), 通常占目标 10-30%. 即使 EAGLE-3 的 feature-space drafter 也要存一份独立 KV.
Orthrus 把 drafter 焊到同一个 transformer 里, 让它直接读 target 的 KV, 自身只在生成 K 个 future 时短暂分配 (K × d_head × 2 个 float, K=32 时大约 4.5 MiB, 用完即可丢). 这就是 §B 里 "Δ≈4.5 MiB regardless of sequence length L" 的物理解释.
§3 训练: Dual-Pass Block Masking + KL 蒸馏
3.1 数据 — 用 frozen AR 自己当 teacher
训练数据是从 Nemotron-Post-Training-Dataset-v2 抽出的, 严格 1:1:1 比例 (Chat / Math / Code) 三个 domain. 关键的 ground-truth 标签不是数据集里的 token, 而是 frozen AR head 在每个位置预测出的整个 full softmax — 即 forward KL distillation against teacher.
Sequence packing 到 L=2048, 总训练实例 471,952 个 (Appendix A 精确数字), 折合 0.96B 总 token. 每条 packed sequence 里随机采 256 个 anchor block, 每个 block 大小 K=32. 单 8×H200 节点跑 2 epoch, 不到 24 小时训完.
3.2 Dual-Pass attention mask — 怎么防止 diffusion 偷看未来
训练时, AR path 处理干净的 historical context, diffusion path 处理 corrupted block (anchor + K-1 个 mask token). FlexAttention 实现一个特殊的 block mask:
左半部分: diffusion 的每个 query 位置只能因果地看到自己 block anchor 之前的 historical context (蓝色). 右半部分: 同一个 block 内部的 K 个位置可以双向互看 (红色, "bidirectional within block"). 不同 block 之间看不见 — 这样一条 packed sequence 里采 256 个 anchor 互不干扰, 一次 forward 完成 256 个独立任务.
3.3 Loss — forward KL against frozen AR
诠释: 对每个 mask 位置, frozen AR 给出"如果我顺着 ground-truth 因果生成, 该位置的下一 token 分布是什么"; diffusion 在不知道 ground-truth 中间 token的条件下, 用 mask 重建该位置. KL 强迫 diffusion 学到与 AR-teacher 完全相同的分布形状, 而不是去 fit 数据集硬标签.
3.4 软标签 vs 硬标签 — 6.35 vs 5.86 TPF
作者解释: 硬 CE 让 diffusion 过拟合到数据集的表层句法, 推理时 consensus 拒绝率高; 软 KL 让 diffusion 对齐到 AR 的具体 causal trajectory 偏好, 接受率自然高. 这是 lossless 之外的"速度"成本 — 即便是 lossless 框架, 训练目标依然影响 acceptance length.
3.5 Hyperparam 速查
| 项目 | 值 |
|---|---|
| Max seq length L | 2048 |
| Anchor blocks / sequence | 256 |
| Parallel block size K | 32 |
| Epochs | 2 |
| Peak LR | 2e-4 (cosine, 5% warmup) |
| Grad clip | 1.0 |
| Global batch | 128 (micro=1 × accum=16 × 8 GPU) |
| Precision | bfloat16 |
| Backend | FSDP-2 + FlexAttention + FlashAttention-4 |
| Domain split | 1:1:1 Chat / Math / Code |
§4 推理: Exact Consensus 机制 (lossless 的来源)
4.1 单步循环的三段
设当前已生成 prefix x≤t, 它的 high-fidelity KV cache 已经在共享区. 一次 generation cycle:
- Step 1 (Parallel Projection): 构造 ỹt = [xt, mask, mask, ..., mask] (长度 K), 让 diffusion head 一次 forward, 拿到 K 个 candidate token ŷ = (ŷ1, ..., ŷK) ~ pdiff(·|x<t, ỹt).
- Step 2 (AR Verification): 把这 K 个 candidate 当作"已确定的输入"喂给 frozen AR head 做一次 causal forward, 同时算出 K 个位置上的 pAR(·|x≤t, ŷ1:k-1) — 注意这次 forward 是 AR 单次, 一次性出 K 个分布.
- Step 3 (Consensus): 从左到右 (k=1,2,...,K) 做匹配 — greedy 下检查 ŷk 是否等于 argmaxv pAR(v|...); T>0 下用 Leviathan/Chen 拒绝采样. 一旦在 j 位置不匹配, 锁定前 j-1 个 + 用 pAR 在 j 位置原生采 1 个 correction token, 截 cache 到 t+j, 进入下一 cycle.
每个 cycle 恰好两次 forward (diffusion 1 + AR 1), 至少接受 1 个 token (因为 correction token 一定会被 commit). 这就是论文里 "theoretical lower bound 0.5 TPF, ≥1 token per 2 passes" 的来源.
4.2 Greedy 模式 — 为什么 argmax 等价就够 lossless?
在 T=0 greedy 解码下, AR baseline 就是 deterministically 选 argmax. Consensus 只接受跟 AR argmax 完全相同的 ŷk, 一旦不同就回滚 + 用 AR 自己的 argmax 当 correction — 输出序列每个位置都恰好等于 AR baseline 跑出来的 argmax, 因此严格 lossless.
4.3 T>0 — 复用 Leviathan 拒绝采样
T>0 时, 接受 ŷk with prob min(1, pAR(ŷk)/qdiff(ŷk)), 拒绝则按 max(0, pAR-qdiff) 重采 — 这就是 spec decoding 经典证明 (见 #15). 同样 lossless.
4.4 与外置 drafter spec decoding 的差异
| 维度 | 标准 spec decoding (Leviathan/EAGLE) | Orthrus |
|---|---|---|
| drafter 是谁 | 外置小模型 (独立参数 + 独立 KV) | 同一 transformer 的 diffusion attention path (共享 KV) |
| drafter 出多少 token | k 次 forward 出 k 个 (AR 链式) | 1 次 forward 出 K 个 (diffusion 并行) |
| verifier | target model (一次性 forward all) | 同一 transformer 的 AR head (一次性 forward all) |
| KV cache 数量 | 2 份 (drafter + verifier) | 1 份 (共享) |
| 额外参数 | ~10-30% of target | ~16% of target (但与 verifier 同 transformer) |
| Lossless | 拒绝采样 | greedy: argmax 等价; T>0: 同样拒绝采样 |
§5 实验: TPF / 7.8× peak / 与 SOTA diffusion 对比
5.1 评测设置
Base model 三档: Qwen3-1.7B / 4B / 8B (frozen). Benchmark 全是 reasoning-heavy 的, 因为这种 long-horizon 最能暴露 diffusion drift:
- 数学: GSM8K, MATH-500, AIME24, AIME25
- 代码: HumanEval, MBPP, Pseudo2code, LiveCodeBench-v5
指标 TPF (Tokens Per Forward Pass) = total generated tokens / total forward passes, hardware-agnostic. AR baseline TPF = 1.0. Orthrus 一个 cycle = 2 forward + 至少 1 token → 理论 TPF ∈ [0.5, K/2] = [0.5, 16].
5.2 Table 1 关键数字 (greedy, T=0)
| Task | Qwen3-1.7B TPF / Speedup | Qwen3-4B TPF / Speedup | Qwen3-8B TPF / Speedup |
|---|---|---|---|
| GSM8K | 4.20 / 4.37× | 4.91 / 4.48× | 5.30 / 5.22× |
| MATH-500 | 4.71 / 4.74× | 6.02 / 5.76× | 6.35 / 5.95× |
| AIME24 | 4.33 / 5.65× | 5.00 / 6.06× | 5.63 / 6.81× |
| AIME25 | 3.89 / 4.80× | 5.17 / 5.86× | 5.25 / 6.03× |
| HumanEval | 2.75 / 3.07× | 3.57 / 3.67× | 3.94 / 3.68× |
| MBPP | 2.76 / 3.07× | 3.74 / 4.43× | 3.95 / 3.90× |
| Pseudo2code | 4.60 / 4.90× | 7.40 / 7.38× | 7.51 / 7.83× ⭐ |
| LiveCodeBench-v5 | 3.86 / 5.87× | 4.50 / 6.28× | 5.17 / 6.68× |
| Average | 3.89 / 4.25× | 5.04 / 5.20× | 5.39 / 5.36× |
读出几条:
- "7.8× peak" 的具体出处: Qwen3-8B / Pseudo2code, 不是平均水平. Pseudo2code 这种"伪代码翻译"任务往往有很强的结构重复性, diffusion 一次拍出整块的大块 prefix 容易接受到 12+ 个 token.
- Average 5.36× 才是 8B 上更现实的"日常加速". 16% 训练参数 + 1B token 就能在 reasoning task 上做出 5-6× 是相当扎实的.
- 更大模型加速更大 — 4× → 5.2× → 5.4× 单调递增. 解释: 大模型本身 memory-bandwidth 越紧, 一次 forward 摊薄 K token 的边际收益越显著.
- HumanEval / MBPP 偏低 (3-4×) — 短代码段, decoding 长度本身不长, diffusion block 优势被稀释.
- T=1 (sampling) 的表现 与 T=0 几乎打平 (8B 平均 5.02× vs 5.36×) — 拒绝采样代价不大, 这印证了 §4.3 的设计.
5.3 Table 2 — 与 SOTA diffusion LLM 对比
| Model | Params | GSM8K | MATH-500 | AIME24 | AIME25 | HumanEval | MBPP |
|---|---|---|---|---|---|---|---|
| Dream-7B | 7B | 79.3 | 39.6 | — | — | 57.9 | 58.8 |
| LLaDA-1.5 | 7B | 82.4 | 57.4 | — | — | 52.4 | 42.8 |
| SDAR-Qwen3-8B | 8B | 91.7 | 78.6 | 10.0 | 10.0 | 78.7 | 72.0 |
| SDAR-Qwen3-30B-A3B | 30B | 91.4 | 77.8 | 16.7 | 10.8 | 71.6 | 87.2 |
| Fast-dLLM-v2 | 7B | 83.7 | 61.5 | — | — | 43.3 | 28.2 |
| Mercury Coder Small | — | — | — | — | — | 90.0 | 76.6 |
| Gemini Diffusion | — | — | — | — | 20.0 | 89.6 | 76.0 |
| Orthrus-Qwen3-8B | 8.7B | 96.0 | 86.2 | 28.3 | 23.3 | 95.1 | 93.4 |
注意 — Orthrus 8.7B 的准确率严格等于 Qwen3-8B baseline (因为 lossless). 表里所有 diffusion 都"自食其变" — SDAR 同样用 Qwen3-8B 当起点都跌到 78.6 (vs Qwen3-8B baseline 86.2), Fast-dLLM-v2 直接 61.5. 这把作者反复强调的"adaptation 导致 distributional drift"用数字钉死了.
5.4 Ablation
5.4.1 Block size K (Figure 5)
K 从 4 增到 32 时, TPF 从 ~1.8 涨到 6.35 (Qwen3-8B / MATH-500), 但forward-pass latency 几乎不变 — 因为 diffusion 是一次 forward, 算 K=4 还是 K=32 都是一次 GPU kernel launch, 在 H200 上都不太够吃满算力. 作者选 K=32 当 default.
5.4.2 Multi-step vs Single-step (Table 3)
| 策略 | 每 cycle forward 数 | TPF |
|---|---|---|
| Multi-Step (à la Fast-dLLM-v2) | 3 (diff×2 + AR×1) | 3.53 |
| Orthrus Single-Step | 2 (diff×1 + AR×1) | 6.35 |
单步胜出 1.8×. 这是个重要 finding — 在 diffusion LLM 文献里普遍认为 multi-step iterative denoising 必不可少, 但 Orthrus 证明只要后面有 AR consensus 兜底, diffusion 不需要把自己 polish 到完美, 单次粗投影 + AR 校正反而更快.
5.4.3 内存 (Figure 6)
KV cache 增量: ≈ 4.5 MiB, 独立于 L, O(1).
§6 与 EAGLE-3 / DFlash 的速度对比
6.1 Average Acceptance Length (Figure 4)
论文 §4.4 给了一张关键对比图, 在 Qwen3-8B 上, 三种 drafter 方案的 average acceptance length (一次 verify 后接受的 token 数):
| 方案 | MATH-500 acceptance length | drafter 类型 | 独立 KV cache? |
|---|---|---|---|
| EAGLE-3 | 3.5 | 外置 AR feature-space drafter | 是 (额外 ~10% 内存) |
| DFlash | 7.9 | 外置 block-diffusion drafter | 是 (5 层 K/V 注入开销) |
| Orthrus | 11.7 | 内嵌 diffusion attention path | 否 (共享 KV) |
Orthrus 在 acceptance length 上比 DFlash 多 48%, 比 EAGLE-3 多 234%. 直观原因:
- EAGLE-3 的 drafter 是一个 feature-space 小网络, 链式生成, 出错累积快 → acceptance length 短.
- DFlash 一次出整块, 但 drafter 是独立小模型, 它对 target 的内部表征只有有限的 5 层 K/V 注入访问 → marginals 有偏差.
- Orthrus 的 diffusion head 共享 target 的所有层的 KV, 而且训练时用了 forward KL 直接拟合 target 的 full distribution → 投影分布几乎就是 target 分布的并行近似, 接受率自然爆高.
6.2 整体速度公式角度
Orthrus 每 cycle 都是 2 次 forward (1 diff + 1 AR), 最多接受 K=32 个 token. 平均 TPF 5.39 ≈ 每 2 forward 接受 5.4 个, 等价 acceptance length ≈ 10.8. 跟 Figure 4 上的 11.7 基本对得上 (差异是不同 task 的均值).
6.3 但 wall-clock 呢?
论文用的主要指标是 TPF — hardware-agnostic. Figure 3 给了 wall-clock throughput 但没明确数字, 仅说"6× speedup over Qwen3-8B baseline on MATH-500" — 跟 TPF 5.95× 大致对得上. 也就是说 Orthrus 的 diffusion forward 和 AR forward都是单次, kernel 调度开销几乎抵消, TPF≈wall-clock ratio.
§7 与本系列其他工作的关系
7.1 与 #07 DFlash — 同祖不同枝
DFlash 是 block diffusion drafter 概念的奠基: 一个独立的 diffusion 模型, 一次前向出整块 marginals, 通过 5 层 K/V 注入读 target 的 hidden states. Orthrus 走得更彻底 — drafter 不再是独立模型, 而是 target 上直接长出来的 attention path, KV 完全共享, 训练只动 16% 参数 (vs DFlash 的整个 drafter).
本质区别: DFlash 仍然有"draft vs verify"的二元划分, Orthrus 把这个划分内化到了一个 transformer 内部的 attention path 上.
7.2 与 #15 Lossless Proof Tutorial — 直接复用 Leviathan/Chen 2023
Orthrus paper §3.3 明确说: T>0 时 "leverages an exact rejection sampling to align the parallel projection with the target distribution, guaranteeing strictly lossless sampling (Leviathan et al., 2022)". 也就是说, Orthrus 的"lossless"不是新理论, 而是把 spec decoding 的 rejection sampling 数学搬过来用 — 唯一新的是: drafter 现在是同一 transformer 内的 attention path, 而不是外置模型. 拒绝采样的数学对 drafter 的具体身份不挑.
推荐串读: 看完 #15 的 § "rejection sampling 等价定理"那一段, 再回头看本文的 §4.3, 一切就通了.
7.3 与 #08 Hidden States Drift / KVShot — KV-reuse 的极致
KVShot 的核心 finding 是 "drafter 与 target 之间应该共享 KV 而不是 hidden states" — hidden states reuse 会引入分布 drift. Orthrus 是这个 finding 的"完成体": 两条 attention path 共享同一份 KV (绝对一致), 各自独立计算 hidden states (没有跨 path 的 hidden states 复用风险).
7.4 与 #13 SV (Speculative Verification) — 互补
SV 关心的是"验证 length 是否应该动态" — 用 info-gain 当 signal 动态决定 verify 多少 token. Orthrus 走的是固定 K=32 路线. 两者其实正交: 完全可以在 Orthrus 上加 SV 的 info-gain criterion, 让 K 变成 adaptive — Orthrus 没做这个 ablation, 是个可挖的方向.
7.5 与 #16 DDTree — 树 vs 链
DDTree 在 DFlash 之上加 best-first heap tree, 在同一份 diffusion forward 出的 marginals 上枚举 top-B prefix, 用 tree attention 一次验证, 比 vanilla DFlash 再 +30~60%. Orthrus 没用树, 只用单链 (single trajectory) + 严格 left-to-right 验证. 因此:
7.6 关联图
§8 开源现状与可复现性
8.1 GitHub
仓库 tagline: "Fast, lossless LLM inference via dual-view diffusion decoding."
所有者: chiennv2000 (一作 Chien Van Nguyen 个人账号, 非 Adobe 组织账号)
验证: 实测 HTTP 200, 仓库存在.
未在公开来源确认: 内部具体提交了哪些文件 (training code / inference kernel / FlexAttention mask 的实现 / data prep pipeline) 笔者没有完整 fetch 仓库内容, 仅确认 URL 存在与论文里给出的链接吻合.
8.2 HuggingFace 模型权重
HF API 查询 (search=orthrus) 返回的 chiennv 账号下的 3 个 checkpoint:
| Model | 下载量 | likes | License | Created |
|---|---|---|---|---|
chiennv/Orthrus-Qwen3-1.7B | 464 | 5 | CC-BY-4.0 | 2026-05-08 |
chiennv/Orthrus-Qwen3-4B | 249 | 5 | CC-BY-4.0 | 2026-05-08 |
chiennv/Orthrus-Qwen3-8B | 1,535 | 13 | CC-BY-4.0 | 2026-05-08 |
所有权重都带 custom_code tag — 因为 diffusion head 不是标准 transformer 模块, 需要 trust_remote_code=True. tag 里还有 "diffusion · parallel-decoding · orthrus · arxiv:2605.12825", 跟论文一一对应.
8.3 License 评估
代码: 未在公开来源确认 (仓库的 LICENSE 文件笔者没单独 fetch, 但作者个人账号 + Adobe 联合工作, 通常会用 Apache-2.0 或 MIT, 较少用 NC).
Base 模型限制: Orthrus 是 derived from Qwen3 base, 因此最终用户必须同时遵守 Qwen3 的 license (Apache-2.0).
8.4 与同系列开源对比
| 项目 | 代码 | 权重 | 训练数据 | 整体可复现性 |
|---|---|---|---|---|
| EAGLE-3 | 完整开源 Apache | 多 size 全开 | ShareGPT 类 | ★★★★★ |
| DFlash (#07) | 大部分 | 主要 size 开 | SFT 数据可获取 | ★★★★ |
| SDAR | 有 | 有 (8B/30B) | 50B token 预训练数据未必公开 | ★★★ |
| Fast-dLLM-v2 | 有 | 有 | 500B 改造数据不公开 | ★★ |
| Orthrus | GitHub 存在 (内容未细查) | 1.7/4/8B 三档全开 CC-BY-4.0 | 用公开 Nemotron-Post-Training-Dataset-v2 + frozen AR 自生成 KL teacher | ★★★★ (训练只 1B token + 8×H200×24h, 单人都能复现) |
评价: Orthrus 的复现门槛极低 — 因为它的整个训练数据是 frozen AR 自己合成的 soft target, 不依赖外部专有数据集. 8×H200 一节点 24 小时 = ~$50-200 算力 (按 H200 cloud 计价 ~$2-5/h/GPU × 8 × 24). 学生党 / 小实验室都能复现, 这点比 DFlash / SDAR 都强.
§9 批判性分析 / 待验证问题
9.1 "Lossless" 真的严格 lossless 吗?
✅ 是的, 严格 lossless — 这一点没有水分:
- Greedy (T=0): consensus 强制接受的每个 token 都恰好等于 AR-baseline argmax, 任何不一致都被 AR correction 覆盖. 数学上输出序列与"纯 AR 跑出来的序列" 逐 token 相同.
- T>0: 用的是 Leviathan 2023 拒绝采样, 论文 §3.3 明确引用, 复用经典证明 (#15).
但 lossless 的"口径"要注意 — 它是分布意义的 lossless, 不是"每个具体生成都跟 AR 完全相同". T>0 时, 同样的 prompt 跑两次 Orthrus 不会得到相同 trajectory, 跟跑两次 AR baseline 一样. 但分布是同一个分布.
9.2 7.8× 是 peak — 平均水平到底多少?
看 Table 1:
- "7.8×" 出现在 Qwen3-8B / Pseudo2code / T=0, 是所有 cell 里的最大值. 这是高度结构化的伪代码 → 代码翻译任务, 不代表通用场景.
- 更现实的平均: 8B 上所有 task 平均 5.36× (T=0). 4B 上 5.20×. 1.7B 上 4.25×. 对小模型, 加速比也小 — 因为小模型 memory-bandwidth 占比不那么主导.
- HumanEval / MBPP 偏低 (3-4×): 短代码段, 而且 Python 那种"每行一个新 statement" 的低 prefix 共享性, diffusion block 在这里发挥不出最大优势.
所以读这篇的时候: 7.8× 是marketing 数字, 5-6× 是工程数字, 3× 是worst case (短代码). 但即便最差的 3× 仍然比 EAGLE-3 (典型 1.5-2.5×) 强.
9.3 训练数据是 SFT 还是从 teacher 蒸馏的?
答: 从 teacher 蒸馏. Appendix A 写得很清楚: "target outputs are generated directly by the frozen AR head and used as the distillation signal to train the diffusion head". 也就是说, Nemotron-Post-Training-Dataset-v2 只是提供 prompt 文本 (作为 context input), 真正的 label 是 frozen Qwen3 自己 forward 出来的 full distribution. 这就解释了为什么 1B token 就够用 — 不是从头学知识, 而是学一个"快速近似 Qwen3 分布"的并行 head.
9.4 vs EAGLE-3 — 真的差异在哪?
表面上, EAGLE-3 和 Orthrus 都是 "frozen target + lightweight trainable drafter + lossless 拒绝采样". 真正的差异:
- drafter 怎么出 token: EAGLE-3 链式 (k 步 forward 出 k 个), Orthrus 并行 (1 forward 出 K 个).
- drafter 是否独立: EAGLE-3 独立小网络, Orthrus 同 transformer 的 attention path.
- KV cache: EAGLE-3 两份 (额外 ~10% 内存), Orthrus 一份 (额外 ~4.5 MiB).
- Acceptance length: EAGLE-3 ≈ 3.5, Orthrus ≈ 11.7 (3× 提升).
本质: AR drafter 在结构上天然受限 — chain 长度=drafter forward 次数; diffusion drafter 把 chain 摊平成一次并行 forward, 这就是 Orthrus 比 EAGLE-3 acceptance length 大 3 倍的 fundamental 原因.
9.5 O(1) memory 的口径校验
论文反复说 O(1) memory overhead, 笔者去 §B / Figure 6 验证:
- ✅ KV cache 增量: 确实 ≈4.5 MiB constant, regardless of L. 因为 diffusion path 不写入历史 cache, 只在生成时用 transient K×d 的临时空间.
- ⚠️ Weights 增量: 16% of base model 参数 — 8B base 大约 +1.4B parameters, FP16 下 ~2.8 GB. 这是恒定但不算小. 论文说 "peak GPU memory overhead is practically negligible (<1%)" — 但这里 1% 应该是相对总 GPU 内存 (H200=80GB), 不是相对模型大小.
- ✅ Diffusion head 本身的 KV: 训练时每个 sequence 256 个 anchor block × K=32 = 8192 个 transient positions, 每个有 Kdiff+Vdiff. 但这些都是 batched compute 后立即丢的, 不持久. 推理时只有 K=32 个临时位置.
所以 O(1) 是KV cache 维度的 O(1), 不是所有内存维度的 O(1). 总内存还是要加 16% 的 weight footprint. 这点论文 framing 略夸张, 但真正重要的那块 (KV cache scaling, 随 L 线性增长的那块) 确实是 O(1) 的.
9.6 没做的 ablation / 可挖坑
- 更小的可训练参数: 16% 已经很少, 但 LoRA-style only-update-attention-K-V 可能压到 5-8%, 训练数据可能能再少一半. 论文没探.
- K=32 之外: K=4 → 32 的扫描有了, K=64/128 没扫. 大 K 时 single-forward 算力是否还够 (序列长度+K 接近 attention quadratic 上界)?
- Tree verify: 上面 §7.5 提过. 一次 diffusion forward 拿到 K 个 marginals, 完全可以套 DDTree 的 best-first heap 出树.
- 动态 K (à la SV): 接受率高的 task 用大 K, 低的用小 K. 没探.
- 多模型: 论文只测 Qwen3 一家. Llama-3 / GPT-OSS / DeepSeek 等是否一样能用同样的训练协议 (1B token, 24h) 拿到 5× 加速? 未在公开来源确认.
- 多语言 / non-English benchmark: 都是英文 reasoning 任务. 中文 / 多语言场景下 acceptance length 是否一样? 未测.
- Long context (>2K): 训练 L=2048, 推理时 generalize 到 8K / 32K context 表现如何? 论文 Figure 6 测到了内存稳定但没测 acceptance length 是否随 L 衰减.
9.7 Limitation (作者自己 Appendix C 承认)
"Because the Orthrus architecture strictly freezes the autoregressive backbone to guarantee exact inference parity, its generative capabilities are strictly upper-bounded by the foundation model. ... Consequently, the framework acts solely as an inference accelerator and inherently inherits any biases, knowledge gaps, or hallucination tendencies present in the underlying base model."
这是 frozen-backbone 路线的共同代价: 你的 ceiling 不会超过 base model. 想突破能力上限只能换更大的 base, 或者放弃 frozen (但那就回到 Fast-dLLM-v2 那条死路). 不过对纯加速来说这反而是优点 — 你的 caller 不需要担心 Orthrus 改变了模型行为.
9.8 笔者个人 take
对比 EAGLE 系列: EAGLE-1/2/3 一直在 drafter 上做文章 (feature space, dynamic tree, training-time test), 但 drafter 始终是个独立小网络. Orthrus 直接说: 这个"独立"是历史包袱, 砍掉. 这种"把工程边界往内收"的招法很 Apple 风 — 不是把功能加复杂, 而是把抽象层去除.
预测: 这个范式会很快成为下一代 spec decoding 的标准模板, 接下来 6-12 个月会有一波在 Orthrus 上加各种 enhancement 的工作 (tree-verify, dynamic K, longer context, multi-model). EAGLE-3 这条外置 drafter 线在新的工业部署里大概会逐步被取代.
Memory points
- Orthrus = AR backbone (frozen) + diffusion attention path (trainable, 16% params) 共享同一份 KV cache. 这是核心结构创新, 比任何单独的 algorithmic trick 都重要.
- 训练: 1B token, 8×H200×24h, Forward-KL 蒸馏自己的 AR teacher. 复现门槛极低, 学生党都能跑.
- 推理 cycle: 2 forward (1 diff + 1 AR), 接受 1-K 个 token. Theoretical lower bound = 0.5 TPF, 实测 average ≈ 5.4 TPF (8B).
- Lossless = 拒绝采样 (Leviathan 2023, #15) 的直接复用 — 不是新理论, 是把 spec decoding 的数学搬到 intra-transformer 验证场景.
- 7.8× peak (Pseudo2code), 5-6× average reasoning, 3-4× HumanEval/MBPP (短代码). Marketing 是 7.8×, 工程数字 5×, worst case 3×.
- Acceptance length 11.7 vs DFlash 7.9 vs EAGLE-3 3.5. 这是 Orthrus 真正吊打 SOTA 的硬指标.
- KV cache 增量 ≈ 4.5 MiB, regardless of L. 这是 "O(1)" 的物理来源, 但 weight 多了 ~16% (~2.8 GB on 8B) — 后者论文没明说.
- Single-step > Multi-step (6.35 vs 3.53 TPF). 反 diffusion 文献常规直觉: 有 AR consensus 兜底时, diffusion 不需要 polish 到完美.
- Soft KL > Hard CE (6.35 vs 5.86 TPF, 同 accuracy). Lossless 框架里, 训练目标依然影响速度 (通过 acceptance rate).
- GitHub chiennv2000/orthrus + HF
chiennv/Orthrus-Qwen3-{1.7,4,8}B三档权重 CC-BY-4.0 全开. - Ceiling = base model. Frozen backbone 路线的共同代价, 但对纯加速场景反而是优点.
- 潜在 open question: Orthrus × DDTree 树验证 / Orthrus × SV 动态 K / Orthrus on 非 Qwen3 base / Orthrus 在 long-context 上 acceptance length 衰减如何 — 论文都没做.
- 预测: 这个 "drafter 焊到 attention path" 的结构范式会快速取代外置 drafter 范式. EAGLE-3 类工作 6-12 月后会显老.
· 本笔记基于 arXiv:2605.12825v1 + arXiv HTML 版 + HuggingFace API 元数据 + GitHub HEAD 验证 ·
· 标注 "未在公开来源确认" 的项: GitHub 仓库内具体文件清单 / 代码 LICENSE / Long context / 非 Qwen3 base 推广性 ·