DFlash draft acceptance rate collapses to zero when using quantized –cache-type-k-draft (or v)

用户在 llama.cpp 的 llama-server 中使用 DFlash 推测解码( --spec-type draft-dflash )时,通过 --cache-type-k-draft q8_0 或 --cache-type-v-draft q8_0 将草稿模型的 KV 缓存类型设置为量化

DFlash draft acceptance rate collapses to zero when using quantized --cache-type-k-draft (or v)

DFlash draft acceptance rate collapses to zero when using quantized –cache-type-k-draft (or v)

快速结论:当对 DFlash 推测解码的草稿模型 KV 缓存使用量化类型(如 q8_0)时,草稿接受率会从 80-99% 骤降至接近 0%。根本原因是量化后的 KV 缓存缺失了注意力旋转(attention rot)操作,导致缓存数据不一致。优先检查是否使用了量化的草稿缓存类型,并确认是否已应用修复补丁。

问题场景

用户在 llama.cppllama-server 中使用 DFlash 推测解码(--spec-type draft-dflash)时,通过 --cache-type-k-draft q8_0--cache-type-v-draft q8_0 将草稿模型的 KV 缓存类型设置为量化格式后,草稿接受率从正常的 80-99% 跌至 0-2%。该问题在 Windows(MSVC/CUDA/Vulkan)和 Linux/WSL(GCC/CUDA/Vulkan)上均能复现,与后端和编译器无关。正常推理和 MTP 推测解码不受影响。该问题自 DFlash 首次合并以来就已存在。

报错原文

--spec-type draft-dflash --cache-type-k-draft f16 --cache-type-v-draft f16 : up to 99% draft acceptance
--spec-type draft-dflash --cache-type-k-draft q8_0 --cache-type-v-draft q8_0 : 0-2% draft acceptance
LLAMA_ATTN_ROT_DISABLE=1 --spec-type draft-dflash --cache-type-k-draft q8_0 : restores 99% draft acceptance

原因分析

根本原因在于量化 KV 缓存的注意力旋转(attention rot)缺失。在 llama.cpp 中,注意力旋转操作仅对量化类型的 KV 缓存执行,对 f16bf16 类型不执行。DFlash 推测解码从目标模型 KV 缓存注入数据时,目标模型的 KV 缓存已经过旋转,但 DFlash 草稿 KV 缓存却未进行旋转,导致缓存数据不匹配。这使得 DFlash 草稿接受率几乎归零。设置 LLAMA_ATTN_ROT_DISABLE=1 可以暂时绕过该问题,因为会全局禁用旋转,从而使目标模型和草稿模型的 KV 缓存状态一致。

环境排查

  • llama.cpp 版本:至少从 b9970 到 b10032 版本受影响。
  • 操作系统:Windows(MSVC/Clang)、Linux/WSL(GCC)
  • 后端:CUDA、Vulkan
  • 模型:目标模型(如 bartowski/deepreinforce-ai_Ornith-1.0-35B-GGUF)和 DFlash 草稿模型(如 williamliao/Qwen3.6-35B-A3B-DFlash-GGUF)
  • 启动参数:检查是否使用 --cache-type-k-draft q8_0--cache-type-v-draft q8_0 或其他量化类型,以及是否使用 LLAMA_ATTN_ROT_DISABLE=1

解决步骤

  1. 确认问题:检查启动脚本中是否包含 --cache-type-k-draft q8_0--cache-type-v-draft q8_0。记录无量化(默认 f16/bf16)时的草稿接受率作为基线。
  2. 应用修复:该问题已在 llama.cpp PR #25823 中修复。将 llama.cpp 更新到包含该 PR 的版本(或在上述 PR 合并后的主分支版本)。
  3. 临时绕过方法:如果无法立即更新代码,可以设置环境变量 LLAMA_ATTN_ROT_DISABLE=1 来绕过该问题。注意:这可能影响模型精度,不推荐长期使用。
  4. (可优先尝试)再次测试:更新代码后,用原来的量化参数(--cache-type-k-draft q8_0 --cache-type-v-draft q8_0)启动服务器,验证草稿接受率是否恢复到 f16/bf16 的同等水平。

验证方法

启动 llama-server 后,对同一组提示词进行推测解码,观察服务端日志中的 Draft acceptance 统计值。正常值应恢复到 80-99% 的范围,而非 0-2%。可用 LLAMA_ATTN_ROT_DISABLE=0(即允许旋转)配合量化草稿缓存类型进行测试。

参考来源

ggml-org/llama.cpp #25725

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 14089

发表回复

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