Papers

056 · Diffusion LLM Scheduling

DSB:让 diffusion LLM 的 block 边界跟着语义难度滑动

DSB 改了哪条规则:Block 不必全部解完再前进。左右边界会按已提交 token 数和最左未决位置分别移动,边界外的高置信 token 可以提前接纳,block 内的难 token 可以推迟;prefix-window cache 用来处理动态边界带来的 KV 不稳定。

本文目录 · 18 节
  1. 1. 为什么 dLLM 需要 block
  2. 2. Baseline 形式化
  3. 3. Dynamic Sliding Block 算法
  4. 4. 完整多轮例子
  5. 5. 为什么普通 Dual Cache 会掉质量
  6. 6. 实验设置
  7. 7. 主结果逐格看法
  8. 8. 消融证据
  9. 9. 贡献、限制及与其他解码器的关系
  10. 10. 离散扩散与半自回归前置
  11. 11. Fixed block 的 2 个对称失败
  12. 12. 双边界公式逐变量解释
  13. 13. 算法伪代码与不变量
  14. 14. DSB Cache 的一致性问题
  15. 15. 三轴基线如何公平比较
  16. 16. 4 模型五任务结果解读
  17. 17. 消融、敏感性与局限
  18. 18. 复现清单与结论边界

1. 为什么 dLLM 需要 block

masked diffusion LLM 可在全序列双向 attention 下并行填 mask,但语言本身大体有因果顺序。若答案位置在论证上下文形成前被过早提交,生成顺序与语义因果错位,错误会传播。实践因此把长度 \(L\) 的 response 按固定 \(B\) 切成 \(K=L/B\) 段,先把 block 1 全部 unmask,再处理 block 2;全局近似左到右,block 内保留并行。

固定边界又制造新问题:active block 中最后一个低置信 token 会堵住整个下 1 块;紧邻边界外已经高置信的位置却不能提交。Naive scheduling 被几何位置支配,完全看不到不同 token 的语义难度。AdaBlock 用 delimiter/pattern 决定 block,但依赖任务格式,泛化受限。

2. Baseline 形式化

普通 dLLM 每轮对 mask 集合 \(M^{(t)}\) 输出分布,Top-1 只提交最高置信位置:

\[ \begin{aligned} i_t&=\arg\max_{i\in M^{(t)}}\max_{v\in\mathcal{V}}p_\theta(y_i=v\mid X,y^{(t)}),\\ B_k&=\{(k-1)B+1,\ldots,kB\},\\ M_k^{(t)}&=\varnothing\quad\Longrightarrow\quad\text{advance to }B_{k+1}. \end{aligned} \]

Fast-dLLM confidence decoding 可在 active block 内提交所有 \(\mathrm{confidence}\ge 0.9\) 的位置,但如果剩余位置一直低于阈值,最终仍被 block completion 约束。DSB 改的是 scheduling envelope,不替换 block 内的 token selection;论文实验通常把它与 confidence-aware decoding 组合。

公式中的 \(y^{(t)}\) 是第 \(t\) 个去噪步的完整回答状态,尚未决定的位置保存特殊掩码;\(M^{(t)}\) 是全部掩码位置集合,\(\mathcal{V}\) 是词表,\(p_\theta(y_i=v\mid X,y^{(t)})\) 是参数 \(\theta\) 的模型在 prompt \(X\) 和当前部分回答条件下,位置 \(i\) 取 token \(v\) 的概率。内层最大值给位置 \(i\) 的最高 token 置信度,外层 \(\arg\max\) 再选最可靠位置;选中后把该位置写成概率最大的词,其余位置保持不变。传统 Top-1 每步只减少 1 个掩码,长度 \(L\) 的回答需要 \(L\) 次模型调用,是质量参照而非高速方案。

固定块把回答位置分为 \(K=L/B\) 个连续集合,论文为简化假设 \(B\) 整除 \(L\);\(M_k^{(t)}=M^{(t)}\cap B_k\) 表示第 \(k\) 块尚未决定的位置。只有它为空,调度器才允许进入下 1 块。Confidence parallel 虽能在 1 次 forward 中提交多个高于 0.9 的位置,但提交范围仍被 \(B_k\) 截断;如果块内最后一个位置低于阈值,实际实现必须用最高置信位置兜底,否则去噪停滞。DSB 保留相同 token 选择器,仅改变每轮允许选择的连续区域,因此可以在同一 decoder、同一 cache 下做因果归因。

3. Dynamic Sliding Block 算法

第 \(t\) 轮 active block 为半开区间 \(B^{(t)}=[s^{(t)},e^{(t)})\),初始长度 \(S_{\mathrm{init}}\),并有最大 \(S_{\max}\)。每轮在当前 block 内按既有 decoder 提交一批 token,更新累计已解码数 \(U\)。

  1. 从当前 block 左侧扫描,若仍有 mask,新的左边界 s 移到最左未决位置;它左侧已经稳定完成,不再占 active region。
  2. 若当前 block 没有 mask,s 直接移到旧 e。
  3. 右边界按 \(e=\min(\ell_{\mathrm{prompt}}+S_{\mathrm{init}}+U,\ s+S_{\max})\) 扩张:总体提交越多,允许看得越远;但 active span 不超过 \(S_{\max}\)。
  4. 重复直到 \(U=L\)。

当 \(S_{\max}=S_{\mathrm{init}}\),得到定长滑窗 DSB(const.);\(S_{\max}\) 无界得到 DSB(greedy),吞吐潜力大但因果约束更弱。DSB 并不直接读取“token 难度”字段,难度通过是否达到当前 decoder 的提交条件反映在残留 mask 上。

原文 Algorithm 1 对左边界的最终赋值是 \(s\leftarrow i^*\),其中 \(i^*\) 为当前活动块内最左掩码位置;若不存在掩码则 \(s\leftarrow e\)。因此半开区间左端本身可以仍是未决位置,不能再向右跳过。右界第一项 \(\ell_{\mathrm{prompt}}+S_{\mathrm{init}}+U\) 给全局进度预算:初始允许 \(S_{\mathrm{init}}\) 个回答位,每累计提交 1 个 token,最远边界也只向右增加一格;第二项 \(s+S_{\max}\) 给局部跨度上限。取最小值后,窗口既不会因大量右侧易 token 无限越过左侧难点,也不会在已完成很多 token 后仍被初始几何块束缚。

这里 \(U\) 是全回答累计已经从掩码变成 token 的位置数,不是当前块已提交数,也不是去噪轮数。若 1 轮并行提交 8 个位置,\(U\) 增八,右界进度预算最多扩八;若下一轮只提交 1 个,最多再扩一。这个定义把并行收益直接转换成可探索的右侧空间。常量版令 \(S_{\max}=S_{\mathrm{init}}\),活动长度始终不超过初始块但可逐 token 滑动;贪心版移除局部长度上限,却仍受 \(U\) 的全局预算,因而不是从第 1 轮就全局并行。

4. 完整多轮例子

设 response 有 12 个位置,\(S_{\mathrm{init}}=4\)、\(S_{\max}=6\)。初始 \(\mathrm{block}=[1,5)\),本轮位置 1、2、4 高置信而提交,位置 3 保持 mask,\(U=3\)。新 \(s=3\);右界 \(\min(4+3,3+6)=7\),下一轮 \(\mathrm{active}=[3,7)\)。于是位置 5、6 虽在原 block 外,现在可以提前参与,而难位置 3 留待更丰富右侧上下文。

第 2 轮提交 3、5、6,\(U=6\),block 内最左未决是位置 4 吗?位置 4 已提交,所以当前 active 已全解,\(s\) 移到 7;\(e=\min(4+6,7+6)=10\),进入 \([7,10)\)。如果位置 8 很难而 9 已确定,提交 7、9 后 \(s\) 停在 8,但右边界还能扩到 12。固定 block 会被 8 卡住,DSB 则让 10、11 先解。这个机制保留“不能无限跳过左侧难点”的全局因果,又不要求每个几何块齐步走。

按论文的绝对索引再算 1 次:prompt 长度 20,回答长度 12,\(S_{\mathrm{init}}=4\)、\(S_{\max}=6\),初始 \(s=20,\ e=24,\ U=0\)。第 1 轮在回答相对位置 1、2、4 提交 3 个 token,绝对最左掩码为 22,所以 \(s=22\);右界为 \(\min(20+4+3,22+6)=27\),新活动区覆盖回答相对位置三到七。它 1 次吸收了原固定块外的 3 个位置,却仍以相对位置三这个难点作为左端。

假设第 2 轮只提交相对位置 5、6、7,而三仍未决,\(U\) 从三增到六,左端保持 22;右界为 \(\min(20+4+6,22+6)=28\),局部跨度上限先起作用,只再打开相对位置八。第 3 轮若三终于提交,最左未决变成相对位置四吗?四早已提交,于是扫描到仍为掩码的八,左端跳到 27;右界为 \(\min(30,33)=30\)。这个例子同时显示:难点解决时左界可跨过多个已完成位置,难点未解时右界仍可按 \(U\) 扩张,但不会超过 \(S_{\max}\)。

5. 为什么普通 Dual Cache 会掉质量

固定 block 下,prefix cache 复用当前 block 前方位置,dual cache 复用 active block 外所有位置,通常等 1 个 block 完成才全局刷新。DSB 的边界每轮移动,新露出的边界 token 刚从 mask 变成内容,其表示还会随附近 token 更新;若立刻当成长寿命 KV,缓存状态与当前序列不一致,质量下降。

DSB Cache 在 block 左侧额外维护 1 个每轮重算的 prefix window:

\[ \ell_{\mathrm{pw}}^{(t)}=\max\!\left(\ell_{\mathrm{pmin}},s^{(t)}-s^{(t-1)}\right). \]

每轮刷新 active block 与紧邻 prefix window,复用其余 active block 外位置;每累计解码 \(S_{\mathrm{init}}\) 个 token,做一次 global refresh。

窗口至少覆盖本轮新滑过的区域,也保留最小 \(\ell_{\mathrm{pmin}}\):LLaDA 系列设 24,Dream 系列设 4。周期 global refresh 防止局部近似误差长期累积。

变量 \(\ell_{\mathrm{pw}}^{(t)}\) 是第 \(t\) 轮要在左边界前重新计算的 prefix window 长度;\(s^{(t)}-s^{(t-1)}\) 是本轮左界移动距离,也就是刚从活动区滑到缓存区的最小覆盖量;\(\ell_{\mathrm{pmin}}\) 是即使边界只移动一格也要刷新的保护下限。取最大值保证新暴露位置至少再经历 1 次与当前邻域一致的计算,同时给左侧因果上下文 1 个稳定窗口。窗口外且活动块外的 KV 才直接复用,活动块和 prefix window 每轮一起前向。

全局刷新以累计新解码 \(S_{\mathrm{init}}\) 个 token 为周期,而不是固定每若干去噪轮。并行度高时更快触发,说明序列状态改动大,需要尽早重同步;并行度低时刷新摊得更久。DSB Cache 仍是近似:全注意力模型的远端表示也可能变化,但自然语言偏左因果使紧邻左前缀更值得刷新。附录还试了活动块右侧的 suffix window,LLaDA-8B 中等长度有升降趋势,LLaDA-1.5 的准确率始终低于零后缀基线,缺乏一致收益,所以最终方法只保留 prefix window。

6. 实验设置

单张 NVIDIA H200 140GB,lm-eval;generation length 256,固定 block 与 S_init 都为 32,confidence threshold 0.9。模型是 LLaDA-8B-Instruct、LLaDA-1.5、Dream-v0-Base-7B、Dream-v0-Instruct-7B;任务覆盖 GSM8K、MATH、HumanEval、MBPP、BBH。对照三轴:Top-1/Confidence decoder,Naive/AdaBlock/DSB scheduler,None/Dual/dKV/DSB Cache。

7. 主结果逐格看法

在 LLaDA-8B、无 cache 的 GSM8K 上,Vanilla Naive 是 77.79 accuracy、14.94 TPS;Confidence Naive 为 77.26/48.70;DSB(greedy) 为 78.54/51.03,速度与质量都略升。HumanEval 上 DSB(const.) 达 42.07/124.6,相对 AdaBlock 的 39.63/110.6 提高 2.44 个准确率点和 14.0 TPS。

加入专用 cache 后,LLaDA-8B GSM8K 的 DSB(greedy) 达 80.29/99.61,而 Dual+Naive 为 77.40/92.26;MBPP 上 DSB(const.) 为 43.00/82.02,Dual+Naive 为 37.80/76.61。LLaDA-1.5 的 BBH 上 DSB(greedy)+cache 达 58.06/120.1,对比 Dual+Naive 55.08/108.7。

Dream 上收益不总是稳定。Dream-v0-Base 的 GSM8K,DSB(greedy)+cache 72.48 accuracy 低于 Vanilla 75.06,尽管 TPS 从 21.09 升到 68.09;Dream-v0-Instruct 的 MBPP 则 DSB(greedy) 无 cache 达 56.00/55.67。作者把差异与 Dream 的 AR initialization 和 shift-aligned training 联系起来,说明动态 block 与模型训练方式存在耦合。

LLaDA-8B 的五任务无 cache 对比更完整:Confidence Naive 在 GSM8K、MATH、HumanEval、MBPP、BBH 为 77.26/48.70、33.02/56.73、40.85/119.1、40.40/52.72、52.77/53.27;DSB 常量版为 78.17/50.36、33.14/58.6、42.07/124.6、41.4/53.35、53.2/56.56。五项 TPS 全升,准确率也全不低于固定块。

同模型加缓存后,Dual Naive 的五项为 77.4/92.26、32.72/83.58、37.8/100.6、37.8/76.61、47.09/90.79;DSB 贪心为 80.29/99.61、33.46/89.9、39.63/107.7、42.8/81.88、51.16/100.1。这里完整系统在五项质量与速度上都超过普通 Dual 固定块,支持专用 cache 与动态边界的组合,而不只是挑 1 个 GSM8K 点。

8. 消融证据

论文单独比较 DSB schedule 配普通 Dual Cache 与专用 DSB Cache。DSB Cache 的 prefix-window refresh 能显著收回直接套 fixed-block cache 丢失的准确率,同时保留大部分 TPS;global refresh 间隔和 \(\ell_{\mathrm{pmin}}\) 是质量/速度旋钮。const. 与 greedy 的差异也构成结构消融:greedy 常有更高 TPS,但并非总有更高 accuracy,\(S_{\max}\) 约束确实在控制因果性,而不是无意义参数。

Table 3 给出直接数值。LLaDA-8B 的 GSM8K 上,常量 DSB 配普通 Dual 为 76.42 准确率、78.93 TPS,换 DSB Cache 后为 80.14、98.1;贪心版从 76.35、81.85 升到 80.29、99.61。HumanEval 上,常量版从 28.05、87.79 升到 37.8、105.3;贪心版从 28.05、87.97 升到 39.63、107.7。相同 schedule 只换 cache,4 组质量和速度同时上升,说明滑动边界旁的陈旧 KV 的确是主要问题。

动机验证还在 GSM8K 与 HumanEval 各取 50 个样本,每轮计算所有掩码置信度。若块外至少 1 个位置置信度不低于 0.9 却被阻止提交,记为 late step;若块内至少 1 个位置以低于 0.9 被迫提交,记为 premature step。Late Ratio 等于迟交轮数除总轮数,Premature Ratio 同理。Figure 8 报告 late 超过 80%,图中最高为 91.6%;premature 在 44.3%–59% 之间。这不是精确理论证明,但直接验证固定边界的 2 个对称失败在 2 模型两任务上频繁出现。

9. 贡献、限制及与其他解码器的关系

方法贡献:固定 block 被改成由“最左未决位置”和“累计已提交量”共同控制的双边界过程。解码仍大致从左到右,但 easy token 可以越过旧边界。缓存设计也把边界 token 的表示视为暂态,主动刷新一段 prefix,不假定解除 mask 后 KV 会立刻稳定。

局限:DSB 用 confidence 残留间接表示语义难度,confidence 校准差时边界也会错。\(S_{\mathrm{init}}\)、\(S_{\max}\)、\(\ell_{\mathrm{pmin}}\)、global refresh 都影响结果;greedy 可能削弱因果并掉质量。方法改善 block scheduling,不解决每轮哪些强依赖 token 可同时提交,后者是 DAWN 的问题。Dream 结果已显示训练架构会影响泛化;论文设置集中在 256-token generation 与单 H200,长上下文和多卡 serving 尚未覆盖。

合集关系:DSB 与 DAWN 最适合连读:DSB 负责 active region 的动态几何边界,DAWN 负责 region 内依赖感知的并行集合,理论上可组合但论文未验证。与 DDiT 名字都含 diffusion scheduling,层次完全不同:DDiT 调视频模型 GPU,DSB 调文本 mask 位置。

10. 离散扩散与半自回归前置

Masked dLLM 的回答区开始全是掩码,每轮模型对所有允许位置输出词表概率,sampler 按 confidence 选择一批位置永久填入。全局双向解码理论上能先填任意位置,但自然语言答案通常有从前提到结论的顺序;答案数字若在推理步骤前提交,后续上下文可能被错误结果锁定。

Block diffusion 把回答切成连续片段,块之间左到右,块内并行,因而称半自回归。它不是普通自回归:当前块的多个位置仍同时预测;也不是全局 diffusion:后续块在当前块完成前不可提交。Block length 越小,因果约束强、forward 多;越大,并行高但顺序错位风险上升。

DSB 保留半自回归原则,却把固定几何边界改成随去噪状态移动。它不训练模型,也不更改 token probability;同一个 confidence decoder 在不同 active region 上运行。结果变化来自某些 token 提前或推迟成为条件。

11. Fixed block 的 2 个对称失败

第 1 类是块内难 token。设当前 32 位置中前面 31 项已高置信,最后一项仍不确定;固定调度为了进入下 1 块,最终只能强行提交该位置,或继续多次 forward 只等它。强提降低质量,等待降低速度。难点可能是需要后续语义才能确定的指代、数值或闭合结构。

第 2 类是边界外易 token。下 1 块开头可能是固定连接词、标点或已被 prompt 强约束的实体,当前 confidence 很高,却因索引位于边界右侧完全不能提交。模型每轮已经计算它的表示,scheduler 丢弃结果,浪费 diffusion 的全位置信息。

这 2 类失败互为镜像:静态边界把“位置早”当成“应该先确定”,把“位置晚”当成“必须后确定”。DSB 用最左未决位置控制因果底线,用累计已提交数控制右侧探索预算,允许边界跨过已完成区域并吸收新易位置。

12. 双边界公式逐变量解释

\[ \begin{aligned} B^{(t)}&=[s^{(t)},e^{(t)}),\\ s_{\mathrm{next}}&=\begin{cases}\text{leftmost mask}, & \text{if the current block has a mask},\\e_{\mathrm{current}}, & \text{otherwise},\end{cases}\\ e_{\mathrm{next}}&=\min(\ell_{\mathrm{prompt}}+S_{\mathrm{init}}+U,\ s_{\mathrm{next}}+S_{\max}). \end{aligned} \]

\(U\) 是全回答累计已经提交的 token 数。\(s\) 是当前不能越过的最左难点;它左边已稳定,可离开 active block。第一项 prompt length 加初始窗口再加累计完成量,表示每完成 1 个回答 token,就允许右侧覆盖向前推进 1 个位置;第二项限制 active span 不超过最大长度。取较小值同时满足进度预算和局部因果。

\(S_{\max}=S_{\mathrm{init}}\) 时,窗口长度固定但可逐位置滑动,称常量版;\(S_{\max}\) 无界时只受累计进度约束,称贪心版。贪心版不是 1 次打开全局:\(U\) 初始为零,右界仍从 \(S_{\mathrm{init}}\) 开始;只有提交量增加才扩。它比常量版可能覆盖更宽,速度高但局部因果更弱。

13. 算法伪代码与不变量

y = [MASK]^L
s = prompt_len
e = s + S_init
U = 0

while U < L:
  B = [s,e)
  M = B 中仍为 MASK 的位置
  用既有 decoder 在 M 中提交一批 token
  U += 本轮新提交数

  若 B 还有 MASK:s = 最左 MASK
  否则:s = e
  e = min(prompt_len + S_init + U, s + S_max)

核心不变量有 3 个:左边界不会向左退;累计 \(U\) 单调增加;右界不超过回答末尾且 active length 不超过 \(S_{\max}\)。只要内部 decoder 每轮至少提交 1 个位置,循环最终结束。实现要把 prompt 的绝对索引与回答相对索引统一,否则公式中的 prompt length 会导致右界偏移。

DSB 没规定块内必须用 confidence decoder,理论上 Top-1 或其他位置选择都可接;论文主比较用阈值 0.9 的 confidence parallel。若本轮高阈值没有位置,sampler 需 Top-1 兜底,否则边界与 U 都不变形成死循环。

14. DSB Cache 的一致性问题

固定块 cache 假设块外位置长期稳定。Prefix cache 保存块左侧,Dual cache 保存 active block 外全部位置,并在整块完成时同步。动态滑动使一部分刚解码位置迅速落到块外;它们的 hidden/KV 是在邻居仍为 mask 时计算,下一轮邻居改变后表示可能明显漂移,直接复用会把陈旧状态送入 attention。

DSB Cache 在左边界前维护 prefix window,每轮与 active block 一起重算。窗口长度取最小窗口与本轮左界移动距离的最大值,保证新滑出的区域至少再刷新 1 次。更远块外位置使用 dual cache;每累计提交 \(S_{\mathrm{init}}\) 个 token 做全局刷新,限制误差长期累积。

LLaDA 最小窗口 24,Dream 为四,说明模型表示稳定性不同。窗口大提高质量但减少 cache 命中,global refresh 频繁也降低 TPS。它们是与 backbone 绑定的参数,不应只复制同一个值。

15. 三轴基线如何公平比较

Decode 轴有 Vanilla Top-1 与 Confidence parallel;Block 轴有固定 Naive、依赖 delimiter 的 AdaBlock、DSB 常量/贪心;Cache 轴有 None、Dual、延迟缓存的 dKV 和 DSB Cache。表中每行是三轴组合,必须在相同 decoder/cache 下比较 block 才能隔离 DSB。

AdaBlock 根据特殊分隔符或模式确定下 1 块,对格式明显的任务可能有效,遇到无分隔长文本则不稳。DSB 只用 mask 进度,不依赖任务符号。dKV 等 token representation 稳定后才缓存,减少陈旧状态,却可能错过早期复用;DSB Cache 专门刷新滑动边界。

Vanilla 无 cache 是质量参照,不是速度对手;Confidence Naive 表示固定块并行;Dual Naive 显示普通 cache 加速;DSB+DSB Cache 才是完整系统。不能拿完整系统与 Vanilla 的 TPS 差全算成动态边界贡献。

16. 4 模型五任务结果解读

LLaDA-8B 的 GSM8K,Vanilla 为 77.79、14.94 TPS;无 cache 的 DSB 贪心为 78.54、51.03;加 DSB Cache 后 80.29、99.61。HumanEval 上常量版无 cache 42.07、124.6,比 AdaBlock 高 2.44 准确率和 14 TPS。

LLaDA 1.5 在 BBH,Dual Naive 55.08、108.7;DSB 贪心加 cache 58.06、120.1。GSM8K 完整贪心为 81.96、95.54。它表明动态边界与专用 cache 在 LLaDA 上常同时改善质量与速度。

Dream 结果更复杂。Base 的 GSM8K,Vanilla 75.06、21.09,贪心加 cache 72.48、68.09,速度上升但质量明显降;Base MATH 常量无 cache 34.70、72.05,同时略优于对应 Naive。Instruct MBPP 贪心无 cache 56、55.67,表现较好。

所以论文结论是多数设置改善 Pareto,不是每模型无损。Dream 由自回归模型初始化并做 shift-aligned 训练,原生因果偏置不同,动态扩大 block 可能与训练分布不匹配。模型训练方式是适用边界。

LLaDA-1.5 也不能只看 BBH。无 cache 的 DSB 贪心在 GSM8K、MATH、HumanEval、MBPP、BBH 分别为 80.74/49.63、34.18/51.67、42.7/33.75、38.6/29.62、58.85/69.23;对应 Confidence Naive 为 80.14/49.63、33.64/51.38、43.3/32.67、39.2/31.08、57.16/62.6。它在 MATH、BBH 获得较清楚的质量速度收益,但 HumanEval、MBPP 质量并非都升。

Dream-Instruct 的缓存结果进一步显示模型耦合:Dual Naive 在 GSM8K 为 67.32/72.18,DSB 贪心为 73.08/75.27,显著收回普通缓存质量;HumanEval 从 53.05/65.91 到 59.76/65.28,质量上升而速度略降;MBPP 从 53.8/57.94 到 56.4/61.85;BBH 从 58.47/126.7 到 57.93/144.7。DSB 改善的是质量速度折中,不保证两指标逐任务同时支配。

17. 消融、敏感性与局限

Cache 消融把同一 DSB schedule 配普通 Dual 与专用 DSB Cache;前者直接缓存滑出位置导致准确率下降,prefix-window refresh 收回质量,证明缓存设计不是可替换配件。常量与贪心比较隔离 \(S_{\max}\):贪心常更快,某些任务准确率低,显示上界控制实际承担因果约束。

\(S_{\mathrm{init}}\) 决定初始并行区与全局刷新周期;\(S_{\max}\) 决定最大活动跨度;\(\ell_{\mathrm{pmin}}\) 决定边界稳定成本。三者联动,不能只调 1 个。Confidence 校准差时,mask 残留不再代表难度,边界会错误滑动。长回答下窗口和 refresh 开销也需重测。

方法没有显式建 token dependency,2 个都高 confidence 但互相冲突的位置仍可能同轮提交,这是 DAWN 解决的不同问题。DSB 也没有多卡 serving 或连续 batching 设计;论文单张 H200、长度 256 的 TPS 不能直接代表长上下文集群。

初始块长度从 16 扫到 64 时,DSB 在所有设置保持比 Naive 更高吞吐,多数点准确率也更高;到 64 时过早覆盖远位置,因果性变弱,准确率例外下降。生成长度扫 128、256、512、1024,LLaDA 与 Dream 上 DSB Cache 大多维持或略升质量并显著提速,但 LLaDA 长度 1024 出现例外;两方法 TPS 都随长度增长而下降,说明长序列去噪成本仍在。

\(S_{\max}\) 扫 32、48、64、80、96 与无界。LLaDA 上增大上限让更多位置并行,TPS 上升但低置信提交使准确率可能下降;Dream 上趋势相反,TPS 随上限增加逐渐下降,准确率先升后降,64 是明显转折。最小前缀窗口从零到 32 扫描,LLaDA 的质量和吞吐均先升后降,24 为转折;Dream 的准确率略降、吞吐总体下降,所以默认只取四。参数必须按 backbone 校准,不能把 LLaDA 24 直接移植到 Dream。

18. 复现清单与结论边界

复现固定 lm-eval、generation length 256、S_init/Naive block 32、confidence 0.9;LLaDA 与 Dream 各 2 个版本,5 个任务 few-shot 与论文一致。逐行组合 decoder、block、cache,记录准确率、TPS、NFE、平均 active length、每轮提交数、prefix-window 重算和 global refresh 次数。

单元测试用 12 位置例子逐轮核对 \(s\)、\(e\)、\(U\);验证右界不超 \(S_{\max}\)、无提交时兜底;cache 与无 cache 在小模型上比较 logits,定位陈旧 KV。分别跑 Dual 与 DSB Cache、常量与贪心、多个窗口长度。

DSB 的完整结论是:固定 block 把几何位置误当语义难度。动态双边界让最左难点保留,同时按已完成量提前打开右侧易位置;专用 cache 刷新滑动边界附近的不稳定表示。它在 LLaDA 上证据强,在 Dream 上有质量反例,因此部署必须以目标 backbone 重做质量速度曲线。

实现层应把回答相对位置与拼接 prompt 后的绝对位置分别保存,初始化 \(s=\ell_{\mathrm{prompt}},\ e=s+S_{\mathrm{init}}\) 并把右界截到回答末尾。每轮先在旧活动块选 token,再用本轮实际新提交数更新 \(U\),之后扫描剩余掩码更新左界,最后计算新右界;若先扩右界再提交,会把未来位置错误计入本轮。若 confidence threshold 下没有候选,必须提交活动块内最高置信位置作为进度保证。单元测试应逐轮断言 \(U\) 严格增加、\(s\) 不回退、\(e\) 不超过末尾、\(e-s\le S_{\max}\)。

缓存复现需单独计数每轮活动块 token、prefix window token、直接复用 token 和全局刷新 token,并报告由此计算的实际模型输入量。Table 3 以同一 DSB schedule 对比 Dual 与 DSB Cache,用来分离动态提交与缓存的收益;Figure 4 到 7 分别只改初始长度、生成长度、最大长度和最小窗口;附录还应保留 suffix window 从零到 32 的实验,验证它在 LLaDA-1.5 上质量始终不优于零窗口。这样才能说明选择 prefix 而非对称双窗的实验依据。

5 个 benchmark 的评测协议也要固定:GSM8K 使用五样本提示,MATH 四样本,HumanEval 零样本,MBPP 与 BBH 各三样本;统一由官方 lm-eval 执行。数学任务看最终答案准确率,代码任务的准确率依赖测试用例,BBH 覆盖一般推理。回答区默认 256 token,固定块长度和 DSB 初始长度都为 32,parallel confidence 阈值 0.9。若改 few-shot 模板、截断或答案抽取器,准确率变化不能归因于 block 调度。

表格解读还应做同轴对比。要测纯调度贡献,应固定 Confidence decoder、None cache,只比较 Naive、AdaBlock、DSB 常量与贪心;要测完整缓存贡献,应固定 Confidence decoder,比较 Dual+Naive、dKV+Naive、Dual+AdaBlock 与 DSB Cache+DSB;Vanilla Top-1+None 只提供慢而较稳的质量参考。把 Vanilla 到完整 DSB 的全部 TPS 提升说成滑动边界贡献,会把 1 次提交多个 token 和 KV 复用的收益都错误计入 DSB。

Dream-v0-Base 的完整缓存行展示了这种边界:DSB 常量在 GSM8K 为 74.22、68.71,在 MATH 为 33.52、96.44,在 HumanEval 为 52.44、78.09,在 MBPP 为 54.8、 115.3,在 BBH 为 50.01、140.1。它并非每项质量都超过 Vanilla,却在 MATH、MBPP 等点形成更优折中。贪心版 MATH 达 36.94、92.99,说明放宽 Smax 有时提高质量而非只提速,最佳方向依模型与任务而变。

全局刷新测试应按“累计提交 32 个 token”触发,而非每 32 轮触发。假设前 4 轮分别提交八、十、九、5 个位置,第 4 轮结束累计正好 32,应重算全序列缓存;若每轮只提交 1 个,则 32 轮后才刷新。两者状态变化总量相同,按 token 周期使缓存误差预算近似一致。刷新后需要更新所有可复用位置的 KV 版本号,活动块和 prefix window 下一轮仍按正常规则重算,不能因为刚全局刷新就跳过 token 选择。

边界公式还要处理尾部。当 \(\ell_{\mathrm{prompt}}+S_{\mathrm{init}}+U\) 超过 prompt 加回答总长时,\(e\) 必须截到序列末尾;否则活动集合会访问不存在位置。常量版尾部可能短于 \(S_{\mathrm{init}}\),不能为了维持窗口长度把 \(s\) 向左退,因为左界单调是因果不变量。若当前活动块全解,\(s\) 先设为旧 \(e\),再算新 \(e\);若仍有掩码,\(s\) 精确落在最左掩码,不是其左 1 位。原文文字曾用“immediately to its left”描述扫描过程,但 Algorithm 1 的赋值与集合定义明确以 \(i^*\) 为新左端,实现应以伪代码为准。

质量检查不能只比最终 token。缓存实现可在短样本上逐轮运行无 cache 与 DSB Cache,保存每个掩码位置 logits、提交集合、s、e、U 和刷新范围。近似 cache 允许 logits 有差异,但若刚滑出边界的 token 差异远大于远端,说明 prefix window 没覆盖移动距离;若全局刷新后差异仍不归零,说明缓存版本或 attention mask 错。再运行 Table 3 的 GSM8K 与 HumanEval,专用 cache 应相对直接 Dual 同时收回显著准确率和 TPS,形成单元证据到端到端证据的闭环。

部署选择可按 3 个保守层级进行。质量最敏感时先用常量版,把 \(S_{\max}\) 等于 32,仅获得滑动边界而不扩大活动跨度;确认目标模型曲线后再把上限扫到 48、64、80、96;只有贪心在准确率不降时才移除上限。缓存同样先用无 cache 验证调度,再加入 DSB Cache,分别校准 LLaDA 的 24 与 Dream 的四。这样能把边界错误、置信度失准和缓存陈旧 3 个故障源拆开。

最终结果表必须保留反例。Dream-Base 的 GSM8K 中,Vanilla 为 75.06,完整贪心 cache 只有 72.48;Dream-Instruct 的 BBH 中,Dual Naive 准确率 58.47 高于完整贪心 57.93,虽然后者 TPS 更高。若只汇总平均 TPS 或 LLaDA 最佳点,会掩盖训练初始化与动态边界的耦合。DSB 的可信结论是多数设置改善质量速度前沿,LLaDA 证据尤其稳定,而不是对所有 dLLM 与任务无损加速。

复现完成后的判据是 3 层一致:边界单元测试证明滑动规则正确,缓存消融证明 prefix window 修复动态边界的不稳定表示,五任务主表证明在相同 decoder 和 cache 轴上形成更好的质量速度折中。任何 1 层失败都不应直接调最终参数掩盖:边界错先修索引,cache 错先核对刷新范围,只有实现一致后才按目标 backbone 扫初始长度、最大长度和最小窗口。

最后还要公开逐任务原始结果与配置,避免平均值掩盖质量退化,并让后续实现能够精确核对每个调度与缓存组合。