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 会堵住整个下 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\)。
- 从当前 block 左侧扫描,若仍有 mask,新的左边界 s 移到最左未决位置;它左侧已经稳定完成,不再占 active region。
- 若当前 block 没有 mask,s 直接移到旧 e。
- 右边界按 \(e=\min(\ell_{\mathrm{prompt}}+S_{\mathrm{init}}+U,\ s+S_{\max})\) 扩张:总体提交越多,允许看得越远;但 active span 不超过 \(S_{\max}\)。
- 重复直到 \(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 扫初始长度、最大长度和最小窗口。
最后还要公开逐任务原始结果与配置,避免平均值掩盖质量退化,并让后续实现能够精确核对每个调度与缓存组合。