DFlash 2:保持并行起草

Reddit r/LocalLLaMA 工具

摘要

DFlash 2 通过并行预测令牌改进推测解码,在最小延迟下实现每次验证通过时输出增加超过20%,并集成到主要推理引擎如 SGLang 和 vLLM 中。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/18 22:36

# DFlash 2:保持并行草案生成 来源:https://inco.ai/blog/dflash2/ 2026年8月18日 推理是智能体时代的瓶颈。智能体执行读取、规划和工具调用,过程常持续数小时甚至数天。其令牌消耗速率远超聊天场景。每个令牌都需要在模型上进行完整的前向传播。Inco AI 正在构建适应未来令牌经济规模的推理栈。本文将带来初步介绍。 我们的团队于一月发布了 **DFlash**(https://arxiv.org/abs/2602.06036),现已支持 SGLang、vLLM、TensorRT-LLM 和 llama.cpp。NVIDIA 在 Blackwell GPU 上实测显示其吞吐量**最高提升15倍**(https://developer.nvidia.com/blog/boost-inference-performance-up-to-15x-on-nvidia-blackwell-using-dflash-speculative-decoding/);Google 在 TPU 上报告**每秒处理令牌数提升3倍**(https://developers.googleblog.com/supercharging-llm-inference-on-google-tpus-achieving-3x-speedups-with-diffusion-style-speculative-decoding/);CoreWeave 面向 Kimi K2.7 Code 的生产端点(在 Artificial Analysis 为该模型提供最快服务(https://www.coreweave.com/blog/kimi-k2-7-code-now-available-on-serverless-inference-with-leading-benchmark-price-performance))默认运行 DFlash。生态系统已在其基础上构建:NVIDIA(https://huggingface.co/nvidia/Kimi-K2.6-DFlash)、Red Hat(https://huggingface.co/RedHatAI/gemma-4-31B-it-speculator.dflash)和 Modal(https://huggingface.co/modal-labs/Kimi-K3-DFlash)均发布了 DFlash 草案模型;Meta(Muse Glimmer(https://huggingface.co/meta-models/Muse-Glimmer-30B-assistant))、Poolside(Laguna(https://huggingface.co/poolside/Laguna-S-2.1-DFlash))、小米(MiMo-V2.5-Pro(https://huggingface.co/XiaomiMiMo/MiMo-V2.5-Pro-FP4-DFlash))和 NVIDIA(Nemotron 3.5 Lightning(https://huggingface.co/nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-NVFP4-DFlash))均为其模型提供了官方草案模型。截至2026年8月,Hugging Face 上的 DFlash 模型下载量已**超过350万次**。 投机解码是现代推理栈的核心技术。小型草案模型预测一个令牌块,目标模型在一次前向传播中验证整个块。好的预测能将单次传播转化为多个令牌输出;差的则会被丢弃。但多年来,草案生成本身仍保持***自回归***模式:一次生成一个令牌。DFlash 实现了单次传播生成:整个块的所有位置**并行预测**。 下图展示了在 Apple M5 Max 上使用 oMLX 运行 Qwen3.8-27B 时,DFlash 2 与自回归解码的草案生成对比。DFlash 2 将并行草案生成推进一步:**每次验证传递输出增加超20%,仅带来约1%的循环延迟增长**,且输出结果完全一致。在基准测试中,性能提升达16-25%。结合今日发布的 Qwen3.8-27B 草案模型,SGLang 在批大小为1时**吞吐量达到自回归解码的2.7-3.4倍**。独立预测每个位置留下了两个优化空间:选择正确令牌和保持块末尾的精度。DFlash 2 在不放弃单次传播设计的前提下恢复了两者。 ## 立即运行(https://inco.ai/blog/dflash2/#run-it-now) DFlash 2 已支持主流推理引擎: ``` pip install -U "sglang[all] @ git+https://github.com/sgl-project/sglang.git@refs/pull/35371/head#subdirectory=python" python -m sglang.launch_server \ --model-path Qwen/Qwen3.8-27B \ --speculative-algorithm DFLASH \ --speculative-draft-model-path incoai/Qwen3.8-27B-DFlash2 \ --speculative-num-draft-tokens 8 ``` ``` pip install -U "vllm @ git+https://github.com/vllm-project/vllm.git@refs/pull/52816/head" vllm serve Qwen/Qwen3.8-27B \ --speculative-config '{ "method": "dflash", "model": "incoai/Qwen3.8-27B-DFlash2", "num_speculative_tokens": 7 }' ``` ``` git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp git fetch origin pull/27342/head:pr-27342 git switch pr-27342 # NVIDIA CUDA cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON cmake --build build -j # Apple Silicon cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_METAL=ON cmake --build build -j ./build/bin/llama-server \ -hf ggml-org/Qwen3.8-27B-GGUF:Q4_K_M \ -hfd incoai/Qwen3.8-27B-DFlash2-GGUF:Q4_K_M \ --spec-type draft-dflash \ --spec-draft-n-max 7 ``` 下载并安装预构建的 oMLX(含 DFlash 2 支持)(https://github.com/z-lab/omlx-fork/releases/download/0.6.2-dflash2/oMLX-0.6.2-zlab-dflash2-arm64-signed.dmg)。 运行 Qwen3.8-27B 与 DFlash 2 的步骤: 1. 打开 oMLX 模型下载器(http://127.0.0.1:8891/admin/dashboard?tab=models&modelsTab=downloader)并下载: - `mlx-community/Qwen3.8-27B-4bit`(https://huggingface.co/mlx-community/Qwen3.8-27B-4bit) - `incoai/Qwen3.8-27B-DFlash2`(https://huggingface.co/incoai/Qwen3.8-27B-DFlash2) 2. 打开模型管理器(http://127.0.0.1:8891/admin/dashboard?tab=models&modelsTab=manager)并编辑 `mlx-community/Qwen3.8-27B-4bit`。配置 DFlash 设置: - **DFlash**:启用 - **草案模型**:`incoai/Qwen3.8-27B-DFlash2` - **草案量化**:启用 - **运行时块大小**:`5` - **验证模式**:`dflash` 3. 保存设置并加载目标模型。 ## 正确的令牌已存在(https://inco.ai/blog/dflash2/#the-right-tokens-are-already-there) DFlash 独立并行预测每个位置。每个选择单独看都合理,但它们缺乏连贯性,不连贯的块会在验证时被截断。Domino(https://arxiv.org/abs/2605.29707)和 DSpark(https://arxiv.org/abs/2607.05147)等方法通过顺序马尔科夫头重写每个位置的完整词汇分布来换取连贯性。但这种昂贵的自回归修正确实必要吗? 答案是否定的,证据就在 DFlash 自身的候选列表中。以第一个位置为例:DFlash 的首选预测正确率为85.4%,但正确令牌在其前16个候选中出现的比例达99.5%。即使首选错误,正确令牌通常仍在列表内。 | 指标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | | 验证长度 | — | — | — | — | — | — | — | | Recall@1 | 85.4% | 80.3% | 79.4% | 78.3% | 77.5% | 75.9% | 72.9% | 4.27 | | Recall@16 | 99.5% | 97.3% | 94.8% | 92.6% | 90.8% | 89.4% | 87.8% | 6.79 | *表1. 每个草案位置在先前位置均正确的条件下的 Recall@1(首选正确率)和 Recall@16(正确令牌在前16候选中的比例)。基于 GSM8K 的五层 Qwen3-4B DFlash。验证长度包含验证器的下一个令牌。* 一个总能从前16个候选中选出正确令牌的神谕,可将验证长度从4.27提升至6.79。**这个差距是纯粹的选择优化空间**,我们只需选择正确的候选路径。 扩散式草案生成擅长...(同词重复?)...而自回归/投机解码较慢...位置1解码...位置2思考...位置3再次...所有相邻对同时评分→保留一条路径→ 图1. 单个周期的选择器。使用纯 DFlash 时,每个位置仅保留首选;此处两个相邻位置选择相同词,结巴现象在验证时终止。DFlash 2 保留每个位置的前16个候选,选择器通过它们追踪一条连贯路径;此处整个块被接受。 ### 轻量级路径选择器(https://inco.ai/blog/dflash2/#a-lightweight-path-selector) 连贯性主要是局部的:候选的适配度主要取决于前一个令牌,因此对相邻对评分即可。DFlash 2 在每个位置保留前16个候选,并对每个相邻对评分:对于前驱 $a$ 和当前候选 $b$, $$S_t(a,b) = U_t(b) + \langle A(a) \odot H(h_t), B(b) \rangle.$$ 评分包含两部分。第一部分 $U_t(b)$ 是 DFlash 自身的 logit:草案模型对 $b$ 的喜好程度。第二部分评估 $b$ 对 $a$ 的承接度:$A$ 和 $B$ 为每个令牌提供紧凑的256维嵌入,两个嵌入在上下文门控 $H(h_t)$ 下匹配,决定匹配的哪些部分起作用。本质上,这是对相邻候选的低秩双线性注意力。 评分保持完全并行。每个位置的所有相邻对一次性完成评分,无需额外主干网络或语言模型头传递。唯一的顺序工作是最后对预计算评分的遍历:从最后一个已验证令牌开始,贪心地遵循每一步的最佳后继,采样从相同评分中抽取,拒绝采样恢复精确的目标分布。 | 方法 | 参数 | 延迟 | T=0 | T=1 | | :--- | :--- | :--- | :--- | :--- | | DFlash | — | — | 4.27 | 3.78 | | + DSpark 校正 | +77.8M | +9.6% | 4.49 | 4.08 | | + 路径选择(本文) | +2.0M | +0.6% | **4.61** | **4.25** | *表2. 仅使用路径选择(无卷积)的验证长度,基于 GSM8K 的五层 Qwen3-4B。开销相对于原始 DFlash:草案模型新增参数和草案-验证循环延迟增加。* 选择器在 T=0 和 T=1 时分别将 DFlash 性能提升 **0.34** 和 **0.47** 个令牌。在两种设置下均优于 DSpark 校正,且参数量减少约40倍,延迟开销降低16倍。选择比预测更廉价,且仍有提升空间(神谕达到6.79)。成对评分是我们能想到的最简单选择器,我们相信还有大量探索空间。 ## 后缀衰减是局部问题(https://inco.ai/blog/dflash2/#suffix-decay-is-a-local-problem) 我们还注意到上述两行召回率(表1)在块末尾下降。即使是神谕也会衰减:完美选择下,准确率仍从第一个位置的99.5%降至最后一个位置的87.8%。没有选择器能修复此问题,因为候选本身已耗尽。我们称此现象为**后缀衰减**,这是主干网络的问题。 一个怀疑是模型容量:五层主干网络可能太小,无法维持跨越整个块的依赖关系。如果是这样,深度应在后期位置帮助最大。事实确实如此!3层、5层和15层 DFlash 模型在第一个位置几乎相同,随后逐渐分化。但深度是无差别的:十个额外注意力块在所有位置增加容量,包括几乎没有提升空间的早期位置,并削弱了 DFlash 的效率优势。 图2. GSM8K 上 T=0 时 Qwen3-4B 的 Recall@1,条件为每个先前位置均正确。所有草案模型在相同设置下训练;卷积模型在未使用选择器的情况下评估。其卷积增加3%参数和0.7%循环延迟;15层的十个额外层增加15.2%。 草案位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- DFlash 3L | 85.21% | 79.26% | 77.18% | 75.75% | 73.96% | 70.4% | 64.97% DFlash 5L | 85.39% | 80.31% | 79.39% | 78.27% | 77.39% | 76.03% | 72.86% DFlash 15L(3× 参数) | 86.42% | 81.61% | 80.68% | 80.34% | 80.59% | 79.66% | 78.73% DFlash 5L + conv(+3% 参数) | 85.83% | 80.94% | 79.98% | 79.68% | 79.73% | 79.43% | 77.61% 图2. GSM8K 上 T=0 时 Qwen3-4B 的 Recall@1,条件为每个先前位置均正确。所有草案模型在相同设置下训练;卷积模型在未使用选择器的情况下评估。其卷积增加3%参数和0.7%循环延迟;15层的十个额外层增加15.2%。 我们希望进行针对性修复,DFlash 的注意力机制显示了方向。它有两个职责:读取块前上下文,以及建模块内依赖。但它在第二项上投入越来越少:块的注意力占比从**第1层的30%降至第5层的8%**,且剩余部分集中在越来越少的注意力头中(图3)。因此我们拆分职责:专用模块处理块内工作,注意力机制则专注读取上下文。 (热力图数据显示各层注意力头在块内的质量分布) 图3. 五层 Qwen3-4B DFlash 中各注意力头的块内注意力。较亮的单元格标记对草案块投入更多注意力的头;在后几层,块内注意力质量减少并集中于少数头。 ### 轻量级局部卷积(https://inco.ai/blog/dflash2/#a-lightweight-local-convolution) 块内工作本身就是短程的:块仅跨越4到16个令牌,最紧密的依赖存在于相邻位置之间。自然的操作是短卷积:两个抽头,一个在当前位置,一个回溯一个位置,权重随内容自适应。受 Canon Layers(https://arxiv.org/abs/2512.17351)、Dynamic Short Convolutions(https://arxiv.org/abs/2606.03825)和 Convolution for Large Language Models(https://arxiv.org/abs/2607.18413)启发,我们在每个注意力和前馈子层前后插入此双抽头动态深度可分离卷积: $$\operatorname{Conv}_k(x)_t = k_{t,0} \odot x_t + k_{t,1} \odot x_{t-1}.$$ 每个系数结合学习的基础核与基于当前隐藏状态计算的小修正;每16个通道共享一个修正。第一个位置读取最后一个已验证令牌的表示,每个后续位置读取其前驱的表示。信息跨越块传播,同时所有位置保持并行计算。 ×5层 | 注意力 | MLP | ... ---|---|---|--- 卷积内部 — 每个位置取两个抽头 | x | Conv(x) | 已验证位 pos1 | pos2 | pos3 | pos1 | pos2 | pos3 k1·前驱 | k0·自身 | 双抽头卷积 | 最后已验证令牌 | 草案位置 图4. 双抽头动态卷积。它位于每个草案层每个注意力和MLP子层的前后。内部,每个位置将其表示与其前驱混合,第一个位置读取最后一个已验证令牌。 该卷积是块局部且无状态的,因此可直接嵌入 DFlash 而不改变注意力、语言模型头或验证机制。 仅**增加1650万参数(3%)**,带卷积的五层 DFlash 接近15层 DFlash(图2),显著缓解后缀衰减。卷积为草案-验证循环延迟增加**0.7%**;十个额外 Transformer 层增加15.2%。第4层和第5层的平均块内注意力也从**9.4%降至0.5%**,表明卷积吸收局部工作,而注意力恢复读取上下文。一个回溯一个位置的核恢复了十个额外层带来的大部分收益:后缀衰减主要是*局部*问题。 ## 综合应用(https://inco.ai/blog/dflash2/#putting-it-together) 到目前为止,选择器和卷积是分开测量的;下表(表3)将它们结合。我们在匹配设置下自行训练 DFlash 和 DSpark 草案模型,而 MTP 随模型提供。 | 数据集 | MTP | DFlash | DSpark | DFlash 2 | | :--- | :--- | :--- | :--- | :--- | | GSM8K | 4.78 | 4.99 | 5.69 | **6.20** | | MATH-500 | 5.04 | 5.42 | 6.20 | **6.76** | | HumanEval | ... | ... | ... | ... | (表格内容延续原文)

相似文章

DFlash:用于快速投机解码的块扩散

Papers with Code Trending

DFlash 是一种新的投机解码框架,它使用轻量级的块扩散模型进行并行标记起草,与自回归方法相比,实现了超过 6 倍的加速。在保持高输出质量的同时,其性能显著优于现有的最先进方法(如 EAGLE-3)。