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 的两个对称失败
  12. 12. 双边界公式逐变量解释
  13. 13. 算法伪代码与不变量
  14. 14. DSB Cache 的一致性问题
  15. 15. 三轴基线如何公平比较
  16. 16. 四模型五任务结果解读
  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 会堵住整个下一块;紧邻边界外已经高置信的位置却不能提交。Naive scheduling 被几何位置支配,完全看不到不同 token 的语义难度。AdaBlock 用 delimiter/pattern 决定 block,但依赖任务格式,泛化受限。

2. Baseline 形式化

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

i_t = argmax_{i∈M^(t)} max_{v∈V} p_θ(y_i=v | X,y^(t))

B_k = {(k-1)B+1, ..., kB}
固定 block 只有在 M_k^(t)=∅ 后才能进入 B_(k+1)

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

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

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

3. Dynamic Sliding Block 算法

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

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

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

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

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

4. 完整多轮例子

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

第二轮提交 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 先解。这个机制保留“不能无限跳过左侧难点”的全局因果,又不要求每个几何块齐步走。

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

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

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

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

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

l_pw^(t) = max(l_pmin, s^(t)-s^(t-1))

每轮刷新:active block + 紧邻 prefix window
复用:其余 active block 外位置
每累计解码 S_init 个 token:做一次 global refresh

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

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

全局刷新以累计新解码 S_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 为七十七点二六/四十八点七零、三十三点零二/五十六点七三、四十点八五/一百一十九点一、四十点四零/五十二点七二、五十二点七七/五十三点二七;DSB 常量版为七十八点一七/五十点三六、三十三点一四/五十八点六、四十二点零七/一百二十四点六、四十一点四/五十三点三五、五十三点二/五十六点五六。五项 TPS 全升,准确率也全不低于固定块。

同模型加缓存后,Dual Naive 的五项为七十七点四/九十二点二六、三十二点七二/八十三点五八、三十七点八/一百点六、三十七点八/七十六点六一、四十七点零九/九十点七九;DSB 贪心为八十点二九/九十九点六一、三十三点四六/八十九点九、三十九点六三/一百零七点七、四十二点八/八十一点八八、五十一点一六/一百点一。这里完整系统在五项质量与速度上都超过普通 Dual 固定块,支持专用 cache 与动态边界的组合,而不只是挑一个 GSM8K 点。

8. 消融证据

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

Table 3 给出直接数值。LLaDA-8B 的 GSM8K 上,常量 DSB 配普通 Dual 为七十六点四二准确率、七十八点九三 TPS,换 DSB Cache 后为八十点一四、九十八点一;贪心版从七十六点三五、八十一点八五升到八十点二九、九十九点六一。HumanEval 上,常量版从二十八点零五、八十七点七九升到三十七点八、一百零五点三;贪心版从二十八点零五、八十七点九七升到三十九点六三、一百零七点七。相同 schedule 只换 cache,四组质量和速度同时上升,说明滑动边界旁的陈旧 KV 的确是主要问题。

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

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

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

局限:DSB 用 confidence 残留间接表示语义难度,confidence 校准差时边界也会错。S_init、S_max、l_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 的两个对称失败

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

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

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

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

B^(t) = [s^(t), e^(t))
U = 全回答累计已经提交的 token 数

左边界:当前块存在 mask 时,s_next = 最左 mask 位置
        当前块全完成时,s_next = e_current

右边界:e_next = min(prompt_len + S_init + U,
                      s_next + S_max)

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

S_max 等于 S_init 时,窗口长度固定但可逐位置滑动,称常量版;S_max 无界时只受累计进度约束,称贪心版。贪心版不是一次打开全局:U 初始为零,右界仍从 S_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)

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

DSB 没规定块内必须用 confidence decoder,理论上 Top-1 或其他位置选择都可接;论文主比较用阈值零点九的 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 一起重算。窗口长度取最小窗口与本轮左界移动距离的最大值,保证新滑出的区域至少再刷新一次。更远块外位置使用 dual cache;每累计提交 S_init 个 token 做全局刷新,限制误差长期累积。

LLaDA 最小窗口二十四,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 根据特殊分隔符或模式确定下一块,对格式明显的任务可能有效,遇到无分隔长文本则不稳。DSB 只用 mask 进度,不依赖任务符号。dKV 等 token representation 稳定后才缓存,减少陈旧状态,却可能错过早期复用;DSB Cache 专门刷新滑动边界。

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

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

LLaDA 八十亿的 GSM8K,Vanilla 为七十七点七九、十四点九四 TPS;无 cache 的 DSB 贪心为七十八点五四、五十一点零三;加 DSB Cache 后八十点二九、九十九点六一。HumanEval 上常量版无 cache 四十二点零七、一百二十四点六,比 AdaBlock 高二点四四准确率和十四 TPS。

LLaDA 一点五在 BBH,Dual Naive 五十五点零八、一百零八点七;DSB 贪心加 cache 五十八点零六、一百二十点一。GSM8K 完整贪心为八十一点九六、九十五点五四。它表明动态边界与专用 cache 在 LLaDA 上常同时改善质量与速度。

Dream 结果更复杂。Base 的 GSM8K,Vanilla 七十五点零六、二十一点零九,贪心加 cache 七十二点四八、六十八点零九,速度上升但质量明显降;Base MATH 常量无 cache 三十四点七零、七十二点零五,同时略优于对应 Naive。Instruct MBPP 贪心无 cache 五十六、五十五点六七,表现较好。

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

LLaDA-1.5 也不能只看 BBH。无 cache 的 DSB 贪心在 GSM8K、MATH、HumanEval、MBPP、BBH 分别为八十点七四/四十九点六三、三十四点一八/五十一点六七、四十二点七/三十三点七五、三十八点六/二十九点六二、五十八点八五/六十九点二三;对应 Confidence Naive 为八十点一四/四十九点六三、三十三点六四/五十一点三八、四十三点三/三十二点六七、三十九点二/三十一点零八、五十七点一六/六十二点六。它在 MATH、BBH 获得较清楚的质量速度收益,但 HumanEval、MBPP 质量并非都升。

Dream-Instruct 的缓存结果进一步显示模型耦合:Dual Naive 在 GSM8K 为六十七点三二/七十二点一八,DSB 贪心为七十三点零八/七十五点二七,显著收回普通缓存质量;HumanEval 从五十三点零五/六十五点九一到五十九点七六/六十五点二八,质量上升而速度略降;MBPP 从五十三点八/五十七点九四到五十六点四/六十一点八五;BBH 从五十八点四七/一百二十六点七到五十七点九三/一百四十四点七。DSB 改善的是质量速度折中,不保证两指标逐任务同时支配。

17. 消融、敏感性与局限

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

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

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

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

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

18. 复现清单与结论边界

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

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

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

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

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

五个 benchmark 的评测协议也要固定:GSM8K 使用五样本提示,MATH 四样本,HumanEval 零样本,MBPP 与 BBH 各三样本;统一由官方 lm-eval 执行。数学任务看最终答案准确率,代码任务的准确率依赖测试用例,BBH 覆盖一般推理。回答区默认二百五十六 token,固定块长度和 DSB 初始长度都为三十二,parallel confidence 阈值零点九。若改 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 提升说成滑动边界贡献,会把一次提交多个 token 和 KV 复用的收益都错误计入 DSB。

Dream-v0-Base 的完整缓存行展示了这种边界:DSB 常量在 GSM8K 为七十四点二二、六十八点七一,在 MATH 为三十三点五二、九十六点四四,在 HumanEval 为五十二点四四、七十八点零九,在 MBPP 为五十四点八、 一百一十五点三,在 BBH 为五十点零一、一百四十点一。它并非每项质量都超过 Vanilla,却在 MATH、MBPP 等点形成更优折中。贪心版 MATH 达三十六点九四、九十二点九九,说明放宽 Smax 有时提高质量而非只提速,最佳方向依模型与任务而变。

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

边界公式还要处理尾部。当 ℓ_prompt+S_init+U 超过 prompt 加回答总长时,e 必须截到序列末尾;否则活动集合会访问不存在位置。常量版尾部可能短于 Sinit,不能为了维持窗口长度把 s 向左退,因为左界单调是因果不变量。若当前活动块全解,s 先设为旧 e,再算新 e;若仍有掩码,s 精确落在最左掩码,不是其左一位。原文文字曾用“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,形成单元证据到端到端证据的闭环。

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

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

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

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