← 返回 2026-09-23

Flash-dLLM:面向扩散大语言模型的 IO 感知 KV 缓存与并行解码推理加速框架 Flash-dLLM: IO-Aware KV Caching and Parallel Decoding for Fast, Memory-Efficient Diffusion LLMs

Quan Nguyen-Tri, Mukul Ranjan, Zhiqiang Shen 📅 2026-09-22 👍 31 2026-11-02 18:30
GPU内核优化 KV缓存 免训练 扩散语言模型 投机解码 推理加速

IO 感知融合 KV 缓存与免训练自草稿自验证并行解码,让扩散 LLM 推理最高提速 148 倍

前置知识

扩散大语言模型(dLLM)

把文本生成建模为迭代去噪过程:从全 [MASK] 序列出发,模型每步并行预测所有掩码位置的 token,按一定准则逐步揭码直至序列完整。代表模型有 LLaDA、Dream、Gemini Diffusion。与自回归模型从左到右逐 token 生成不同,dLLM 使用双向注意力、可并行揭码,但每个去噪步都要重新计算整个序列的表示。

本文所有优化都围绕 dLLM 的迭代去噪循环展开:KV 状态反复失效、并行揭码的条件独立误差、置信度动态,都是 dLLM 特有的问题。

KV 缓存(KV Caching)

Transformer 推理时缓存每层每个头的 Key/Value 投影,避免对历史 token 重复计算注意力。自回归模型中缓存一次写入终身复用;dLLM 中序列被反复修改(揭码、重掩码),缓存的失效与刷新策略成为核心系统难题。

Flash-Cache 的全部设计都关于如何高效地构建、存储和更新这份缓存,理解 KV 缓存才能理解 IO 瓶颈从何而来。

GPU 显存层级与 IO 瓶颈(HBM vs SRAM)

GPU 显存 HBM 容量大(几十 GB)但带宽有限,片上 SRAM(共享内存/寄存器)极快但只有几百 KB。一个算子的实际耗时往往取决于搬运了多少数据(memory-bound,访存受限),而不是做了多少乘加运算(compute-bound,算力受限)。

论文的核心诊断是:dLLM 的 KV 缓存路径是访存受限的,融合 kernel 的全部价值就在于减少 HBM 读写流量;不懂这个概念就无法理解 1.37× 内核加速的来源。

Flash Attention

一种 IO 感知的精确注意力实现:把 Q/K/V 分块载入 SRAM 中计算注意力,避免把巨大的注意力矩阵写回 HBM,从而在不损失精度的前提下加速注意力并降低显存占用。

Flash-Cache 的融合 kernel 与 Scheduled Flash Attention 直接建立在这一思想上,本文把 IO 感知设计从注意力计算推广到了投影、RoPE 和缓存写入全链路。

置信度感知并行解码

Fast-dLLM 提出的 dLLM 并行解码策略:每步只揭码置信度 $c_i = \max_x p_\theta(x_i \mid x^t) \ge \epsilon$ 的位置,其余保持掩码,以缓解并行揭码隐含的条件独立假设带来的语义不一致(模型采样的是边缘分布乘积 $\prod_i p(x_{i_s}\mid x^t)$,而非真实联合分布)。

Flash-Verify 是它的直接升级:回收被阈值丢弃的低置信 token,用双视图验证决定是否提交,理解基线才能看清本文的改进点。

投机解码(Speculative Decoding)

自回归 LLM 的加速技术:用小模型快速起草 k 个 token,目标大模型一次前向并行验证,接受最长的匹配前缀,保证输出分布与目标模型一致(或有受控偏差)。

Flash-Verify 借用其 draft-and-verify 框架,但让 dLLM 自身兼任 drafter 与 verifier;附录 C 用总变差距离(TV distance)给出了与投机解码一致的形式化偏差保证。

研究动机

扩散大语言模型(dLLM,如 LLaDA-1.5)虽然通过迭代去噪实现了非自回归并行生成,但实际推理效率远落后于成熟的 AR 系统。作者诊断出三层具体问题。其一是访存瓶颈:dLLM 每个去噪步都要重新访问序列,KV 状态被频繁读写更新;现有方法(Fast-dLLM、Elastic-Cache)在 PyTorch 中为每层依次发射 QKV 投影、旋转位置编码(RoPE)、缓存写入、注意力四个独立 CUDA kernel,中间张量在 HBM 中反复读写,每层访存量约为 $4\times O(Q \cdot d_{model}) + O(N \cdot d)$,位置编码和缓存写入这类低算术强度操作反而主导每层延迟(Figure 1a 显示融合后仅此一项即获 1.37× 提速)。其二是 token 级稀疏被浪费:中间层(第 5–20 层)中注意力最高的 32 个已解码 token 就承载了约 50% 的总注意力权重,却被与全部缓存条目同等对待,大量带宽花在几乎不影响当前预测的状态上。其三是置信度失配:许多 token 早已语义确定,但因置信度未过保守阈值 $\epsilon$ 而被迫推迟提交,产生冗余去噪步,而平均置信度与每步可早解码 token 数正相关(相关系数约 0.48)。综合后果是:LLaDA-1.5 无缓存贪心解码在 GSM8K-512 上仅 2.6 tokens/s,即使最强已有方法 Elastic-Cache 也只有 41.7 tokens/s。

本文的目标是本文的目标是构建一个免训练的推理加速框架 Flash-dLLM,在不改动任何模型权重的前提下,同时解决 KV 缓存的 IO 低效与并行解码的吞吐天花板两大问题,把 dLLM 固有的并行性转化为实际的 wall-clock 加速。具体拆解为四个子目标:(1) 通过 IO 感知的融合 Triton kernel 消除缓存路径上的冗余显存搬移,使缓存更新不再受限于访存;(2) 只对真正影响当前解码步的关键 token(最受关注的已解码 token 加掩码窗口)做缓存服务与查询,把每步计算量控制在固定预算内;(3) 设计无需辅助模型的草稿-验证并行解码机制,安全地提高每步可提交的 token 数,减少总去噪步数;(4) 在更长生成序列与更大 batch 下保持近线性可扩展性,并显著降低峰值显存占用,使 Flash-dLLM 在速度、显存、扩展性三个维度全面超越现有 dLLM 加速方法。

与已有工作不同的是,已有加速工作几乎都把 KV 缓存与并行解码当作两个独立课题:Fast-dLLM 提出前缀缓存加置信度阈值解码,Elastic-Cache 用注意力漂移检测做自适应刷新,dKV-Cache 按固定时间间隔缓存——它们没有回答"缓存复用与并行验证同时开启时,IO 会成为新瓶颈"这一联合问题;投机方向上,FlashDLM 依赖外部自回归验证器,FreeDave 需要多次独立前向,都引入额外模型或额外开销。本文的独特切入有二。一是 IO 视角:不是继续设计更聪明的缓存刷新时机,而是先问"缓存更新这条路本身为什么慢",把 Flash Attention 的 IO 感知思想从注意力计算推广到"投影+RoPE+写缓存"全链路。二是自验证:让 dLLM 自身同时充当 drafter 和 verifier——同一位置用草稿预测与 [MASK] 两个视图在因果掩码隔离下独立预测,一次额外前向即可完成一致性检验,无需外部模型、无需训练,并附带总变差距离的偏差界,这是此前 dLLM 并行解码工作都没有给出的理论保证。

核心方法

直觉上,dLLM 推理慢的根源不是浮点算力不够,而是显存搬运太多、以及低置信 token 的正确预测被白白丢弃。Flash-dLLM 由两个互补组件构成。Flash-Cache 负责缓存路径:它把每层的 QKV 投影、旋转位置编码与 KV 缓存写入融合成单个 Triton kernel,key/value 在片上 SRAM 中生成后直接写入预分配的扁平缓存布局,消除中间张量物化;针对 dLLM 批式推理中序列长度剧烈震荡(缓存阶段只算小窗口、更新阶段要算全序列)的问题,用块表(block table)调度的 Flash Attention 把变长查询块与对应 KV 块对齐,免 padding、免同步;再配合选择性缓存更新,每步只把固定预算内最受关注的 token 纳入查询。Flash-Verify 负责并行解码:每步先用标准草稿前向算出所有掩码位置的预测与置信度,高置信部分($c_i \ge \epsilon$)直接揭码;低置信位置进入验证前向,其查询被复制成草稿视图(填入草稿预测 $\hat{x}_i$)与掩码视图(保持 [MASK])两份,在因果掩码下互不可见、共享跟踪上下文,仅当两视图预测一致且掩码视图置信度 $\tilde{c}_i \ge \gamma$ 时按从左到右顺序接受。两个组件共享同一融合 kernel 与同一份缓存,整个流程免训练。

核心创新是"IO 感知缓存"与"自草稿自验证"的组合,二者都针对被既有方法忽略的环节。与 Fast-dLLM/Elastic-Cache 在 PyTorch 层面调度缓存更新不同,Flash-Cache 把融合粒度下沉到 kernel:传统实现每层发射 4 个独立 CUDA kernel、中间结果各写读 HBM 一次,融合 kernel 让投影与 RoPE 全部发生在 SRAM、结果直写缓存,单这一项在 RTX 3090 上就带来 1.37× 的内核加速。与置信度阈值解码"低于 $\epsilon$ 一律丢弃"的硬截断本质不同,Flash-Verify 把低置信 token 的草稿重新送回模型,利用缓存上下文提升其有效置信度后再决定提交——它让 dLLM 不借助任何外部模型就完成了与投机解码等价的 draft-and-verify 循环:双视图因果掩码保证两个预测在共享上下文下条件独立,一致性检验天然过滤并行揭码的独立性误差。附录 C 进一步证明:被接受 token 与模型顺序解码条件分布的总变差距离为 $\mathrm{TV}(\pi_i, p_i) = 1-\tilde{c}_i \le 1-\gamma$,整个接受块的偏差 $\mathrm{TV}(\pi_A, p_A) \le 1-\gamma^m$,且验证掩码是因果的,$p_A$ 是模型真实的链式法则联合分布——即加速不以破坏模型自身分布为代价。

方法步骤详情

完整流程见 Algorithm 2。第一步初始化:把 prompt 与 $N$ 个 [MASK] 拼接为 $x^0$,做一次全序列前向,为每层预分配扁平布局的 KV 缓存 $\tilde{K}^l, \tilde{V}^l \in \mathbb{R}^{(B \cdot N_{max}) \times d_{model}}$,之后不再动态分配(这是省显存的关键)。第二步循环去噪:每步构造固定大小查询 $Q^t = T^t \cup M^t_{\beta_m}$——跟踪集 $T^t$(预算 $\beta_t$,默认 64–80,含新解码 token 与按注意力选出的 top-k 已解码 token)加滑动掩码窗口($\beta_m=64$)——经融合 kernel 对全缓存做双向注意力;对窗口内每个掩码位置计算 $c_i = \max_x p_\theta(x_i \mid x^t)$,$c_i \ge \epsilon = 0.9$ 的位置直接解码为 $D^t$,其余构成搜索集 $S^t$。第三步验证前向:按 $2\beta_m - |D^t| - 2|S^t|$ 收缩跟踪集腾出查询槽位,构造三段查询(调整后跟踪集 $T_v$、填草稿预测的 draft 视图、填 [MASK] 的 mask 视图),加载因果掩码后再次调用同一融合 kernel,额外开销只与 $2\beta_m$ 成正比而非全序列;按因果顺序自左向右接受满足 $\hat{x}_i = \tilde{x}_i$ 且 $\tilde{c}_i \ge \gamma$(默认 0.8)的 token,遇首个不一致即停止。第四步更新跟踪集:按 $a_i^t = \sum_{l=1}^{L} \frac{1}{H}\sum_{h=1}^{H} \frac{1}{|M^t_{\beta_m}|} \sum_{j \in M^t_{\beta_m}} S_{l,h,j,i}$ 统计每个已解码 token 从掩码查询处获得的注意力,取 top-k 与新解码 token 组成下一轮 $T^{t+1}$;其余已解码位置不再作为查询、由缓存直接服务,使每步计算量上界恒为 $\beta_t + \beta_m$。循环直至无掩码位置。

技术新颖性

技术新颖性体现在三个层面。系统层面:首次把 IO 感知设计从注意力计算(Flash Attention)扩展到 KV 缓存的完整生命周期——投影、RoPE、缓存写入融合为单个 kernel,并用块表调度解决 dLLM 特有的"缓存阶段小窗口 vs 更新阶段全序列"的批内长度震荡问题;这一场景是 vLLM/FlashAttention 系列工作没有处理过的,因为 AR 推理中序列长度单调增长且同批可分组,而 dLLM 中同一 batch 的样本可能在不同阶段、需要不同计算量。算法层面:与 Fast-dLLM 的置信度硬阈值、Prophet 的预测稳定检测、FreeDave 的双前向验证、FlashDLM 的外部 AR 验证器相比,Flash-Verify 的双视图因果掩码方案以一次 $2\beta_m$ 规模的额外前向实现自验证,是无辅助模型条件下首个带形式化偏差界(Theorem 1:每 token $\mathrm{TV} \le 1-\gamma$,每 block $\le 1-\gamma^m$)的 dLLM 并行解码策略。分析层面:用注意力质量集中度这一实证规律(top-32 token 承载中间层约 50% 注意力)指导跟踪集设计,把"哪些缓存条目值得精确刷新"变成可量化的预算分配问题,而非全网刷新或定时刷新。

Overview of Flash-dLLM
Figure 2: Overview of Flash-dLLM

实验结果

在单张 A100 80GB 上对 LLaDA-1.5 的评测给出如下结论。(1) 吞吐(Table 1):贪心解码下 Flash-Cache 单独加速 8.0×–58.5×;叠加置信度感知解码后为 17.0×–102.2×;Flash-Verify + Flash-Cache 在全部 8 个"基准×生成长度"设置中吞吐最高,达 148.0–210.6 tokens/s,相对无缓存贪心提速 22.3×–148.2×,比次快的置信度感知 Flash-Cache 再高 23.5%–45.0%;生成长度从 256 增至 512 时加速进一步放大(GSM8K 29.1×→81.0×、MATH 22.3×→42.0×、HumanEval 29.9×→58.0×、MBPP 61.7×→148.2×)。相对最强基线 Elastic-Cache,GSM8K 与 HumanEval 上分别提速 5.1× 和 11.0×。(2) 精度:GSM8K-512 上同时取得最高精度 83.02% 与最高吞吐 210.6 t/s;数学任务上与最优精度差距不超过 1.78 个百分点;代码生成长度 256 时差距较大(HumanEval 3.66、MBPP 3.60 个百分点)。(3) 与 7 个已有方法对比(Table 2):基线吞吐仅 14.9–42.8 t/s(dKV-Cache 14.9、FlashDLM 15.7、dLLM-Cache 16.8、Dyna-dLLM 38.4、Fast-dLLM 36.8、FreeDave 42.8、Elastic-Cache 41.7),Flash-dLLM 达 210.6 t/s,为最快的 FreeDave 的约 4.9 倍。(4) 可扩展性(Figure 4、Table 6):吞吐随 batch 近线性扩展至 32(Fast-dLLM 在 batch 24 即 OOM),batch 16 时显存约 26 GB,比 Fast-dLLM 的 50 GB 低约 48%;每步接受 token 数为 Flash-Verify 5.7、置信度感知 2.8、贪心 1.0;batch 32 时 Flash-Verify 达 199.8 t/s。(5) 精度-吞吐权衡(Figure 5、Table 4):$\gamma=0.60,\beta_t=48$ 达 277.80 t/s @ 80.23% 精度;$\gamma=1.00,\beta_t=96$ 达 83.41% @ 131.58 t/s;$\gamma=0.85,\beta_t=96$ 以 185.70 t/s 逼近最高精度(仅差 0.26 点);同一精度带(82.6–82.9%)内 Flash-Verify 吞吐 190–210 t/s,高于置信度解码的 140–160 t/s。(6) 消融(Figure 6/7、Table 5):Flash-Verify 每迭代解码 7.2 token 的吞吐即与置信度解码 5.6 token 相当且精度高 3.5%,高并行区吞吐优势达 1.33×;掩码窗口 $\beta_m$ 变化时两法精度差仅 0.2–1.2 个百分点,Flash-Verify 速度优势随窗口增大从约 1.4× 升至 1.5×;prefill 从 1-shot 增至 8-shot 时其相对加速从 1.50× 缓降至 1.35×,但保持 42.6–78.6 t/s 的绝对优势。

Accuracy and decoding efficiency of LLaDA-1.5 across different benchmarks and decoding configurations
Table 1: Accuracy and decoding efficiency of LLaDA-1.5 across different benchmarks and decoding configurations
Comparison of accuracy and decoding throughput across different methods
Table 2: Comparison of accuracy and decoding throughput across different methods
The hyper-parameters of Flash-dLLM under various settings
Table 3: The hyper-parameters of Flash-dLLM under various settings
Mean accuracy (%) and throughput over five random seeds
Table 4: Mean accuracy (%) and throughput over five random seeds
Ablation of generation and prefill lengths
Table 5: Ablation of generation and prefill lengths
Effect of batch size on throughput
Table 6: Effect of batch size on throughput
Tokens-per-iteration comparison of Flash-Verify and Confidence-aware decoding
Figure 6: Tokens-per-iteration comparison of Flash-Verify and Confidence-aware decoding
Impact of the masked-window size βm on accuracy and throughput
Figure 7: Impact of the masked-window size βm on accuracy and throughput
查看结构化数据
任务指标本文基线提升
GSM8K-512(5-shot,数学推理) 精度 / 吞吐(相对无缓存贪心的加速比) Flash-Verify+Flash-Cache:83.02% / 210.6 tokens/s(81.0×) Elastic-Cache:82.79% / 41.7 tokens/s(16.0×) 吞吐提升约 5.1×,精度 +0.23 个百分点,速度精度双赢
HumanEval-512(0-shot,代码生成) pass@1 / 吞吐 Flash-Verify+Flash-Cache:40.24% / 185.6 tokens/s(58.0×) Elastic-Cache:37.80% / 16.8 tokens/s(5.2×) 吞吐提升约 11.0×(摘要报告值),精度 +2.44 个百分点
MATH-512(4-shot,数学推理) accuracy / 吞吐 Flash-Verify+Flash-Cache:35.98% / 210.1 tokens/s(42.0×) Elastic-Cache:35.84% / 41.4 tokens/s(8.3×);Fast-dLLM:33.68% / 44.4 tokens/s 对 Elastic-Cache 吞吐提升约 5.1×,精度 +0.14 个百分点
MBPP-512(3-shot,代码生成) pass@1 / 吞吐 Flash-Verify+Flash-Cache:39.00% / 148.2 tokens/s(148.2×) Elastic-Cache:39.00% / 32.8 tokens/s(32.8×) 吞吐提升约 4.5×(全表最大加速比 148.2×),精度持平
GSM8K-512 批式推理可扩展性(batch=16) 峰值显存 / 吞吐扩展性 约 26 GB;吞吐近线性扩展至 batch 32(199.8 tokens/s),无 OOM Fast-dLLM:约 50 GB;batch 24 即显存溢出 显存降低约 48%,且可支持更大 batch

局限与改进

作者承认的局限(附录 A):实验仅覆盖掩码扩散 LLM,未验证连续空间扩散模型(其缓存更新模式可能不同);基准集中在数学与代码等结构化输出任务,开放生成(长文写作、对话)中 token 级置信度分布更平坦,方法表现未知;$\gamma$ 与 $\beta_m$ 在整个生成过程中固定,自适应调整 scheme 可能进一步改善权衡。我的补充观察:(1) 主实验只报告了 LLaDA-1.5 一个模型(附录局限性一节称"两个代表性模型"但正文未见第二个模型的结果表),跨架构泛化的证据不足;(2) 精度-加速权衡在短长度代码生成上代价明显——HumanEval-256 与 MBPP-256 上 Flash-Verify+Flash-Cache 比各表最优精度低 3.66 和 3.60 个百分点,追速度的用户在编码任务上可能损失可用性;(3) 选择性缓存更新对非跟踪位置只提供近似 KV,若注意力集中模式随任务或位置漂移,固定 $\beta_t$ 的跟踪集可能失效且近似误差随序列累积,论文未给出长序列(如 1024+)上的误差分析;(4) 验证前向使 Flash-Verify 对长 prefill 更敏感(8-shot 时相对加速从 1.50× 降至 1.35×),且吞吐在 batch 16 后趋于饱和(186.2 t/s 已达 batch 32 的 93.2%),超大 batch 下边际收益有限。

独立分析的弱点

独立分析的弱点及改进方向:(1) 硬阈值接受规则在置信度平坦的分布上会大量触发拒绝、浪费验证前向的开销——可引入基于运行期置信度统计的自适应 $\gamma$(作者亦承认此点),或当搜索集 $|S^t|$ 很小时动态跳过验证。(2) 跟踪集用注意力得分 top-k 选择是一种启发式,缺少对"缓存近似误差对最终 logits 影响"的直接度量——可为每个位置维护误差代理(如注意力熵或 logits 偏移),超限时局部触发全量刷新或扩容跟踪集,把 Elastic-Cache 的漂移检测思想从刷新时机移植到跟踪集容量控制。(3) 块表调度与融合 kernel 深度绑定单卡 A100 + Triton 2.0,与 tensor parallelism、paged attention 等服务级特性的兼容性未验证——改进方向是把块表抽象移植进 vLLM/SGLang 类推理框架,支持 continuous batching 与多租户。(4) 每步按公式 (2) 对全部 $L$ 层、$H$ 头做注意力归约来选 top-k,层数头数增大时统计开销上升——可只在注意力集中的中间层(论文观测为第 5–20 层)子采样统计。(5) 双视图查询使验证前向的查询长度近似翻倍,在极长上下文或长 prefill 场景占比上升——可用 prefix 共享或把 mask 视图限制在局部窗口内以压缩验证成本。

未来方向

作者提出的方向:把融合 kernel 与 Flash-Verify 推广到连续空间扩散语言模型;在开放生成与对话任务上检验置信度驱动解码的行为;设计随运行置信度统计自适应调整 $\gamma$、$\beta_m$ 的机制。基于本文成果可延伸的方向:(1) 将双视图验证推广为树形或多候选验证,每步同时验证多条候选前缀,进一步提高每步接受 token 数的上限;(2) 把 Theorem 1 的偏差界用于在线控制——给定总偏差预算,自动求解 $\gamma(t)$ 随去噪步的调度轨迹,实现"带质量预算旋钮"的解码器;(3) 与量化、蒸馏正交叠加,探索低比特 KV 缓存下融合 kernel 的数值稳定性;(4) 在 Dream-7B、更大规模 LLaDA 或多模态扩散模型上验证方法随模型规模的收益规律;(5) 将块表调度接入服务框架,实测多请求并发下的吞吐-时延 SLA 曲线,这是从 benchmark 走向生产的关键一步;(6) 利用"注意力集中在中间层"的观测做层级化差异化缓存精度——中间层精确刷新、首尾层近似服务,进一步压低访存量。

复现评估

复现条件较好。代码已开源(github.com/VILA-Lab/Flash-dLLM),基于公开权重的 LLaDA-1.5,kernel 用 Triton 2.0 实现,单张 A100 80GB 即可跑全部主实验(融合 kernel 在 RTX 3090 上也验证过 1.37× 提速),无需多卡或大规模算力。评测使用标准 lm-eval-harness(GSM8K 5-shot flexible_extract、MATH 4-shot math_verify/minerva_math、HumanEval 0-shot pass@1、MBPP 3-shot pass@1),吞吐统计口径与 Fast-dLLM 对齐,超参数在 Table 3 完整披露($\epsilon=0.9$,$\gamma=0.8$ 或 0.85,块大小 $\beta=16$,$\beta_t=64$–80,$\beta_m=64$,batch 32,生成长度 256/512)。所有数据集公开可得;附录报告 5 个随机种子的均值±标准差(精度波动最多 1.03 个百分点、吞吐最多 4.94 t/s),并给出理论证明与多组生成样例,统计可信度较高。复现难度评估:直接使用官方代码复现主表不难,属于中等偏易;但要移植到其他模型或自研框架,则需要相当的 Triton kernel 开发经验,因为融合 kernel、因果验证掩码与块表调度三者深度耦合,代码文档化程度未知。

相似论文推荐