DART:把草稿并行生成之后,还要补上哪些依赖?

笔记日期: 2026-10-14
论文: DART: Diffusion-Inspired Speculative Decoding for Fast LLM Inference
作者: Fuliang Liu, Xue Li, Ketai Zhao, Yinxi Gao, Ziyan Zhou, Zhonghui Zhang, Zhibin Wang, Wanchun Dou, Sheng Zhong, Chen Tian
编号与版本: arXiv:2601.19278v1,首次提交 2026-01-27
资源: 论文与附录 · 官方资源入口

1. 先抓住问题:帮助大模型加速的小模型,也会拖慢流程

投机解码的出发点很直观:让一个便宜的模型先猜几个 token,再让昂贵的目标模型一次检查。这像是先写草稿再批改,但评价草稿不能只问“猜对多少”,还要问“写草稿花了多久”。如果小模型仍要连续运行八次,单次再轻,也可能吃掉批量验证省下来的时间。

DART 主要改变的是这一段串行等待。它复用目标模型的中间特征,用一个定制的 Transformer 层,一次预测未来若干位置的分布。接下来并不直接把每个位置的最大概率 token 拼起来,而是用 n-gram 统计帮助构造一个候选树,再交给目标模型验证。神经模型负责便宜地提出候选,局部语言统计负责筛掉一些不连贯的组合,目标模型负责最终决定输出。

我觉得最值得记住的是“依赖搬到了哪里”。DART 没有神奇地消除 token 之间的依赖,而是把一部分依赖从多次神经网络前向,移到了离散树搜索中。这个选择能节省 GPU 上的串行延迟,却引入了 CPU 索引和搜索成本。论文中的“单层轻量草稿”成立,但不能据此把整个服务配置也称为轻量:附录中的 n-gram 索引运行时大约占 100 GB 主机内存。

论文在 batch 1 下给出了很好的结果,但附录也给出了另一面:Qwen3-8B 在 batch 64 时,DART 相对普通解码只剩约 1.01 倍加速。因此,这篇笔记会把算法机制、速度账和适用范围一起看。这样既能理解方法为什么有效,也能知道哪些条件改变后需要重新判断。

DART 的一次推理流程

图 1:根据论文图 3 与第 3–4 节自绘。目标模型特征进入一次并行草稿前向;CPU n-gram 索引在树剪枝时补充局部连续性;验证后只提交被接受的路径及所需纠正 token。图中各模块的职责不同,不能让 n-gram 代替目标模型判断正确性。

2. 前置知识:到底应该优化哪一段时间?

2.1 把“每轮前进多少”和“每轮耗时多久”放到一起

设普通目标模型生成一个 token 的时间为 TART_{\mathrm{AR}}。一次投机轮次包含草稿前向 TDT_D、树搜索 TST_S 和目标验证 TVT_V。用 MM 表示本轮真正提交的 token 数,它是否包含纠正或额外生成的 token,取决于所用验证规则。忽略 prefill 和固定启动成本,长期加速比可以近似写成:

S≈E[M]TARE[TD+TS+TV].(1)S\approx\frac{\mathbb E[M]T_{\mathrm{AR}}} {\mathbb E[T_D+T_S+T_V]}. \tag{1}

分子是有效前进量,分母是为它付出的全部时间。如果一种草稿多猜对 10%,但让每轮时间增加 30%,最后仍然会更慢。这也是为什么论文里的平均接受长度 τ\tau 不能单独代表系统性能。

这里还要注意统计口径:累计 token 数除以累计时间,不一定等于“每个请求的加速比再求平均”。长请求和短请求的权重不同,困难请求也可能同时具有低接受率和高耗时。式(1)是帮助理解的账本,而不是代替真实端到端测量的万能公式。

原文对 τ\tau 的描述略有松动:前面说是接受的草稿 token 数,指标段落又说每轮生成的 token 数。如果验证器会额外生成一个 token,这两种口径就不同。我保留表中的原始 τ\tau,不会擅自给它加一。下面另用 AA 表示接受的草稿数,用 MM 表示最终提交数,避免把符号混在一起。

2.2 为什么前面的 token 特别重要?

对于长度为 dd 的草稿链,定义 aia_i 为“前面都已经接受的条件下,第 ii 个 token 也被接受”的概率。利用非负整数随机变量的尾和公式:

E[A]=∑i=1dPr⁡(A≥i)=∑i=1d∏j=1iaj.(2)\mathbb E[A] =\sum_{i=1}^{d}\Pr(A\ge i) =\sum_{i=1}^{d}\prod_{j=1}^{i}a_j. \tag{2}

这里的乘积来自条件概率链式法则,不需要假设每一步独立。要走到第八步,前七步必须全部通过。早期错误会让后面再好的预测都用不上。

若为了说明问题,假设每一步的条件接受概率都相同,记作 aa,则期望接受数为 a(1−ad)/(1−a)a(1-a^d)/(1-a)。当 aa 不高时,一味增加草稿长度很快遇到收益递减。这个简化模型不是 DART 的实测拟合,也不直接等于候选树的接受规律;它只是把“前缀优先”的原因画清楚。

草稿长度与期望接受数

图 2:按式(2)计算的说明性曲线,假设每个位置具有固定条件接受概率。不是论文实验数据。弱草稿即便继续加长,也可能只增加计算量,几乎不增加最终可提交的内容。

2.3 草稿猜错,为什么仍有可能保持目标分布?

先看最基本的单 token 投机采样。记目标分布为 q(v)q(v),实际提议分布为 p(v)p(v)。从 pp 抽到 token vv 后,以 min⁡(1,q(v)/p(v))\min(1,q(v)/p(v)) 的概率接受。于是,直接接受这个 token 的概率质量是 min⁡(p(v),q(v))\min(p(v),q(v))。总拒绝概率为:

R=1−∑vmin⁡(p(v),q(v))=∑v[q(v)−p(v)]+.(3)R=1-\sum_v\min(p(v),q(v)) =\sum_v[q(v)-p(v)]_+. \tag{3}

拒绝后,若 R>0R>0,从剩余分布 r(v)=[q(v)−p(v)]+/Rr(v)=[q(v)-p(v)]_+/R 中采样。把直接接受和拒绝后补回的质量加起来:

min⁡(p(v),q(v))+Rr(v)=q(v).(4)\min(p(v),q(v))+Rr(v)=q(v). \tag{4}

当 R=0R=0 时不会发生拒绝,也不需要计算剩余分布。这四行说明了一个关键分工:草稿质量决定效率,正确的接受与纠正规则决定最终分布。草稿很差可以导致很慢,却不必导致输出有偏。

不过,式(3)和式(4)解释的是标准链式采样,不能直接当成 DART 任意树验证器的证明。DART 先用并行 logits 与 n-gram 分数做排序和剪枝,得到的分数不自动等于式中的提议概率。温度为零时,可以沿候选路径核对目标 argmax;温度大于零时,则需要与树提议机制相配套的采样、拒绝和回退规则。论文声明保持分布,但没有详细展开这部分树采样推导。笔记应该把这个说明缺口留下,而不是自己补写成作者已经证明过的结论。

3. 一次前向预测多个位置,到底怎样实现?

DART 的草稿模型依赖目标模型已经算出的特征。论文附录 B 选择目标的第 1 层、(N/2−1)(N/2-1) 层和 (N−4)(N-4) 层输出,其中 NN 是目标层数,层编号沿用原文。低、中、高层特征拼接后,经全连接层映射成紧凑表示;随后再拼入移位后的 token embedding。

用第 jj 个位置表示:

gj=Wf[hjlow;hjmid;hjhigh]+bf,zj=[gj;ej+1].(5)g_j=W_f[h_j^{\mathrm{low}};h_j^{\mathrm{mid}};h_j^{\mathrm{high}}]+b_f, \qquad z_j=[g_j;e_{j+1}]. \tag{5}

移位 embedding 包含目标模型已经采到的下一个 token 的信息。接着,在前缀后面追加 d−1d-1 个可学习 MASK 表示。一次定制 decoder 前向产生 dd 个 logits:第一个从最后一个前缀位置读取,后面的从 MASK 位置读取。所以默认八个预测对应七个追加 MASK,而不是小模型串行运行八次。

这里有一个阅读时容易跳过去的索引细节。架构段落把已采到的 next token embedding 放进输入,训练段落又用“给定前缀预测未来 dd 个 token”的相对符号。理解机制时,最重要的是明确每次草稿调用前究竟有哪些 token 已知。若以后给这个方法写严格的接口规范,需要把“已知 token、特征位置、输出预测位置”逐个对齐,不能仅凭简写符号猜测一个偏移约定。

定制 decoder 在前缀内和 MASK 块内都使用因果注意力。后面的 MASK 隐状态可以读取前面位置的表示,但并没有先采出前一个新 token、再拿它触发下一次网络调用。因此,“所有 logits 一次并行得到”和“内部存在因果隐状态传播”并不矛盾。真正被去掉的是草稿模型的多次自回归前向,而不是所有形式的信息依赖。

为什么不直接拿现成 diffusion LLM 当草稿?单次去噪仍可能很贵,独立大模型还可能需要不同 tokenizer。DART 选择紧贴目标模型的单层设计,放弃多步去噪和双向迭代修正,只预测短距离未来。这是一种明确的取舍:先把串行等待压低,再通过候选树和目标验证处理预测的不确定性。

原文把草稿成本描述为不依赖 dd,理由是始终只调用一次。更准确的理解是:串行前向次数不随 dd 增长,但计算量仍会随位置数变化。注意力、词表投影和后续搜索都不是无限免费。尤其把 dd 放大很多时,不能据此推断实际 GPU 时间保持常数。

算法 1:一次推理轮次的概念流程

下面按论文机制重述,不是实际运行记录。

1. 完成目标模型 prefill,或取得上一轮验证结果。
2. 明确已提交前缀与目标模型已采到的下一个 token。
3. 收集有效前缀对应的低、中、高层特征。
4. 特征拼接投影,再与移位 embedding 组合。
5. 追加 d - 1 个 MASK 表示并设置未来位置。
6. 定制因果 decoder 运行一次,得到 d 组 logits。
7. 用算法 3 构造紧凑候选树。
8. 目标模型通过树注意力与有效验证规则检查候选。
9. 提交接受路径及规则要求的纠正或额外 token。
10. 保留已提交前缀状态,丢弃未接受分支。
11. 直到停止条件或输出长度限制触发。

第 10 步提醒我们:DART 减少的是自回归草稿多轮展开带来的状态管理,不是让系统完全不需要 KV cache。目标模型的缓存、已接受前缀的对齐和候选树的注意力关系仍然存在。方法描述中的“简化”应该限定到具体模块。

4. 训练:共享前缀,但不能偷看未来

4.1 稀疏注意力掩码定义了学习任务

如果对每一个前缀单独训练,就会反复处理同一段干净文本。DART 把多个前缀的训练实例装进一次前向:保留共享的干净序列,再为不同前缀建立各自的 MASK 组。每组只能看属于自己的前缀,以及本组内部因果允许的位置;不同 MASK 组之间不能互看。

前缀共享训练的掩码结构

图 3:根据第 3.3 节和附录 B 自绘的简化掩码。蓝色表示允许注意的位置。三个干净位置分别对应两个 MASK 的训练组;实际默认草稿长度更长。图中每组可见的前缀长度不同,跨组位置不可见。

这个约束防止一种非常隐蔽的泄漏:一个较早前缀的未来预测,不能因为干净全文也在同一打包序列里,就直接读到答案。位置编号正确,不代表信息隔离已经正确;同样,掩码隔离正确,位置编号错误也会让模型学习错误的距离关系。这两件事必须分别说明。

附录给出的掩码由三类条件取并集:干净 token 之间的因果注意力、MASK 查询到所属前缀的注意力、同一 MASK 组内部的因果注意力。FlexAttention 利用这个稀疏结构提高执行效率。这里的稀疏性是任务定义本身的一部分,不是把一个本该全连接的双向任务粗略近似掉。

4.2 后面的位置为什么天然更不确定?

教师预测未来第 tt 个位置时,看到了真实的中间 token;草稿模型只看最初前缀和相对位置。设中间内容是随机变量 YY,教师条件分布为 qY(v)q_Y(v),草稿分布为 p(v)p(v)。那么平均前向 KL 可展开为:

EY[KL(qY∥p)]=C−∑vEY[qY(v)]log⁡p(v),qˉ(v)=EY[qY(v)],p∗(v)=qˉ(v).(6)\begin{aligned} \mathbb E_Y[\mathrm{KL}(q_Y\Vert p)] &=C-\sum_v\mathbb E_Y[q_Y(v)]\log p(v),\\ \bar q(v)&=\mathbb E_Y[q_Y(v)],\qquad p^*(v)=\bar q(v). \end{aligned} \tag{6}

CC 与草稿分布无关。在模型容量足够、优化理想的条件下,最优解是不同未来下教师分布的混合。这是根据论文目标做出的解释性推导,不是作者额外报告的定理。

它说明:草稿可以很好地预测“第三个位置总体上可能是什么”,却不保证这个预测与已经挑选的第一、第二个候选 token 完全一致。越往后,可能的中间路径越多。这不是简单扩大模型就必然消失的问题,因为输入中确实缺少当前候选路径的信息。

4.3 位置加权 KL:把训练重点放到更值钱的预测上

DART 使用的损失为:

L=∑t=1dγt−1KL ⁣(qθ(⋅∣x1:n+t−1)∥pϕ(⋅∣x1:n,t)),γ=0.6.(7)\mathcal L=\sum_{t=1}^{d}\gamma^{t-1} \mathrm{KL}\!\left(q_\theta(\cdot\mid x_{1:n+t-1}) \Vert p_\phi(\cdot\mid x_{1:n},t)\right),\quad\gamma=0.6. \tag{7}

把单个位置的 KL 写成教师熵项与交叉熵项,教师固定时前者不对草稿产生梯度。若草稿概率来自 softmax,则对 logit 的梯度是:

∂Lt∂ℓv=γt−1(pv−qv).(8)\frac{\partial\mathcal L_t}{\partial\ell_v} =\gamma^{t-1}(p_v-q_v). \tag{8}

因此位置权重直接缩放每个位置的训练信号。八个位置的权重依次是 1、0.6、0.36、0.216、0.1296、0.07776、0.046656、0.0279936,总和 2.4580096;前三个位置拿到约 79.74% 的总权重。这些数字是按公式计算的,不是训练后统计出的注意力重要性。

这里“annealed”的含义是随未来位置衰减。这个公式没有表示 γ\gamma 在训练时间上不断改变,也不是推理采样温度。另一个容易混淆的参数是训练学习率,它确实采用 cosine schedule,但属于优化器日程。

位置权重与 gamma 消融

图 4:左侧为按式(7)计算的权重;右侧为论文表 4 中 Qwen3-4B 在 HumanEval 上的接受长度。计算示意和实验测量分开放置。0.6 是表中最好点,但原表没有误差条。

算法 2:前缀共享训练的概念步骤

1. 取得干净训练序列,以及目标模型的教师输出。
2. 收集指定层特征并构造移位 embedding。
3. 为每个有效前缀建立未来 MASK 预测组。
4. 按该前缀对应的预测距离分配位置。
5. 干净 token 之间使用因果注意力。
6. 每个 MASK 组只看自己的前缀和本组因果位置。
7. 使用稀疏注意力运行轻量草稿层。
8. 将每个未来偏移的预测与相应教师分布对齐。
9. 第 t 个位置的前向 KL 乘以 gamma^(t - 1)。
10. 排除 padding 和无效目标,汇总损失并更新草稿。

附录 B 报告约 28 万条过滤后的 ShareGPT 与 UltraChat 数据,context length 6400,训练三轮,AdamW 学习率 2×10−52\times10^{-5},梯度裁剪 0.5,betas 为 (0.9,0.999)(0.9,0.999)。FC、decoder、LM head 与 MASK 表示可训练,共用 embedding 冻结;训练使用八张 H20-3e。

这些设置也解释了为什么“只有一个 decoder 层”不等于完整参数量或训练成本很小:词表输出头同样参与训练。论文没有给出全面的等训练预算比较,所以不能自行把结构轻量推导成训练成本一定低于所有其他方案。上述伪代码用于理解方法,不代表已经运行训练或验证作者实现。

5. 从并行边缘分布到可验证的候选树

5.1 单个位置预测得好,拼起来仍可能不通顺

用一个刻意简化的例子看这个问题。假设两个位置的真实联合分布只支持“red apple”和“blue berry”,两者概率各为 0.5。第一个位置的边缘分布是 red、blue 各一半,第二个位置是 apple、berry 各一半。若直接把两个边缘分布相乘,就会得到四种组合,每种概率都是 0.25,其中一半概率落到了原联合分布不支持的路径上。

边缘分布无法自动保留路径相关性

图 5:人为构造的二位置例子,不是论文实验。左侧联合分布只支持两条路径;右侧把相同边缘分布独立相乘后产生了额外组合。它说明的是相关性缺失,不是在评价真实语言中某个词组是否合理。

DART 的后续位置 logit 没有随着当前候选路径重新运行一次神经网络,所以正面临这种信息缺口。因果 MASK 能规定信息流向,但同组前面的 MASK 并不等于已经选出的具体 token。把掩码设计和候选条件化混为一谈,会高估草稿层对路径依赖的表达能力。

作者选择在 CPU 端补入 n-gram 分数。对于相同的未来偏移,神经网络给不同分支提供同一套候选 logit;不同分支拥有不同的近期 token,上下文对应的 n-gram 分数则不同。于是局部路径依赖重新进入筛选过程。这是理解整套方法最关键的连接点:神经网络提供有希望的候选集合,统计索引帮助决定哪些组合值得交给目标模型验证。

5.2 组合空间为什么需要两层预算?

默认草稿长度为 8,每个位置取 top-25。若穷举所有组合,就有 25825^8 条路径,显然不能全部送进目标模型。DART 每层保留至多 20 条活跃路径,最后再从累积节点中选出至多 59 个验证节点。这里“路径宽度”和“节点预算”不是同一回事:不同路径可能共享祖先,而一次目标前向的工作量更直接地受节点数影响。

设候选数为 kk、深度为 dd、beam 宽度为 ww,候选扩展次数的一个上界为:

Nexpand≤k+(d−1)wk=25+7×20×25=3525.(9)N_{\mathrm{expand}}\le k+(d-1)wk =25+7\times20\times25=3525. \tag{9}

这是扩展次数,不是去掉公共前缀后的独立节点数,也没有包括 top-k、排序和树张量组装。它解释了算法为何避开指数级枚举,却不能用来声称整个搜索阶段没有成本。即使神经草稿只运行一次,扩大候选数和树宽仍会增加 CPU 与目标验证的负担。

5.3 排序公式究竟在偏好什么?

附录 D 的增量分数可以写成:

Δsℓ=0.9ℓlog⁡(pℓ(v)+ϵ)+0.5log⁡(g(v∣c)+ϵ)(ℓ+1)0.7,snew=sparent+Δsℓ.(10)\Delta s_\ell= \frac{0.9^{\ell}\log(p_\ell(v)+\epsilon) +0.5\log(g(v\mid c)+\epsilon)}{(\ell+1)^{0.7}}, \quad s_{\mathrm{new}}=s_{\mathrm{parent}}+\Delta s_\ell. \tag{10}

pℓ(v)p_\ell(v) 来自草稿在该偏移的预测,g(v∣c)g(v\mid c) 来自候选近期上下文的 n-gram 统计。这里沿用附录的深度记号,不自行推定程序内部采用从零还是从一开始的编号。随着深度增加,神经预测的权重乘上 0.9ℓ0.9^\ell;n-gram 项先乘 0.5,再与神经项共同除以深度因子。后者减小后续扩展的负分惩罚,有助于避免排序天然只偏好短路径。

对增量分数取指数,可以更直观地看到两个信息源如何结合:

exp⁡(Δsℓ)=(pℓ(v)+ϵ)0.9ℓ/(ℓ+1)0.7×(g(v∣c)+ϵ)0.5/(ℓ+1)0.7.(11)\begin{aligned} \exp(\Delta s_\ell) &=(p_\ell(v)+\epsilon)^{0.9^{\ell}/(\ell+1)^{0.7}}\\ &\quad\times(g(v\mid c)+\epsilon)^{0.5/(\ell+1)^{0.7}}. \end{aligned} \tag{11}

这类似两个专家分数的乘积,指数随深度变化。但“类似概率乘积”不等于已经得到完整候选树的规范化概率分布。该分数服务于排序;采样正确性仍要由目标模型的验证和修正程序承担。不能把这个排序分数直接当成前面拒绝采样公式中的提议概率。

还有一个容易忽略的问题:选中深层节点时,它的祖先必须也存在。如果每次增加的对数分数非正,祖先分数不低于后代,按全局分数筛选便有利于保留前缀。但公式加入了 ϵ\epsilon,概率极接近 1 时,对数项可能略为正;相同分数的处理也影响结果。因此,祖先闭包应该是树表示明确保证的条件,不能只靠一个没有写全的排序惯例。论文没有展开所有边界情况,这属于方法描述的留白,不能据此断言发生了某种错误。

算法 3:用局部连续性筛选候选树

1. 初始化活跃路径 C = {(当前前缀, 分数 0)},累积节点 T = {}。
2. 依次处理未来偏移 i = 1, ..., d。
3.     从偏移 i 的并行 logit 中选择 top-k_i 个 token。
4.     对每条活跃路径,查询其近期上下文的 n-gram 子节点分数。
5.     用候选 token 扩展路径,并按式(10)累加分数。
6.     将扩展结果加入临时集合,同时记录到 T。
7.     保留分数最高的 w 条扩展作为下一层活跃路径。
8. 按论文规则,从累积的 T 中选择至多 theta 个节点。
9. 将节点表示成祖先有效、注意力关系正确的验证树。
10. 由目标模型验证,并按有效的接受与回退规则推进序列。

前八步概括论文算法 1,最后两步明确候选树交给验证器时需要满足的条件。它没有增加一个作者未报告的神经网络。对同一偏移的不同路径,top-k 集合相同,变化的是 n-gram 分数。三元统计能改善局部衔接,但不能一般性地约束跨越很多 token 的变量绑定、数学推理或论证关系。

6. CPU 索引不是免费的附属品

附录 C 使用 Dolma 3 Mix 构建 trigram trie,并根据 Qwen3 或 LLaMA2 的 tokenizer 建立相应索引。报告的规模约为 13 亿节点,磁盘文件约 43.5 GB,推理时常驻 CPU 内存约 100 GB。这三项描述的是节点数量、序列化体积和运行内存,不能互相替换。按十进制单位粗算,每节点平均约占 77 字节;这是总量相除的估计,无法反推出内部存储布局。

查询时可以先定位上下文节点,再一次获得候选子 token 的分数。按照默认深度和 beam 宽度,一轮最多有 1+(d−1)w=1411+(d-1)w=141 个活跃上下文需要查询。把它乘以论文给出的约 6 微秒热查询耗时,得到 0.846 ms。这只是顺序执行查询服务时间的示意计算,不是完整搜索延迟的预测。

为什么完整搜索会更慢?还要取 top-k、计算组合分数、筛选候选、处理共享前缀、准备验证输入。另一方面,多线程又可能使部分查询并行。因此,不能把单查询基准简单相乘后,当成端到端结果。论文的 Qwen3-14B 示例中,实际树搜索阶段约为 2.0 ms,这才是该配置下更直接的系统指标。

作者提到 CPU 并行,以及让索引和工作线程绑定到同一 NUMA 节点。可以把 NUMA 理解为多路服务器上的“内存有远近”:访问本插槽关联的内存与跨插槽访问,成本并不相同。在拥有 900 GB 内存的机器上,预热且位置合理的索引可能很快;放到内存受限容器或高并发服务中,缓存失效、争抢和跨插槽流量就可能改变结果。

共享索引是很有价值的部署思路,但“多个进程可以共享”与“并发扩展成本已被证明很低”是两回事。共享物理页、同时查询的内存带宽、冷启动加载和不同 tokenizer 的索引副本,分别占用不同资源。论文没有给出完整的多租户容量实验,因此我会把稳定运行和冷启动分开评估。解码很快不意味着新实例启动也快。

替代方案各有代价。缩小通用索引能省内存,却可能降低覆盖率;专用领域索引可能更适合代码,也可能在其他领域失效;压缩节点能减少体积,却可能增加解码开销;把索引搬到 GPU 会和权重、KV cache 竞争显存;训练一个小型连续性模型可以省去巨大的语料 trie,却重新引入模型计算。DART 展示了其中一个明确可行的工作点,还没有画出整条内存—延迟—接受率边界。

7. 从 6.8 倍草稿加速到真实的每轮成本

论文图 5 给出了 Qwen3-14B 的阶段耗时。DART 的目标验证、草稿前向、树搜索分别为 27.8、1.5、2.0 ms;EAGLE3 对应为 27.8、10.2、3.6 ms。SPS 的验证为 26.3 ms、草稿为 80.0 ms,但草稿长度为 5,而另外两种方法为 8。后者可以作为成本诊断,不能被描述成只改变架构、其他条件完全相同的对照。

每轮耗时分解

图 6:按论文图 5 重绘。柱状图展示每轮各阶段耗时。SPS 使用不同的草稿长度,比较时应保留这一条件。

只看神经草稿,比例是 10.2/1.5=6.810.2/1.5=6.8;把树搜索也计入草稿侧,变成 13.8/3.5≈3.9413.8/3.5\approx3.94;再加目标验证,整轮比例是 41.6/31.3≈1.32941.6/31.3\approx1.329。三个数字都能成立,因为它们的分母范围不同。写成“DART 端到端快了 6.8 倍”就把关键成本漏掉了。

一轮更快还不是全部,还要看这一轮推进了多少。暂用表中的接受长度作为共同口径,可以做一个解释性估算:

SDSE≈3.673.4841.631.3≈1.40.(12)\frac{S_D}{S_E}\approx \frac{3.67}{3.48}\frac{41.6}{31.3}\approx1.40. \tag{12}

表中平均加速比的比例是 2.77/2.02≈1.372.77/2.02\approx1.37。二者不完全相等并不直接构成矛盾:阶段耗时图与跨任务表格涉及聚合,均值的比例也不必等于比例的均值。这里的计算只说明“每轮变便宜”和“每轮多推进一点”两个因素相乘,不能冒充对原实验的重新测量。

DART 示例中,验证占整轮 27.8/31.3≈88.8%27.8/31.3\approx88.8\%。在接受进度固定的假设下,即使把剩下的草稿和搜索成本全部删除,额外收益上限也只有 31.3/27.8≈1.12631.3/27.8\approx1.126。这就是一个简单的 Amdahl 式推理:把一个阶段优化得足够快之后,下一个阶段会成为瓶颈。继续只盯着草稿层,可能已经不是最有价值的方向。

对“更准但更贵”的改动,可以得到一个通用判断式。原方案每轮推进 MM 个 token、耗时 TT,新方案分别增加 ΔM\Delta M 和 ΔT\Delta T。在分母为正时:

M+ΔMT+ΔT>MT⟺ΔMM>ΔTT.(13)\frac{M+\Delta M}{T+\Delta T}>\frac MT \quad\Longleftrightarrow\quad \frac{\Delta M}{M}>\frac{\Delta T}{T}. \tag{13}

也就是说,进度的相对增长必须超过时间的相对增长。扩大树、拉长草稿、增加更强的连续性模型,都应经过这个标准。接受长度是重要的中间指标,却不是最终目标;它必须与完整计算预算一起讨论。

8. 主实验支持多大的结论?

主实验机器配置包含八张 141 GB H20-3e、90 个 CPU 核和 900 GB 内存。这里应准确理解为实验服务器配置,不能据此写成“每一个推理目标都用了八张卡”。附录 F 则明确给出单张 A100-40G 的实验。主表默认 batch 为 1,覆盖对话、指令、数学、代码等七个测试集。

Qwen3 系列平均加速比

图 7:按论文表 1 重绘,batch 1、温度 0,在七个任务上的平均加速比。每个目标模型分别以自己的普通自回归解码为基线,不能据此比较不同模型的绝对吞吐量。

Qwen3-1.7B、4B、8B、14B、32B 上,DART 的平均加速比分别为 2.61、2.87、2.71、2.77、2.42;EAGLE3 分别为 2.01、2.12、2.20、2.02、2.11。逐对相除,DART 的相对优势约为 29.9%、35.4%、23.2%、37.1%、14.7%。这些相对优势再取简单平均约为 28.1%,与论文“约 30%”的总体表述接近。但这是根据展示值重新计算的口径,不应冒充作者对全部原始样本的聚合方式。

最醒目的例子来自 Qwen3-14B 的 CodeAlpaca:3.44/2.08−1≈65.4%3.44/2.08-1\approx65.4\%。另一个例子却小得多:Qwen3-32B 的 Math500 是 2.46/2.31−1≈6.5%2.46/2.31-1\approx6.5\%。这提醒我们,代码中的局部模式、目标规模与运行成本会共同影响收益。一个最佳样例不能直接转成服务级承诺。

摘要的 2.03–3.44 倍区间也不覆盖整张表的每个单元格。Qwen3-4B 在温度 0 的 CodeAlpaca 上有 3.45 倍;Qwen3-32B 在温度 1 的 Alpaca 上有 1.84 倍。因此讨论某个具体工作负载时,应回到对应表格,而不是用摘要区间替代。把这种范围差异如实保留,比替作者悄悄统一数字更有价值。

温度 1 时,Qwen3-14B、32B 的 DART 平均加速比分别为 2.47 和 2.19,EAGLE3 为 1.89 和 1.97。这说明收益不只出现在贪心解码。但速度表不能替代采样分布保持性的具体说明。论文以输出分布保持为理由,没有额外比较生成质量;在验证器正确的前提下可以理解,因此更需要把树采样的正确性条件讲清楚。

LLaMA2-Chat-7B 的比较包括 PLD、Lookahead、Medusa 和 Hydra。DART 平均为 2.85 倍,Hydra 为 2.66 倍。Qwen3 上没有把所有这些方法都放到同样的设置下,作者说明了兼容性约束。因此不宜把各模型族的表格合并成“每个方法在每个模型上都做了统一比较”的排行榜。可用基线决定了证据范围。

9. 消融实验:支持了哪些设计,又留下了什么?

n-gram 与移位预测的消融

图 8:按论文表 2–3 重绘。左图是有无 n-gram 时的接受长度,右图是移位与否的单位置 hit@1。它们度量不同对象,都不能单独等同于实际加速比。

加入 n-gram 后,HumanEval 接受长度从 3.13 到 3.63,Alpaca 从 2.76 到 3.26,Math500 从 2.89 到 3.37,CodeAlpaca 从 3.85 到 4.59。相对增加约为 16.0%、18.1%、16.6%、19.2%。这确实支持局部连续性筛选有效,但表 2 的标题没有交代所有配置细节,不能给它补上未说明的控制变量。

移位预测在 Qwen3-4B 上,把第一个未来位置的 hit@1 从 57.7% 提高到 71.1%,即增加 13.4 个百分点。注意它不是“相对增加 13.4%”。第二、第三个位置分别由 38.1% 到 41.0%、25.1% 到 27.6%。前三个位置的 top-10 覆盖率则达到 93.2%、76.7%、65.9%。这能解释为什么保留多个候选有意义,但 top-10 覆盖高并不保证这些 token 能拼成一条同时被接受的路径。

位置权重的消融更有启发性。γ=0.5\gamma=0.5 时第一位置准确率最高,为 76.2%,但接受长度只有 3.59;γ=0.6\gamma=0.6 时第一位置准确率稍低,接受长度反而达到 3.63。只优化第一个位置,就会错过这组实验中整体更好的平衡。与此同时,两者差距不大,原表没有置信区间或多随机种子方差,因此 0.6 应理解为有经验支持的默认值,而不是普遍最优常数。

这些消融还没有拆开所有交互。例如,更宽的树可能弥补弱一些的单位置 logit;节点预算变小时,第一位置的精度可能更加重要;n-gram 分数的价值也可能随领域和温度而改变。理想的后续研究可以交叉改变移位方式、KL 衰减、n-gram 权重、beam 宽度与验证节点数。当前结果说明组件在给定配置下有帮助,还不能说明它们在所有预算下都产生相互独立、可直接相加的收益。

10. batch 和硬件会改变是否值得使用的答案

不同 batch 下的收益

图 9:按论文表 6–7 重绘,实线为 DART,虚线为 EAGLE3。Qwen3-4B 在 batch 64 时仍保留明显收益,Qwen3-8B 则接近普通解码。

在 batch 64 时,Qwen3-4B 的普通解码、EAGLE3、DART 吞吐量分别为 370.0、453.3、538.7 tokens/s;Qwen3-8B 对应为 360.3、356.4、366.1 tokens/s。后一组直接相除得到 DART 约 1.016 倍、EAGLE3 约 0.989 倍,表中展示为 1.01 和 0.98。可见展示精度或聚合细节不足以逐位还原比值,但结论不受影响:8B 在该 batch 下的优势已经很小。

原因可以从资源利用率理解。batch 增加后,普通自回归解码本身能更充分地利用矩阵计算能力,原先可以容纳额外候选验证的空余算力减少了。验证树仍会增加目标模型的计算位置;草稿更快并不能把这部分工作变成免费。于是是否启用投机解码,应该依赖实际负载,而不只是模型名称。

对于服务系统,一个合理方向是根据 batch 占用和近期接受率,在普通解码与投机解码之间切换。不过这个切换器本身也要计入成本,并避免短时间波动造成频繁切换。论文的静态 batch 实验支持“收益依赖负载”这一判断,还没有验证一个完整动态调度策略。

单张 A100 上的结果

图 10:按论文表 8 重绘,单张 A100-40G、温度 0。这里是在各自硬件内部相对普通解码的归一化加速,不能据此推断 A100 与 H20 的绝对吞吐量高低。

A100 上,Qwen3-1.7B、4B、8B、14B 的 DART 平均加速比为 2.74、2.83、2.83、2.84;EAGLE3 为 2.21、2.22、2.33、2.19。这拓宽了证据,说明收益不只出现在一种 GPU 上。但“硬件无关”仍是更强的说法:两类 GPU 配合某种主机环境,并不能覆盖消费级内存容量、不同 NUMA 拓扑、其他 attention kernel 和大模型张量并行配置。

真正用于部署判断时,我会同时看吞吐量、延迟分位数和内存,而不是只看固定 batch。真实请求有到达过程、长短不一的输出、排队、prefill 干扰和前缀复用。长输出能够摊薄启动开销,短输出则未必。指出这些变量不是否定实验,而是给实验结论划定适用范围。

11. 局限与失败边界

第一类边界是目标模型耦合。DART 需要中间层特征、匹配的 tokenizer 和经过训练的草稿模型;只提供文本或 token 概率的黑盒 API,并不能直接套用。目标模型升级后,特征分布可能变化,需要重新评估草稿对齐。论文主要研究选定的稠密 Qwen3 与 LLaMA2-Chat-7B,不能默认相同收益会直接迁移到 MoE 或混合循环结构。

第二类边界是统计覆盖。通用语料的 trigram 能提供常见语言与代码片段的局部线索,但罕见标识符、专门领域符号、不寻常格式和分布变化,可能让这些线索变弱。只要目标验证保持正确,这种失败主要表现为接受率下降、计算浪费或加速减少,而不是必须导致输出质量变差。要把提议质量与最终目标分布分开讨论。

第三类边界是资源规模。约 100 GB 常驻 CPU 内存,在大服务器上可以接受,在小型推理节点上可能不可行。冷加载、多个 tokenizer 索引、其他任务争抢以及跨插槽访问,都可能增加完整成本。论文报告的热查询不能回答全部情况,训练和索引建设成本也没有包含在解码加速比中。

第四类边界是描述和统计粒度。多项结果只给点估计,没有误差条;接受长度的精确定义、采样树验证的完整细节、分数边界情况,以及主实验每项具体 GPU 分配,没有全部展开。这些留白影响我们能做多强的推论,但并不是观测到的故障。阅读时既不应忽略,也不应把它们升级成未经证明的问题。

最后,研究在特定时间、兼容条件下选择了基线,没有与所有后续并行草稿方法做统一预算比较。把 DART 与其他方法放在一起讨论,有助于理解设计空间;要判断谁更快,则需要匹配目标模型、数据、硬件、采样规则与资源预算。名字都含“diffusion”,并不代表掩码、教师对齐和验证树相同。

12. 独立批判性分析

12.1 我更看重的是依赖关系如何分工

DART 最值得借鉴的地方,是把不同依赖分给不同成本的组件:目标特征支撑便宜的边缘预测,主机统计结构恢复一部分局部路径关系,最后由目标模型处理剩下的不确定性。其意义不依赖“扩散”这个标签是否足够吸引人。一个依赖如果用便宜的统计机制就能改善候选排序,就未必值得为它再运行一遍神经网络。

反过来,也不应把 trigram 说成全局语义规划器。三个 token 的统计关系,通常无法保证长程变量一致性或多步论证成立。更准确的表述是:短上下文连续性改善了送入目标模型的候选集合。这个结论看似克制,却有清楚的消融支持,也更容易迁移到其他系统设计。

12.2 双向草稿不天然破坏精确采样

论文用因果草稿对比双向扩散生成,这个工程选择有道理:已知前缀是可靠的事实上下文,多轮去噪又可能昂贵。但从采样理论看,提议机制内部允许 MASK 或候选未来位置双向交流,并不自动意味着最终输出偏离目标分布。

真正关键的是两件事:提议过程不能使用推理时根本不可得的真实未来;验证和修正规则必须对实际提议机制有效。只要满足这些条件,非因果草稿未必不精确。因果掩码有助于 DART 对齐训练和推理、简化结构,但不能从中推出“所有双向草稿都不可能保持目标分布”的普遍定理。

同样,n-gram 排序可以非常有用,却不承担最终正确性的证明。单 token 拒绝采样的质量守恒推导,不能直接代替一个经过确定性剪枝的多分支树验证证明。把这两个层次分开,能让读者理解哪些结论来自算法规则,哪些来自实验表现。

12.3 节点的价值应按额外进度与额外成本衡量

固定 (d,k,w,θ)=(8,25,20,59)(d,k,w,\theta)=(8,25,20,59) 方便控制变量,也适合展示基本方法。但在线服务中的最佳预算可能随前缀不确定性、GPU 占用和主机延迟变化。给一条高概率路径多延长一层,与在早期新增一个分支,增加的接受机会并不相同;它们的验证成本也不一定相同。

一个值得探索的目标,是按“预计增加的提交 token 数减去资源成本”选择扩展节点。例如,给扩展 uu 定义概念性的效用:

U(u)=ΔE[M]^(u)−ηVΔTV^(u)−ηSΔTS^(u).(14)U(u)=\widehat{\Delta\mathbb E[M]}(u) -\eta_V\widehat{\Delta T_V}(u) -\eta_S\widehat{\Delta T_S}(u). \tag{14}

这是本文提出的分析方向,不是 DART 的原算法或已验证结果。两个系数反映系统所处工作点,预测量也需要校准。比较时应保持目标输出规则一致,并把预算控制器自己的运行成本计入。如果为了决定哪些节点值得验证,耗时已经超过省下的验证成本,那么这个控制器就没有达到目的。

12.4 下一组实验应画出完整资源边界

我会首先固定目标验证节点数,改变索引容量、覆盖范围与 n-gram 阶数,同时报告内存、冷启动、热查询、整轮搜索、接受长度和端到端速度。这样才能判断 100 GB 是否是获得当前收益的必要条件,还是一个方便实现的选点。只报告接受长度,会隐藏用多少资源换来了它。

第二步是把领域和资源压力交叉起来:代码、普通对话、数学文本和罕见领域标识符,分别在独占主机与并发 CPU 负载下运行。这个实验直接检验 DART 特有的前提——局部统计是否仍然既便宜又有用。索引语料和 tokenization 也应写清楚,才能解释代码场景较大的优势,而不是把它笼统归因于“语义能力”。

第三步是更明确地描述采样验证:剪枝后的候选过程是什么,接受规则是什么,拒绝时如何回退,祖先如何保留,温度在哪里作用。一个小词表上的解析例子,就能让分布质量如何守恒变得清晰。这类说明不需要依赖某份源码,是方法本身应当能提供的可检查论证。

13. 结论:把一轮的账算完整

DART 给出了一个具体而有用的答案:用一次并行草稿前向削减串行等待,再用局部统计选择更值得验证的路径。实验支持它在单请求、小 batch 下带来显著加速,代码生成有一些很强的例子;同时,高 batch 和主机资源成本也清楚地限制了适用范围。

我的核心收获不是记住一个最大的加速数字,而是同时追踪四件事:草稿前向用了多久、候选树用了多久、目标验证用了多久、这一轮到底提交了多少 token。把这四项放在同一张账上,才能看懂为什么接受长度不是越高越好,也才能判断“再增加一个组件”是否值得。

落到应用选择,我会依次确认目标特征是否可取、主机内存与 NUMA 是否合适、当前负载是否还有验证余量、采样保持性是否对具体树过程成立,以及收益是否经得起真实请求长度和到达分布。这些问题得到肯定答案后,DART 才从一个漂亮的 batch-one 实验,变成适合当前服务的技术选项。

本文解释和分析论文报告的方法与测量。附加公式、算术比较、示意分布和研究建议均已注明性质,没有声称完成新的训练、推理基准或实验复现。

参考资料与证据位置

  • Liu 等,DART,arXiv:2601.19278v1,2026-01-27。完整阅读 15 页正文与附录 A–G。第 3–4 节支持架构、损失和剪枝解释;图 5、表 1–8 支持文中数值;附录 B–D 支持训练与索引细节。
  • Leviathan、Kalman、Matias,Fast Inference from Transformers via Speculative Decoding。用于理解接受与修正机制,本文式(3)–(4)给出了自足的单 token 推导。
  • DART 官方资源入口,由论文链接,供进一步查阅。
  • 图 1–3、图 5 为原创解释图;图 4 将按公式计算的权重与表 4 测量并列;图 6–10 按注明的原表、原图重绘。式(1)–(4)、(6)、(8)–(9)、(11)–(14)属于解释性推导或独立分析,均不代表新增实验结果。