DFlash `draft-dflash` acceptance stuck at ~0.15 with official z-lab Qwen3 drafters (8B + 4B, all target precisions, CPU + Vulkan) — net slow

用户在 llama.cpp b10048 (commit 2e1fd76) 上运行 llama-server 或 llama-cli ,使用 --spec-type draft-dflash 模式,配合官方 z-lab 提供的 DFlash 草稿模型(如 Qwen3-8B-DFlash-b16 或

DFlash `draft-dflash` acceptance stuck at ~0.15 with official z-lab Qwen3 drafters (8B + 4B, all target precisions, CPU + Vulkan) — net slow

DFlash `draft-dflash` acceptance stuck at ~0.15 with official z-lab Qwen3 drafters (8B + 4B, all target precisions, CPU + Vulkan) — net slow

快速结论:该问题发生在 llama.cpp 的 DFlash 投机解码(draft-dflash)中,用户使用官方 z-lab/Qwen3-8B-DFlash-b16 或 4B 版本草稿模型时,接受率(draft acceptance)始终卡在约 0.15,导致无加速甚至净减速。优先排查两个因素:(1) --spec-draft-p-min 默认值为 0.0 被证实是导致接受率异常的主要原因之一;(2) 新版统一投机流水线可能存在上下文喂入逻辑回归,导致平均接受长度远低于旧版。

问题场景

用户在 llama.cpp b10048 (commit 2e1fd76) 上运行 llama-serverllama-cli,使用 --spec-type draft-dflash 模式,配合官方 z-lab 提供的 DFlash 草稿模型(如 Qwen3-8B-DFlash-b16 或 Qwen3-4B-DFlash-b16)。问题在 CPU 和 Vulkan 后端均可复现,且与目标模型精度(F16、Q4_K_M、Q8_0)无关。

报错原文

draft acceptance = 0.151 (87 accepted / 575 generated), mean len = 3.17

且报告指出:

Net slowdown in every configuration.
Control (draft-simple with Qwen3-0.6B): acceptance 0.87–0.998 on same prompts — issue is DFlash-specific.

原因分析

经 Issue 提交者通过二分法排查,找到两个独立但叠加的问题:

  • 主要原因(已被确认):在 commit b9235(d14ce3da)中,--spec-draft-p-min 的默认值被变更为 0.0(原为较高值)。这意味着草稿模型不会在低置信度 token 处停止,每个区块都生成长度为 --spec-draft-n-max(默认 15 或更多)的完整草稿。这导致每次验证的 token 数量膨胀,使接受率(accepted/generated 比值)从 ~0.94 骤降至 ~0.30。通过显式设置 --spec-draft-p-min 0.75,DFlash 的接受率可从 ~0.15 恢复到 ~0.95。
  • 可能的原因(推测):即使 p_min 恢复后,新版统一作弊流水线(unified speculative pipeline)中,草稿模型的上下文喂入语义可能与旧版(b8400 等)不同。具体表现为:平均接受长度(mean accepted length)在旧版可达 40+,在新版(b10048)中仅约 4.2。提交者推测这可能与 common_speculative_process() 在验证批次中向 DFlash 编码器传入了被拒绝位置的隐藏状态,而非仅保留已接受前缀有关。

环境排查

  • 确认 llama.cpp 版本:b10048 或更早版本(问题在 b9235 引入,b9222 正常)。
  • 确认 --spec-draft-p-min 参数当前值(默认 0.0 是回归的根因)。
  • 确认目标模型和草稿模型均已正确转换为 GGUF 格式,且转换命令符合 docs/speculative.md 说明,验证 general.architecture=dflashdflash.block_size=16 等元数据存模型文件中。
  • 检查是否同时使用了 --spec-type draft-simple,确认该模式受同一 p_min 默认值变化影响。
  • 如果从旧版本升级而来,确认之前是否使用了非默认的 --spec-draft-p-min--draft-max 等参数。

解决步骤

  1. 显式设置 --spec-draft-p-min在启动 llama-serverllama-cli 时,添加参数 --spec-draft-p-min 0.75(或参考旧版配置使用其他大于 0 的值)。这是当前能将接受率从 ~0.15 恢复到 ~0.95 的唯一确认解决方案。
  2. 检查并调整 --spec-draft-n-max提交者测试中,即使恢复 p_min,平均接受长度仍远低于预期(~3.8 对已发表论文的 ~6 倍加速)。可尝试增大 --spec-draft-n-max(例如 48 或更高),但需注意这可能会因上下文喂入语义的不同而导致返回值递减。
  3. 回退 llama.cpp 版本至 b9222 或更早:如果上述步骤无法恢复旧版性能,且必须使用 DFlash 模式,可以尝试使用 b9222 或更早版本(b9235 之前),在这些版本中默认流水线语义和 p_min 默认值与 z-lab 参考实现更一致。注意:这只是一个暂时方案,可能会丧失后续版本的修复和优化。
  4. 交叉验证使用 --spec-type draft-simple如果 DFlash 仍无法达到预期加速,可以切换为传统的 draft-simple 模式(使用类似 Qwen3-0.6B 的草稿模型并加上 p_min)以验证目标模型本身和系统环境没有其他问题。

验证方法

启动 llama-serverllama-cli 后,发送一个测试请求(如简单的补全或聊天请求),查看日志输出中的 draft acceptance 行。确认其值从 ~0.15 提升到 0.80 以上(理想情况 0.90-0.99)。同时关注总生成吞吐量(tok/s)是否高于或不低于不使用投机解码的同一目标模型。如果问题依旧,请检查 --spec-draft-p-min 参数是否正确传递(可用 --help 输出确认),并参考 Issue 讨论中的详细日志进行进一步排查。

参考来源

ggml-org/llama.cpp #25792

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 13985

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注