
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-server 或 llama-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=dflash和dflash.block_size=16等元数据存模型文件中。 - 检查是否同时使用了
--spec-type draft-simple,确认该模式受同一p_min默认值变化影响。 - 如果从旧版本升级而来,确认之前是否使用了非默认的
--spec-draft-p-min或--draft-max等参数。
解决步骤
- 显式设置
--spec-draft-p-min:在启动llama-server或llama-cli时,添加参数--spec-draft-p-min 0.75(或参考旧版配置使用其他大于 0 的值)。这是当前能将接受率从 ~0.15 恢复到 ~0.95 的唯一确认解决方案。 - 检查并调整
--spec-draft-n-max:提交者测试中,即使恢复p_min,平均接受长度仍远低于预期(~3.8 对已发表论文的 ~6 倍加速)。可尝试增大--spec-draft-n-max(例如 48 或更高),但需注意这可能会因上下文喂入语义的不同而导致返回值递减。 - 回退 llama.cpp 版本至 b9222 或更早:如果上述步骤无法恢复旧版性能,且必须使用 DFlash 模式,可以尝试使用 b9222 或更早版本(b9235 之前),在这些版本中默认流水线语义和
p_min默认值与 z-lab 参考实现更一致。注意:这只是一个暂时方案,可能会丧失后续版本的修复和优化。 - 交叉验证使用
--spec-type draft-simple:如果 DFlash 仍无法达到预期加速,可以切换为传统的 draft-simple 模式(使用类似Qwen3-0.6B的草稿模型并加上p_min)以验证目标模型本身和系统环境没有其他问题。
验证方法
启动 llama-server 或 llama-cli 后,发送一个测试请求(如简单的补全或聊天请求),查看日志输出中的 draft acceptance 行。确认其值从 ~0.15 提升到 0.80 以上(理想情况 0.90-0.99)。同时关注总生成吞吐量(tok/s)是否高于或不低于不使用投机解码的同一目标模型。如果问题依旧,请检查 --spec-draft-p-min 参数是否正确传递(可用 --help 输出确认),并参考 Issue 讨论中的详细日志进行进一步排查。


![[Bug] Disabled Weaviate document vectors are not deleted by segment ID](https://www.chat-gpts.plus/wp-content/uploads/2026/07/39174-10c10356-768x403.jpg)
