Fast-dLLM 阅读笔记:双向模型怎样复用缓存,又该一次填几个词?

阅读日期: 2026-09-30
笔记作者: Zhongzhu Zhou
论文题名: Fast-dLLM: Training-free Acceleration of Diffusion LLM by Enabling KV Cache and Parallel Decoding
论文作者: Chengyue Wu, Hao Zhang, Shuchen Xue, Zhijian Liu, Shizhe Diao, Ligeng Zhu, Ping Luo, Song Han, Enze Xie
版本与日期: arXiv:2505.22618v3,2025-07-03;首次提交 2025-05-28
资源: 论文 PDF · 作者项目页 · 官方仓库入口

1. 我最关心的不是一次预测多少词,而是哪些工作可以省

扩散语言模型有一个很吸引人的能力:面对一排空白,它可以一次给出多个位置的预测。可是,“能够同时预测”与“能够快速得到一段正确答案”之间,还有两道坎。第一,模型会反复处理大量看起来没有变化的位置;第二,每个位置各自最有可能的词,拼起来不一定是最合理的一组词。

Fast-dLLM 分别处理这两件事。它让一部分 key/value 表示在若干次前向计算之间复用,到合适的时机再刷新;它也不再机械地规定每一步必须填几个词,而是根据当前置信度决定哪些位置可以一起落笔。这两项改动都不要求重新训练原来的扩散模型。论文用 LLaDA、Dream 和一个视觉扩散模型说明,这个思路能够带来实质性的推理加速。

我认为读这篇论文最有用的视角,是把它看作两种近似的组合。第一种近似认为:刚才算出的表示现在仍然够用。第二种近似认为:这几个位置足够确定,可以暂时忽略它们之间的依赖。两种近似会互相影响,因为缓存过时本身就可能改变模型的置信度。理解这个关系,比记住一个最大的倍数更重要。

论文最醒目的 27.6 倍吞吐提升,来自八样本提示的 GSM8K、长度 1,024 的输出配置,以及 DualCache 加并行解码。吞吐从每秒 0.7 token 提升到 19.3,准确率从 77.3 变为 76.0。它说明原生扩散解码在这种形状下有大量可以省掉的工作,同时也提醒我们:这个数字带着特定基线、特定任务和一定的质量变化,不能直接等同于所有扩散模型都比优化后的自回归服务快 27.6 倍。

以下笔记先把计算过程讲清楚,再拆开数学保证和实验证据。图中的论文数值都注明出处;我构造的概率例子、成本示意和后续实验建议则单独标明,不把推导或设想当作复现结果。

2. 前置知识:扩散解码与 KV cache 到底在做什么

设提示长度为 P,答案长度为 L。掩码扩散模型开始时看到的是提示和 L 个 MASK,然后不断预测还没有填好的位置。与从左到右的因果模型不同,双向注意力允许一个位置利用左右两侧已经可见的内容。于是,某个 token 的输入 ID 没变,并不代表它在每一层的隐藏表示也没变。

一个简单的前向加噪过程,是以概率 t 把每个干净 token 独立替换为 MASK。用 x_0 表示干净序列,x_t 表示加噪结果,可以写成:

qt(xt∣x0)=∏i[(1−t)1{xti=x0i}+t1{xti=MASK}].(1)q_t(x_t\mid x_0)=\prod_i\left[(1-t)\mathbf 1\{x_t^i=x_0^i\}+t\mathbf 1\{x_t^i=\mathrm{MASK}\}\right]. \tag{1}

t=0 对应原文,t=1 对应全部被遮住。训练时,模型学习从部分可见的上下文恢复被遮住的词。生成时,还需要一个解码策略:这次相信哪些预测,要不要全部填进去,剩下多少位置留给下一次。这是模型能力与使用策略的区别。模型一次能预测很多位置,策略仍然可以保守地只选一个位置。

对于 s<t 的反向过程,已经显露的 token 保持不变;仍然是 MASK 的位置,则以 s/t 的概率继续保持 MASK,否则按去噪器的预测填入:

pθ(xsi∣xt)={δxti,xti≠MASK,stδMASK+(1−st)pθ(x0i∣xt),xti=MASK.(2)p_\theta(x_s^i\mid x_t)= \begin{cases} \delta_{x_t^i}, & x_t^i\ne\mathrm{MASK},\\ \frac{s}{t}\delta_{\mathrm{MASK}}+\left(1-\frac{s}{t}\right)p_\theta(x_0^i\mid x_t), & x_t^i=\mathrm{MASK}. \end{cases} \tag{2}

Fast-dLLM 根据置信度安排填词次序,因此不应把它理解成对原有每一步随机转移的完全等价加速。文中的算法一旦填入某个词,并没有在以后重新遮住它、反复修改的机制。早期决定会成为后续预测的上下文,错误也可能沿着这个过程继续传播。

再看注意力。查询 Q 与键 K 计算相关程度,然后用权重混合值 V:

Attn⁡(Q,K,V)=softmax⁡(QK⊤d)V.(3)\operatorname{Attn}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt d}\right)V. \tag{3}

KV cache 存下的是部分位置的 K 和 V,避免每一步都重新生成它们。缓存并没有让这些位置从注意力中消失。当前 query 仍然可能读取整个缓存前缀,计算相关性并聚合值。因此,“只重新处理 32 个 token”不能直接推成“全部计算量只剩原来的 32/L”。

自回归模型之所以能放心缓存,是因为因果掩码提供了很强的性质:在序列后面新添一个词,不会改变前面位置的表示。双向模型没有这个性质。当答案中新露出一些词,连提示部分的表示也可能改变。Fast-dLLM 所依赖的是经验上的短期稳定性,而不是因果结构带来的精确不变性。这也是整篇论文最重要的前提之一。

3. 两种缓存:冻结哪些表示,多久刷新一次

论文把答案分成若干块,主实验通常使用 32 个 token 一块。当前块内部可以进行多轮填词;在块边界更新缓存。块越小,越常有机会刷新表示,但每次刷新能摊薄的重复计算也越少。块大小同时影响速度和生成轨迹,不只是一个纯粹的内存管理参数。

PrefixCache 缓存提示和已经完成的答案前缀。在填当前块的时候,当前块以及它后面的掩码后缀仍然重新计算。DualCache 进一步把后缀的 K/V 也保存下来,于是新计算主要集中在当前块。两者都允许当前 query 读取缓存区域;区别是哪些区域的表示在这一轮重新生成。

图 1:两种缓存的解释性示意。蓝色位置复用 K/V,橙色位置重新计算。当前 query 仍然可以读取缓存上下文;缓存表示在块边界刷新。

容易忽视的是,后缀全部还是 MASK,并不等于后缀表示不会变化。MASK 位置也在读其他位置的内容。当前块新填进去一个词之后,后缀的上下文就变了。DualCache 选择暂时忽略这种变化,所以它既能比 PrefixCache 省下更多计算,也承担了更强的近似。

论文用相邻解码步骤的 K/V 余弦相似度展示表示稳定性。这对提出方法很有说服力,但不能直接当作输出误差的上界。两个表示很相似,仍然可能让两个分数接近的候选词交换排名;表示变化较大,也未必改变最后选出的词。真正与质量相关的问题,是表示变化如何影响即将被提交的位置,而不只是所有位置的平均相似度。

算法 1:按块进行缓存解码

下面把论文流程中“使用旧表示”和“刷新表示”的时机展开。它是方法级伪代码,不绑定具体程序结构。

输入:提示、答案长度 L、块大小 B、位置选择规则
1. 在提示后面追加 L 个 MASK。
2. 用完整上下文初始化 K/V 表示。
3. 从左到右遍历答案块:
4.   只要当前块还有 MASK:
5.     PrefixCache:重新计算当前块与后缀。
6.     DualCache:只重新计算当前块。
7.     当前 query 同时读取新计算和缓存的 K/V。
8.     得到候选 token 及其置信度。
9.     用算法 2 或算法 3 选择待填位置。
10.    同时填入选中的 token。
11.  进入下一块之前刷新缓存区域的表示。
12. 返回完成的答案。

刷新不能只理解为把刚生成的 token ID 接到缓存末尾。它需要让缓存区域的表示重新感知更新后的上下文。否则很早的提示表示会一直停留在最初的掩码状态。后面讨论视觉模型时,还会看到块大小和刷新频率需要分开设计:限制哪些位置可以填,与允许表示陈旧多久,是两个不同问题。

4. 为什么各位置“最可能”的词,合起来可能不是最可能的答案

我用一个两位置、二元词表的例子说明这个问题。假设正确联合分布是:

p(0,0)=0.32,p(0,1)=p(1,0)=0.34,p(1,1)=0.(4)p(0,0)=0.32,\quad p(0,1)=p(1,0)=0.34,\quad p(1,1)=0. \tag{4}

单独看第一个位置,0 的概率是 0.66;第二个位置也是如此。若每个位置各自贪心,最后就会得到 (0,0)。但联合分布中,(0,1) 和 (1,0) 都比 (0,0) 更可能。更极端一点,如果按两个边缘分布独立采样,还会生成 (1,1),而原联合分布认为这个组合根本不可能。

两个边缘分布相乘之后,四个组合的概率分别变为 0.4356、0.2244、0.2244 和 0.1156。这个乘积分布与原联合分布的总变差距离是 0.2312:把四个绝对概率差相加,再除以二即可得到。这是我构造的解释性例子,不是论文测出的误差。它说明即使边缘概率本身完全正确,也不能随意丢掉位置之间的依赖。

图 2:自建的两 token 概率例子。边缘乘积改变了概率最高的组合,并给原本不可能的组合分配了概率;图中没有模型实验数据。

Fast-dLLM 的应对方式,是只把足够确定的位置一起填入。这里“足够”不只是排名第一,也与同时提交的位置数有关。机械地每次选前八个位置,可能有时选到 0.99 的预测,有时只能选到 0.55 的预测;两种情况显然不应该被视为同样可靠。

算法 2:阈值筛选与单 token 兜底

即使没有位置达到阈值,也选一个置信度最高的位置,以免生成停住。

输入:剩余 MASK 位置、每个位置的预测概率、阈值 tau
1. 对每个位置 i,选概率最大的 token y_i。
2. 记这个最大概率为 c_i。
3. 选择所有 c_i >= tau 的位置,得到集合 S。
4. 如果 S 为空,只选置信度最高的一个位置。
5. 同时把 S 中各位置填为对应的 y_i。

兜底保证的是算法会向前走,不是保证这个词正确。达到阈值也不意味着答案经过了外部验证。它与投机解码中“先提出草稿,再由目标模型验证并修正”的机制不同:这里直接改变扩散模型的生成轨迹,因此需要通过实际任务质量来判断代价。

5. 定理到底保证什么:把证明一步一步拆开

固定当前上下文 E,考虑要一起提交的 n 个位置。首先假设存在一个自洽的联合分布 p,各位置的边缘概率都来自这个联合分布。再假设每个位置所选 token 的概率都严格大于 1-epsilon。独立近似 q 定义为这些边缘分布的乘积:

q(x∣E)=∏j=1npj(xj∣E),pj(xj∗∣E)>1−ϵ.(5)q(x\mid E)=\prod_{j=1}^{n}p_j(x_j\mid E),\qquad p_j(x_j^*\mid E)>1-\epsilon. \tag{5}

“自洽”不是装饰性限定。它要求这些边缘预测能够属于同一个联合分布。附录 A 明确承认,实际掩码模型未必严格具有这个性质;理论讨论的是理想化分布。如果忽略这句限定,就很容易把一个有条件的概率结论误写成任意神经网络解码器的保证。

第一步,若 epsilon 不超过 1/(n+1),那么各位置的首选 token 都拥有严格超过一半的概率。因此它们分别是唯一的边缘最大值,把它们拼成的 x* 就是 q 的唯一最大值。第二步,利用并集上界控制“至少有一个位置不是首选”的概率:

p(x∗∣E)=1−Pr⁡(⋃j{Xj≠xj∗}∣E)>1−nϵ.(6)p(x^*\mid E)=1-\Pr\left(\bigcup_j\{X_j\ne x_j^*\}\mid E\right)>1-n\epsilon. \tag{6}

这里并没有假设各位置独立。并集上界允许它们有任意依赖,是这个结论能够做最坏情况保证的原因。第三步,对任何不同于 x* 的完整序列 z,总有一个位置 k 与首选不同。整个序列出现的概率,不会超过这个位置出现非首选 token 的概率:

p(z∣E)≤pk(zk∣E)≤Pr⁡(Xk≠xk∗∣E)<ϵ.(7)p(z\mid E)\le p_k(z_k\mid E)\le \Pr(X_k\ne x_k^*\mid E)<\epsilon. \tag{7}

因此,只要 1-n epsilon 至少为 epsilon,就能让 x* 的概率严格高于所有替代序列。整理后得到:

(n+1)ϵ≤1⟹argmax⁡xp(x∣E)=argmax⁡xq(x∣E)=x∗.(8)(n+1)\epsilon\le1\quad\Longrightarrow\quad\operatorname*{argmax}_{x}p(x\mid E)=\operatorname*{argmax}_{x}q(x\mid E)=x^*. \tag{8}

这个推导非常直观:一起做的决定越多,累计出错的空间越大,每个位置就必须更确定。图 3 画的是相应的置信度边界 n/(n+1)。要注意原定理的边缘概率条件是严格大于;实际程序用大于等于阈值筛选时,不能悄悄把这个严格前提也换成等号。

图 3:同时提交的位置越多,充分条件要求的置信度越高。曲线是定理边界;它没有证明网络分数经过校准,也没有证明所有超过 0.9 的位置都能无条件同时提交。

论文把这部分称为贪心解码等价,但展示的等式直接比较的是联合分布最大值和边缘乘积最大值。一般情况下,联合 MAP 与逐步贪心并不是一回事。在这里很强的集中性条件下,可以进一步用条件概率说明逐步选择也会保留这些首选 token:在已经固定若干首选位置后,全首选序列的质量仍足以压过下一个位置选错的事件。但这个补充解释依然依赖相同的联合分布和集中性前提,不能推广成“普通自回归贪心总能找到联合最大值”。

这个界为什么是紧的?可以把概率放在全零串,以及 n 个“恰好只有一个 1”的串上。给全零串 1/(n+1)-eta 的概率,给每个单一 1 串 1/(n+1)+eta/n。总概率仍然为一。eta 为很小的正数时,每个位置边缘上仍偏好 0,但任何一个单一 1 串的联合概率都超过全零串。上一节的二位置反例就体现了这种结构。

5.1 不同位置可以有不同的错误预算

上面的证明还可以推导一个更细的充分条件。假设位置 j 的非首选概率是 epsilon_j。则全首选序列概率至少为 1 减去这些错误概率之和,而任何替代序列的概率至多为最大的 epsilon_j。因此下面这个严格不等式足以保证首选组合胜出:

∑j=1nϵj+max⁡jϵj<1.(9)\sum_{j=1}^{n}\epsilon_j+\max_j\epsilon_j<1. \tag{9}

这是本笔记从同一证明思路得到的延伸,不是论文评测过的新算法。它的意义在于,不必把一个稍弱位置的错误预算复制给所有极高置信度位置。若大部分位置非常确定,这个条件可能比统一取最坏值更宽松。但它仍然要求概率可信、边缘自洽,而且未必直接给出考虑计算成本后最优的位置选择集合。

5.2 最大值相同,不等于分布没有变化

联合最优序列不变,只是一个层面的保证。对 n>1 的情形,附录还讨论两个分布有多接近。为了不让分布 p 与范数阶数混淆,这里用 r 表示范数阶数。证明先控制首选点 x* 上的概率差,得到小于 (n-1)epsilon;再控制其他点:每个点的差小于 epsilon,尾部绝对差总和小于 2n epsilon。于是:

∥p−q∥rr<(n−1)rϵr+ϵr−1(2nϵ),∥p−q∥r<((n−1)r+2n)1/rϵ,TV⁡(p,q)<3n−12ϵ.(10)\begin{aligned} \|p-q\|_r^r &< (n-1)^r\epsilon^r+\epsilon^{r-1}(2n\epsilon),\\ \|p-q\|_r &<\left((n-1)^r+2n\right)^{1/r}\epsilon,\\ \operatorname{TV}(p,q)&<\frac{3n-1}{2}\epsilon. \end{aligned} \tag{10}

最后一行是 r=1 时再除以二。这个上界可能很松,甚至大于一;此时它还不如“总变差最多为一”这个普遍事实有用。所以不能只说“论文给出了分布误差上界”,还要看代入实际参数之后,界是否提供了足够有意义的数值控制。

前向 KL 有一个更直接的含义。因为 q 正好是 p 的边缘乘积,所以:

DKL(p∥q)=∑j=1nH(Xj∣E)−H(X1,…,Xn∣E)=∑j=2nI(Xj;X1,…,Xj−1∣E).(11)\begin{aligned} D_{\mathrm{KL}}(p\|q) &=\sum_{j=1}^{n}H(X_j\mid E)-H(X_1,\ldots,X_n\mid E)\\ &=\sum_{j=2}^{n}I(X_j;X_1,\ldots,X_{j-1}\mid E). \end{aligned} \tag{11}

第一行叫总相关,表达的正是独立近似丢掉了多少依赖信息。第二行用链式法则把它拆成一串互信息。每一项互信息不超过对应位置的熵;当一个 token 已经占据至少 1-epsilon 的概率时,剩余概率均匀分到 V-1 个 token 上会让熵最大。在这里所需的高置信度范围内,可以得到:

DKL(p∥q)<(n−1)[hb(ϵ)+ϵlog⁡(V−1)].(12)D_{\mathrm{KL}}(p\|q)<(n-1)\left[h_b(\epsilon)+\epsilon\log(V-1)\right]. \tag{12}

h_b 是二元熵,V 是词表大小。这里还隐含使用了相应熵上界在高置信度区间内随 epsilon 增大的性质。尤其要注意 KL 的方向:这不是反向 KL 的保证。图 2 中 q 给 p=0 的组合分配了正概率,所以 D_KL(q||p) 反而是无穷大。两种 KL 不能互换着解释。

6. 从数学条件到 factor 策略,中间还有哪些缺口

论文的 factor 策略把剩余位置按置信度从高到低排序,记为 c_(1)、c_(2) 等,然后选满足下式的最大 n:

(n+1)(1−c(n))<f.(13)(n+1)\left(1-c_{(n)}\right)<f. \tag{13}

这里用的是被选位置中最低的置信度,相当于给所有位置套上同一个最坏错误预算。f=1 时,它与定理条件形式接近,前提仍是概率满足定理假设。f 大于一时,条件被放宽。附录确实探索了大于一的 factor,因此那些更快的设置有意走出了字面上的最坏情况保证。

算法 3:按 factor 自适应决定并行数量

这个规则同样保留至少填一个位置的兜底逻辑。

输入:剩余位置、候选 token、置信度、factor f
1. 按置信度降序排列剩余位置。
2. 考察候选集合大小 n = 1, ..., m。
3. 保留满足 (n + 1) * (1 - c[n]) < f 的 n。
4. 取其中最大的 n,选前 n 个位置。
5. 若没有满足条件的 n,只选最高置信度位置。
6. 同时填入选中的候选 token。

固定阈值 0.9 与 factor=1 不是一回事。若一个 32-token 块里所有预测都超过 0.9,阈值策略可能把它们全部填进去。但统一取 epsilon=0.1 后,定理只覆盖 n<=9,并且还要满足严格概率前提。32 个位置一起填可能在经验上很好用,却不能仅凭这个定理宣称有相同保证。最坏情况界较保守,与越界后仍可能有效,并不矛盾。

另一个缺口是分数可信度。神经网络给出的是估计概率,陈旧缓存还可能进一步扰动它。作为一个纯分析假设,如果某个候选的估计边缘概率与理想概率相差最多 delta,那么真实非首选概率可以这样界定:

ϵtrue≤1−c^+δ,(n+1)(1−c^+δ)≤1.(14)\epsilon_{\mathrm{true}}\le 1-\widehat c+\delta,\qquad (n+1)(1-\widehat c+\delta)\le1. \tag{14}

第二个式子才是加入误差余量后的保守测试。论文没有提供可用的 delta 证书,我也没有测出这个量。这段推导的用途是明确“理论要落地还缺什么”,而不是暗示问题已经解决。它同时提示了一个值得做的比较:用新鲜表示和缓存表示选位置时,置信度偏移是否集中出现在容易出错的地方。

7. 两种加速为何互补,却不能简单把倍数相乘

把总时间粗略拆成前向计算次数乘以每次成本,再加上刷新和选择开销:

Tbase≈S0Cfull,Tfast≈SCactive+R+Tselection.(15)T_{\mathrm{base}}\approx S_0C_{\mathrm{full}},\qquad T_{\mathrm{fast}}\approx SC_{\mathrm{active}}+R+T_{\mathrm{selection}}. \tag{15}

S_0 是原来的前向次数,S 是并行提交之后的次数;C_full 与 C_active 分别代表完整计算和复用缓存后的单次成本,R 是额外刷新成本。这个式子只是解释性的成本分解,没有用实验拟合。缓存主要降低单次成本,并行填词主要降低次数,但它们还会改变生成轨迹、输出长度和达到阈值的位置,因此不满足一个精确的倍数乘法定律。

论文图 1b 在 LLaDA、GSM8K、长度 256 的设置下,给出四个吞吐:原始方法 6.7、仅缓存 21.2、仅并行 16.5、两者结合 54.4 token/s。对应平均每步提交 token 数分别为 1、1、3.25、3.01。结合缓存之后每步提交数略低,却整体更快,因为每步计算成本下降得更多。

图 4:根据论文图 1b 重绘。左图是每秒输出 token,右图是每步提交 token;两种指标不能混用。结合两项方法后,这一设置达到 54.4 token/s。

用表中四舍五入后的吞吐计算,仅缓存约 3.16 倍,仅并行约 2.46 倍,结合约 8.12 倍。前两个比值相乘约为 7.79,而不是 8.12。这并不反常,因为实际过程不是两个互不影响的固定比例缩放。要认真做成本归因,需要逐请求时间、输出长度和计算次数,而不是只从四根汇总柱子推出因果关系。

还有一个与其他 KV 工作区分的重要点:缓存里的 token 仍然占据存储空间,也仍然作为 key/value 被注意力读取。这篇论文主要省的是重复生成表示的计算,不是把 KV 数量压缩到更少。它与淘汰缓存、低比特缓存压缩可以有关联,但不能因为都叫 KV cache 就认为解决的是同一个问题。

8. 主实验:速度与准确率必须成对读

主实验使用 NVIDIA A100 80GB。默认是 PrefixCache、块大小 32、置信度阈值 0.9。数学任务包括 GSM8K 和 MATH,代码任务包括 HumanEval 和 MBPP;模型则包括 LLaDA 与 Dream。这个覆盖范围说明方法不只在单一任务或单一扩散骨干上起作用,但仍不足以证明任何模型、批量和硬件都可以直接套同一组参数。

下面摘出表 1 和表 2 中长度 512 的结果。准确率差异应按百分点理解,不能写成相对百分比。

模型与任务原准确率新准确率原 token/s新 token/s
LLaDA / GSM8K77.577.23.235.3
LLaDA / MATH37.236.08.047.1
LLaDA / HumanEval43.944.518.473.7
LLaDA / MBPP14.813.84.339.5
Dream / GSM8K76.074.07.742.9
Dream / MATH39.839.39.663.3
Dream / HumanEval54.354.316.352.8
Dream / MBPP55.655.29.473.6

图 5:表 1、表 2 的长度 512 结果。左侧倍数由表中吞吐数值计算,右侧显示准确率百分点变化。不同模型和任务的质量代价并不一致。

我会特别留意三件事。第一,LLaDA 在这个长度下的 MBPP 基线准确率本来就只有 14.8。即使速度提升很多,也不能据此把它当成质量很强的代码生成系统。第二,HumanEval 上有小幅正向变化,但解码路径改变本来就可能改变答案;没有配对置信区间时,不宜把这种差异解释成普遍的推理能力提升。第三,同一种加速对不同任务的影响明显不同,因此一个平均准确率很容易掩盖不适用的场景。

原文概括说,各设置准确率基本在骨干的一到两个点以内。按字面看,这句话过宽。Dream 的长度 256 HumanEval 从 49.4 变为 54.3,是增加 4.9 点;同长度 MBPP 的仅缓存结果从 56.6 变为 53.2,是下降 3.4 点。八样本提示、长度 512 的 LLaDA 消融里,DualCache 还把 78.9 变成了 75.4。它们不会否定总体加速价值,却应该在阅读笔记中保留,而不是被一句“基本无损”吞掉。

表 2 还存在小的倍数标注不一致。Dream、HumanEval、长度 256 的 62.0/23.3 约为 2.66,表中标成 2.8 倍;Dream、MATH、长度 512 的 63.3/9.6 约为 6.59,表中标成 6.5 倍。这里我保留原始吞吐,把自己计算的比值明确标成计算结果。仅凭公开的四舍五入数据,无法确定差异来自聚合方式、舍入还是表格笔误。

9. 27.6 倍从哪里来:别只看变大的分子比

表 5 固定八样本提示,改变答案长度,最能揭示最大加速比的背景。下表所有速度单位均为 token/s。

答案长度基线仅并行前缀缓存+并行双缓存+并行
2564.916.449.246.3
5122.314.032.036.4
1,0240.79.313.019.3

图 6:根据表 5 重绘。随着配置的答案变长,DualCache 相对基线的倍数增大,但绝对吞吐反而下降。因此最大倍数与最佳交互速度不是同一件事。

首先,DualCache 并非总比 PrefixCache 快。长度 256 时,46.3 低于 49.2;到了 1,024,19.3 才明显高于 13.0。多缓存一个区域是否划算,取决于减少的重算、额外开销,以及缓存近似之后发生的解码路径变化,不能只由缓存区域更大来判断。

其次,质量最好和吞吐最高的配置并不相同。八样本、长度 1,024 的准确率依次是:基线 77.3,仅并行 78.0,PrefixCache 加并行 75.7,DualCache 加并行 76.0。五样本、长度 1,024 时,DualCache 是 74.7,基线是 77.0。若业务只允许损失半个点,最大速度配置可能根本不在可选集合内。

还有一个容易略过的口径问题:论文图 1c 的延迟标签从 266 秒变为 12 秒,直接相除大约是 22.2 倍,而不是吞吐标签的 27.6 倍。论文把吞吐定义为生成至结束符期间的输出 token 速率;如果实际输出长度和求平均方式不同,延迟比与吞吐比可以不同。但公开汇总数据不足以确定这里具体是哪种原因,所以不能声称已经把二者完全对上。

这不只是挑数字。一个设置把预先分配的答案空间拉长,可能让原始扩散解码反复处理大量 MASK,从而使基线变得很慢。缓存恰好能省掉这类工作,加速比就很好看。对于只需要短答案的用户,长度 256 的绝对时间、首个可用答案出现时间和准确率,可能比最长设置的最大倍数更有实际意义。

10. factor 更激进时,究竟多换来了多少速度

表 11 将阈值策略与更激进的 factor 策略成对比较。它很适合用来判断“提高并行度”的真实代价。

任务与长度阈值准确率factor 准确率阈值 token/sfactor token/s
GSM8K / 25678.577.554.478.5
GSM8K / 51277.274.835.347.1
MATH / 25633.232.051.778.3
MATH / 51236.035.247.164.6

图 7:表 11 中从阈值策略切换到 factor 策略的结果。每条箭头对应同一任务和长度;向右代表更快,向下代表准确率下降。各小图的坐标范围不同。

由表中四舍五入数值计算,这四行吞吐分别多出约 44%、33%、51%、37%,准确率代价是 0.8 到 2.4 点。原文用“40%-50%”概括大体规模可以理解,但不能让概括替代具体设置的数值。它提供了一组可选的速度与质量折中点,而不是证明 factor 必然比默认阈值更值得使用。

论文图 5 还显示,阈值从 1.0 降到 0.9,再降到 0.5,平均每步 token 数从 1 变到 3.25,再变到 7.01。这说明并行选择确实减少了前向次数,也说明优化“每步填多少”本身不够:置信度较低的位置被提前填入之后,后续上下文可能受到影响。

原论文图 7 观察到,中间阶段平均并行度通常高于开头和结尾。一个合理解释是:起初需要建立上下文,中间很多位置变得容易,最后剩下较难位置。但按步骤平均还有一个统计问题:到了很晚的步骤,只剩下尚未结束的样本,样本集合已经变了。若要证明某种普遍的单样本轨迹规律,需要把这个“只观察剩余样本”的效应与真实的阶段变化分开。

附录里同一道数学题在不同阈值下的示例,也主要说明路径和前向次数会改变。单个例子三个设置都答对,并不能证明更激进策略在总体上无损。它适合帮助理解过程,不适合替代基准任务上的配对统计。

11. 视觉模型揭示了一个不能忽略的失败边界

LLaDA-V 的结果使整篇论文更可信,因为它没有假设文本设置可以原样复制到视觉推理。表 9 在 48 步条件下,MathVista 的块长度从 96 改为 8,准确率从 59.7 降到 50.7;吞吐只从约 5.6 变为 6.2 token/s。节省的时间不多,却损失了九个点。原文将这种敏感性与视觉推理对全局上下文的需求联系起来。

作者因此保留完整块,再调整刷新间隔。表 10 的间隔为 2、4、8、16、32 时,准确率分别是 59.2、59.2、58.2、57.1、56.6,吞吐分别为 15.9、19.5、21.1、25.2、28.2。刷新越稀疏,速度整体越快,但质量变化已经明确可见。缓存陈旧程度不能被当作免费的参数。

图 8:LLaDA-V 的两个消融实验,分别来自表 9 和表 10。左图改变 48 步下的块大小,右图改变刷新间隔;它们是不同实验,不能混成一条共同的性能曲线。

主表 3 中,MathVista 从完整步数基线的 59.2 变为 Fast-dLLM 的 56.6,吞吐从 2.84 变为 28.2;MathVerse 则从 28.5 变为 28.6,吞吐从 2.75 变为 23.3。同在一个视觉模型上,不同任务也表现出不同质量代价。附录图片描述示例的延迟改善很直观,却不能用来证明整个视觉推理任务族都保持能力。

这个部分带给我的设计启发,是把块调度与刷新调度分开。块决定当前哪些位置允许填词,刷新频率决定上下文表示多久保持不动。二者影响质量的方式不同。若把它们都压成一个“缓存激进程度”,很难解释为什么文本任务中有利的小块,到了视觉模型却变成明显问题。

12. 批量扩展与替代方案:比较之前先确定目标

附录的批量扩展实验只使用缓存,没有加入置信度并行解码。提示长度是 256,生成长度是 16、32、64,批量增加到 32。文中给出的一个点是:长度 16、批量 32 时,PrefixCache 超过 211 token/s,原生 LLaDA 约为 43。它讨论的是特定短输出场景下的总吞吐,不能与单请求长输出的 27.6 倍当作同一条流水线的两个测量。

我用一个完全假设的成本例子把开销关系画出来。设原来做 100 次前向,每次成本为一;缓存把单次降到 0.35,但增加十单位刷新成本,则总成本为 45。若只使用并行填词,把次数降到 35,则成本为 35。把这些假设组合起来,成本为 35×0.35+10=22.25。它不对应任何硬件实测,只说明加法开销为什么会破坏简单的倍数乘法。

图 9:本笔记构造的归一化成本示意,不是论文数据。蓝色为前向计算,橙色为刷新成本;刷新作为加法项存在,因此组合加速不能直接由两个单项总成本比相乘得到。

有哪些替代办法?一种是训练时就让模型适应按块生成,使训练分布与推理结构更一致,代价是失去“不重新训练”的便利。另一种是投机解码:用小的并行草稿模型提出候选,再让自回归目标模型验证。在适当的接受与修正规则下,可以保留目标分布,但引入了第二个模型和验证成本。还有一种最直接的方法是减少扩散步数,它也省计算,却未必把计算集中花在最不确定的地方。

这些路线满足的需求并不一样。如果用户必须保持某个目标模型的输出分布,就不能把“经验上质量接近”的扩散加速与带验证的投机解码视为同一种保证。如果用户已经采用扩散模型,只需要在允许的质量损失内提高吞吐,训练免费的缓存策略就很有吸引力。

对系统部署而言,我更希望看到固定质量底线后的吞吐曲线:例如在每个任务允许最多下降某个明确点数时,各方法能达到多少吞吐、什么尾延迟、占用多少显存。单纯最大化某一次实验的速度比,无法回答真正的选型问题。

13. 局限:哪些结论现在还不能下

目前最主要的不确定性不是“能不能省计算”,而是选择好的参数能够跨多大范围迁移。论文覆盖两个文本骨干、一个视觉变体和声明的 GPU 环境,已经说明方法有一定通用性,却没有证明块大小 32、阈值 0.9 或某个刷新间隔具有普遍最优性。

理论与实验之间还缺少缓存误差这一环。定理要求自洽边缘和高置信度;实际策略看到的是模型估计值,而且可能来自旧缓存。它会把一些词不可逆地提交,继而改变后续上下文。现有证明没有把缓存年龄、概率偏移和最终任务成功率统一连接起来。

准确率的细小波动也需要更充分的统计信息。下降 0.2 点、上升 0.6 点与下降 3.5 点,不应该被同样笼统地归为“基本保持”。逐请求输出长度与时间没有完整公开在表格中,因而有些吞吐变化难以严格区分是计算效率改善,还是生成行为变化带来的影响。

另外,LLaDA-1.5 的附录表格也不支持“新骨干处处更强且速度相当”的字面结论。在长度 512 的 MATH 上,原 Fast-dLLM 配置为准确率 36.0、吞吐 47.1,而 LLaDA-1.5 为 35.1、41.1。新模型在其他任务可能更好,但阅读时应该让具体行优先于概括性描述。

14. 独立批判性分析

我最认可的贡献,是把“上下文中大部分计算已经稳定”和“仍有少数词不确定”这两件事分开。不能因为一个位置还没有填好,就必须把整段上下文的所有表示重新算一遍;也不能因为一次前向能看到所有位置,就要求每次提交相同数量。缓存与置信度选择分别利用了这两个结构特点。这两个原则本身很有价值,不依赖最大的倍数是否在更强基线下还能保留。

我认为证据链最薄的一环,是两种近似的反馈。缓存变旧可能改变置信度,置信度又决定同时填多少词;填入的新内容进一步决定旧缓存偏离当前上下文多远。分别关闭缓存或并行策略的消融是必要的,但还没有完全拆出这个循环。更有解释力的设计,是交叉比较新鲜与缓存表示、固定与自适应选择,并在相同提示和可比停止条件下记录结果。

我特别想看提交瞬间的诊断:缓存预测与新鲜预测是否同意最高概率 token?置信度移动了多少?分布差异与缓存年龄、块内位置有什么关系?再用这些指标对最终答题结果分层。如果高表示相似度能够预测低错误率,就能给缓存稳定性的直觉补上更扎实的证据;如果不能,也能定位真正危险的决策位置。这里全部是后续实验建议,没有在本次阅读中执行。

算法 4:建议的配对评估流程

下面是用于检验解释的研究设计,不是声称已经完成的复现实验。

1. 固定提示、模型、硬件、答案长度上限。
2. 在成对输入上运行新鲜表示和缓存表示的设置。
3. 保存每个请求的实际输出长度、耗时与任务得分。
4. 在提交位置比较新鲜和缓存预测的差异。
5. 按缓存年龄与置信度对差异和错误进行分层。
6. 扫描阈值或 factor,并报告配对不确定性。
7. 同时绘制质量、延迟和总吞吐的关系。
8. 将批量实验与单请求实验分别报告。

数学方面,式 9 的非均匀错误预算值得与论文取最低置信度的规则比较。它可能在大多数位置极确定时允许更大并行组,也可能对概率失准更敏感。因此应该先检验校准,而不是因为式子看起来更紧,就宣称它一定更好。只观察边缘分数的策略,不可能凭空恢复所有位置之间的依赖结构。

系统方面,我更看重在不同提示长度、输出长度和批量下,面对相关优化基线时的质量约束曲线。原文吞吐比与延迟比的差异,也使逐请求数据尤为重要。即使更严格的比较让最大倍数变小,这篇工作仍然成立:双向解码有许多重复计算,而它展示了不用重训即可省掉其中一部分的实际路线。

15. 总结:复用稳定计算,把不确定性留给下一步

Fast-dLLM 的方法可以概括为两个动作。PrefixCache 与 DualCache 降低每次前向的重复工作;阈值与 factor 策略减少需要多少次前向。论文在多个任务上给出了明显加速,同时也留下了清楚的任务差异、模态边界和质量成本。

定理最有帮助的地方,是让“置信度足够高”变成一个与并行数量相关的条件。一起提交越多,允许的每位置错误预算就越小。但它没有自动证明旧缓存上的分数可信,也没有把经验加速变成分布完全不变的承诺。

我的最终收获是一个方法原则和一个评估原则:稳定的计算可以尝试复用,不确定的提交应该自适应;每个速度结论都要同时带上绝对吞吐、实际质量和对应工作负载。这样既能保留论文的实质贡献,也不会让漂亮的倍数盖住它适用的条件。

参考资料与阅读范围

  1. Wu 等,Fast-dLLM,arXiv:2505.22618v3。完整阅读 22 页,包括附录 A 的证明、定性示例和附录 C 的补充实验。
  2. 作者项目页。用于确认正式论文资源入口;文中数值以 v3 PDF 的表格和图为依据。
  3. 两位置概率例子、非均匀错误预算和归一化成本图为本笔记的解释性推导。第 14 节为尚未执行的后续实验建议,不代表作者实验或本地复现结果。