056 · Diffusion LLM Scheduling
DSB:让 diffusion LLM 的 block 边界跟着语义难度滑动
DSB 改了哪条规则:Block 不必全部解完再前进。左右边界会按已提交 token 数和最左未决位置分别移动,边界外的高置信 token 可以提前接纳,block 内的难 token 可以推迟;prefix-window cache 用来处理动态边界带来的 KV 不稳定。
本文目录 · 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。
- 从当前 block 左侧扫描,若仍有 mask,新的左边界 s 移到最左未决位置;它左侧已经稳定完成,不再占 active region。
- 若当前 block 没有 mask,s 直接移到旧 e。
- 右边界按
e=min(l_prompt+S_init+U, s+S_max)扩张:总体提交越多,允许看得越远;但 active span 不超过 S_max。 - 重复直到 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 扫初始长度、最大长度和最小窗口。
最后还要公开逐任务原始结果与配置,避免平均值掩盖质量退化,并让后续实现能够精确核对每个调度与缓存组合。