Skip to content

feat: add Qwen3.8 DFlash2 decoding support. - #2279

Draft
pjgao wants to merge 9 commits into
xLLM-AI:mainfrom
pjgao:feat/qwen38-dflash2-npu
Draft

feat: add Qwen3.8 DFlash2 decoding support.#2279
pjgao wants to merge 9 commits into
xLLM-AI:mainfrom
pjgao:feat/qwen38-dflash2-npu

Conversation

@pjgao

@pjgao pjgao commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

说明

本 PR 为 xLLM 增加 Qwen3.8-27B 的 DFlash2 投机解码首版功能支持,并对齐 zLab 官方实现与模型卡的解码合同:

当前定位仍是功能支持、正确性与可观测性闭环。本轮补齐了 PR HEAD 上的典型长度、最优 MTP 多步和 P1/P8 性能矩阵;没有为追求数据引入额外 kernel 或大范围代码改动。

主要改动

  • 注册 DFlash2 算法并解析 checkpoint 中的 dflash_config
  • 增加 DFlash2 draft model 与独立 worker,实现动态分组卷积、context KV 写入和 Top-K Markov 候选路径采样。
  • 复用 DFlash 的 prefill、target verify、rejection sampling 与缓存生命周期,DFlash2 特有逻辑保持在 worker/model 边界内。
  • selector proposal 仅使用官方规定的 temperature softmax;top_ptop_k、惩罚与 grammar 只在 target verify 侧生效。
  • 为 NPU FIA 增加非因果滑窗 band 参数,保留 block non-causal、sliding-window 注意力语义。
  • Qwen3.8 hybrid recurrent target 要求启用 ACL Graph;expanded spec-verify replay 保证接受/纠错后的 GDN checkpoint 无损。eager 配置在启动期明确失败。
  • 修复 hybrid target recurrent-state metadata 被复制到纯 full-attention MTP draft prefill 的问题,恢复同分支 MTP ACL Graph warmup。
  • 修正 DFlash2 /vars 接受统计列语义,增加 N 个 draft position 的接受计数;位置标签预生成,N7 使用 inline small vector,避免 decode 热路径堆分配。
  • 新增文件及本次新增许可证头使用 https://github.com/xLLM-AI/xllm/blob/main/LICENSE;不改动仓库既有历史 LICENSE 链接。

官方模型卡复现与接受机制

官方 GSM8K 合同:128 prompts、concurrency=1、block size=8(7 drafts)、temperature=1、top_p=0.95、top_k=20、reasoning=xhigh、max_new_tokens=4096。

  • DFlash2 acceptance length:5.366
  • 官方模型卡:5.46;差异 -1.73%。
  • 95% CI:[5.252, 5.479],覆盖官方值。
  • 该 128 条结果来自功能提交 64cfd06e 的精确二进制;后续 DFlash2 直接改动仅修正接受 telemetry,最终性能矩阵另用 PR HEAD 精确二进制,不把两者伪装成同一 binary。

修正统计后,使用官方合同前 16 条做同机、同 TP、同 N7 机制对照:

指标 DFlash2 N7 MTP N7 DFlash2 相对结果
模型卡口径平均 acceptance length 5.503 4.815 +14.27%
全局 decoded tokens / verify step 5.031 4.662 +7.91%
引擎平均接受 draft tokens / step 4.056 3.739 +8.46%
accepted / attempted draft tokens 57.94% 53.42% +4.52 pp

16 条属于 SMOKE_ONLY,用于验证机制与统计语义,不作为 SLA。

多步接受率

固定 N7 下以 proposal sequence 数为共同分母:

Draft position DFlash2 MTP DFlash2 差值
1 88.25% 88.42% -0.18 pp
2 77.59% 75.10% +2.49 pp
3 66.69% 61.87% +4.82 pp
4 56.03% 49.51% +6.52 pp
5 46.61% 39.98% +6.63 pp
6 39.38% 32.78% +6.60 pp
7 32.37% 26.07% +6.30 pp

第 1 步基本持平;DFlash2 从第 2 步开始反超,第 4–7 步保持约 6.3–6.6 pp 优势,符合 DFlash2 的多步接受特征。

PR HEAD 典型场景性能

测试合同

  • 性能矩阵代码基线:935285a12a00b1a888173f1e2d67c617fcb99fe2;当前功能与检视修复 HEAD:a0c2641d8cc6b29650ece1e04e13528c4d43752e
  • 正式矩阵二进制 SHA256:2ac0b23678714b3f271ecc17dacb6f9002b2e9615531eefa4ed9c2ddee8c24ad
  • Qwen3.8-27B、TP2、两颗健康 NPU、ACL Graph、LCCL。
  • 完整 Multi-GSM8K:最终 12 道数学题保持相同,背景长度扩展为精确 2K/4K/8K chat-template tokens;固定输出 2K。
  • temperature=1、top_p=0.95、top_k=20、ignore_eos、stream、warmup=1;每点 8 个正式请求。
  • MTP 对每个长度和目标独立搜索 N3/N5/N7。DFlash2 使用 checkpoint 对应 N7;P1 schedule-overlap=on,P8 schedule-overlap=off。MTP 使用其最优 overlap-on 配置。
  • 两个 EvalScope 未完成 attempt 被排除;它们没有进入任何性能结果。
  • 4K P8 首轮 cleanup snapshot 曾把物理设备 ID 错查为 board ID,原始 artifact 保留为 FAILED;96 秒后的修正快照确认两颗目标 NPU 健康空闲,同配置复测 cleanup PASS。

P1 低时延

主指标采用 E2E/TPOT;TTFT 单独报告。

场景 DFlash2 N7 E2E / TPOT / TTFT 最优 MTP E2E / TPOT / TTFT DFlash2 E2E收益 TPS收益
2K+2K 21.2585 s / 10.16 ms / 454.94 ms MTP N3: 27.4078 s / 13.16 ms / 463.80 ms +22.44% +28.34%
4K+2K 23.3029 s / 11.03 ms / 722.29 ms MTP N7: 26.9157 s / 12.81 ms / 688.53 ms +13.42% +15.21%
8K+2K 21.5397 s / 9.93 ms / 1203.32 ms MTP N3: 27.9632 s / 13.07 ms / 1202.25 ms +22.97% +29.23%

TTFT 不隐藏:2K DFlash2 更好;4K 慢 4.90%;8K 慢 0.09%。三个场景的 decode TPOT、E2E 和 output TPS 均优于最优 MTP。

P8 高吞吐

场景 DFlash2 N7 output TPS / E2E 最优 MTP output TPS / E2E DFlash2 TPS收益
2K+2K 396.8116 / 37.2219 s MTP N5: 363.4225 / 41.9452 s +9.19%
4K+2K 367.0852 / 41.3079 s MTP N3: 344.8297 / 45.4532 s +6.45%
8K+2K 329.2602 / 46.1531 s MTP N5: 314.1790 / 50.1589 s +4.80%

P8 重复轮采用更保守的“DFlash2 最差轮 / MTP 最好轮”后,2K/4K/8K 仍分别领先 9.17% / 4.44% / 1.32%。这些结果用于工程门槛,不外推为生产 SLA。

EvalScope 与 /vars 双口径

以下是 P1 正式点;/vars 平均接受 draft 是跨不同深度比较的主要接受长度口径。

场景 算法 EvalScope 接受率 decoded/iter /vars 接受率 /vars 平均接受 draft
2K+2K DFlash2 N7 78.82% 4.7224 50.02% 3.5011
2K+2K 最优 MTP N3 67.82% 3.1074 70.86% 2.1259
4K+2K DFlash2 N7 77.93% 4.5316 48.46% 3.3920
4K+2K 最优 MTP N7 75.76% 4.1258 43.44% 3.0411
8K+2K DFlash2 N7 78.88% 4.7359 50.72% 3.5505
8K+2K 最优 MTP N3 68.27% 3.1511 72.37% 2.1710

/vars token 接受率受 N3/N7 分母影响,不能脱离深度直接判断优劣;平均接受 draft 和 decoded/iter 更适合比较实际每轮产出。

长度、数据集与适配归因

对照 观察 归因
官方 GSM8K 128 条 acceptance length 5.366,官方 5.46,CI 覆盖官方值 官方算法/采样合同可复现
完整 Multi-GSM8K 2K→8K DFlash /vars 3.5011→3.5505,未随长度下降 未观察到 xLLM 长序列适配退化
长文本续写 2K→8K DFlash 1.9432→2.0122,略低于 MTP N7,但跨长度稳定 数据集/生成分布偏好,不是长度 bug
单题 GSM8K 强制输出到 2K 8K 平均接受 draft 1.4376 自然答案结束后的强制续写,不代表正常 GSM8K
旧 prefix-truncated workload 8K 出现长尾和吞吐退化 截断最终任务的 OOD 压力项,不纳入典型结论

当前证据支持:效果好坏主要由数据集与 workload 合同决定,未发现 DFlash2 在 xLLM 中随 2K/4K/8K 增长而系统性退化。若同一完整数据集、相同采样和固定 N7 下,逐位置接受率随长度单调大幅下降,才应优先检查 context KV、位置编码、sliding-window 或 recurrent state 适配。

构建与正确性边界

  • MAX_JOBS=16 python setup.py build:性能矩阵基线 935285a12 通过;检视修复未重新构建正式矩阵二进制。
  • 正式矩阵所有入选 DFlash2 请求完成,并保留 EvalScope summary/percentile、/vars、逐位置统计、启动命令和清理证据。
  • 早期精确功能二进制已通过 205-token greedy target-only token-by-token 对照;PR HEAD 的正式矩阵验证实际最终二进制功能。
  • 矩阵结束后额外尝试重跑 PR HEAD token equality:target-only 完成,随后三个 DFlash2 服务在权重加载前无 fatal 日志退出,换新 API/master/HCCL 端口仍复现;每次均清理到健康空闲状态。该补测标记为 INCONCLUSIVE,不伪装成 PASS,也不进入性能数据。
  • git diff --check、Python 语法检查、7 个受影响 C++ 翻译单元 -fsyntax-only:通过;未触发全量重建或 NPU workload。
  • checkout 含预存 submodule 状态,workflow preflight 因此为 INCONCLUSIVExllm_ops 是 HCCL struct 名称兼容性重命名,早于构建且不经过本次 Qwen3.8 dense DFlash2/MTP 路径。矩阵结论限定为同一精确二进制的公平 A/B,不冒充 clean-checkout PR gate。
  • 上一轮 GitHub x86 NPU job 已完成编译,但在 ctest 的 python_executor_test 失败;最新 HEAD 已触发新一轮 CI,本描述不提前标记全量门禁通过。

后续性能能力

典型 Multi-GSM8K 目标已超过最优 MTP,但高并发/更多数据集/更长上下文和更大裕量仍需要后续能力:

  1. [batch, draft_steps, vocab] dense proposal probability 改为 sparse candidate/rejection-sampling 接口。
  2. 融合 Top-K、codebook score、路径采样和 probability 生成,减少 host 驱动采样。
  3. 融合动态分组卷积。
  4. 将 proposal 路径纳入 ACL Graph,减少下发与同步开销。
  5. overlap context-KV 投影/写入与 target verify。

当前 profile 不足以为每项单独承诺收益,因此不写未经验证的百分比目标。后续重点是扩大 8K P8 的保守裕量,并补齐 16K/32K、真实长文本/代码数据集、DP/CP、高并发与容量矩阵。

当前结论

  • 功能支持:完成。
  • 官方解码合同:完成对齐;128 条 acceptance length 复现为 5.366。
  • 接受统计:修正并补齐逐位置观测。
  • 接受机制:官方合同下 DFlash2 平均接受长度高于 MTP,第 2–7 步存活率优势明确。
  • 典型性能:PR HEAD 上,DFlash2 在 2K/4K/8K 的 P1 E2E/TPOT 和 P8 output TPS/QPS 均超过逐场景搜索的最优 MTP 多步。
  • 归因:完整任务未见随长度退化;长文本接受长度较低主要表现为模型/数据集偏好,截断与 EOS 后强制续写属于 workload artifact。

Add DFlash2 checkpoint configuration, draft-model registration, and a dedicated worker for block proposal and path sampling.

Implement dynamic grouped convolution, Top-K Markov candidate selection, context-KV transfer, and Qwen3.8 hybrid-target speculative verification while reusing the existing DFlash lifecycle.

Preserve non-causal sliding-window attention semantics and add focused grouped-convolution tests.
Comment thread xllm/core/layers/common/dflash2_grouped_conv.cpp Outdated
pjgao added 8 commits August 20, 2026 20:51
对齐官方 DFlash2 selector 的温度采样语义,避免在草稿候选分布上重复应用 target 侧 top-p、top-k 与惩罚。

为 FIA 增加非因果滑窗 band 参数,并要求 Qwen3.8 hybrid recurrent target 使用 ACL Graph,以保证投机校验后的 GDN 状态可无损回放;eager 路径改为启动时快速失败。

将主仓库内遗留的 LICENSE 链接统一更新到 xLLM-AI 组织地址。

验证:MAX_JOBS=16 python setup.py build 通过;DFlash2 grouped-conv 2/2 通过;greedy 205 token 与 target-only 完全一致。官方 GSM8K 128 请求口径接受长度为 5.408,接近模型卡 DFlash2 5.46,并高于模型卡 MTP 5.02。
修复 hybrid recurrent target 的线性状态元数据泄漏到 MTP draft prefill,恢复 Qwen3.8-27B MTP 的 ACL Graph warmup。\n\n修正 DFlash2 接受 token 的列语义,补充逐位置接受计数,并避免 N7 热路径上的标签与计数堆分配。
按主仓库 clang-format 规则调整接受计数表达式,修复 PR format-check。
恢复历史文件原有的 jd-opensource LICENSE 链接。

仅本次新增的 DFlash2 文件使用 xLLM-AI LICENSE 链接,避免无关的批量头部修改。
集中维护 DFlash2 算法名和 draft model type,统一替换 runtime、model 和 layer 中分散的判断点。

保留 MTP hybrid metadata 清理,并补充共享正确性说明,避免将其误认为仅用于性能对比的临时改动。
补齐 DFlash2 draft 各层 attention、MLP、norm 与卷积权重校验,缺失融合权重时报告具体 checkpoint 名称。

将显式滑窗 mask 对齐 FIA band 的逐 query 语义,并补充卷积行布局校验和 NPU-only 平台提示。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants