[speculative/mtp] Flash-Attention crash in gemma4-assistant: Query head dimension mismatch (neq0 != HSK / D=2048/4096)

该报错通常发生在 llama-server 启用 MTP 草稿模型( --spec-type draft-mtp )做投机解码、且开启 Flash-Attention( -fa on )时:draft 图传入 FA 的查询头维度是 2048/4096,而内核期望 256,于是触发维度断言崩溃。优先排

快速结论:该报错通常发生在 llama-server 启用 MTP 草稿模型(--spec-type draft-mtp)做投机解码、且开启 Flash-Attention(-fa on)时:draft 图传入 FA 的查询头维度是 2048/4096,而内核期望 256,于是触发维度断言崩溃。优先排查 MTP 草稿路径与 FA 的兼容性。

适用环境:Issue 已确认:llama.cpp 0.5.0-dev(build 1,commit cd74ef6),IntelLLVM 2026.0.0,Linux x86_64;后端为 SYCL(交叉验证的 Vulkan Issue #29418 也有相同表现);硬件为 Ryzen 9700X、Intel Arc B580 12GB(TP=1 与 TP=2 均复现);模型为 gemma-4-31B-it-qat-GGUF:UD-Q4_K_XL + MTP draft mtp-gemma-4-31B-it.gguf。Python 与 CUDA 版本在 Issue 中没有记录。

最快修复方案:暂无确认的一步修复方案。Issue 中已验证的对照结论是:关闭 MTP(不使用 --spec-type draft-mtp)时不再崩溃,可作为规避手段。

注意事项:关闭 MTP 会失去投机解码带来的加速;Issue 标签为 bug-unconfirmed,根因分析来自用户自行提交的报告(含借助外部工具的分析),未由维护者确认。根因被定位在 MTP draft 图构建前端,因此单纯更换后端(SYCL/Vulkan)、量化(q8_0/f16/bf16)、上下文大小或单卡/多卡都不能规避。

问题场景

用户在 Linux 上运行 llama-server,加载 unsloth/gemma-4-31B-it-qat-GGUF:UD-Q4_K_XL 主模型和 mtp-gemma-4-31B-it.gguf 草稿模型,同时开启 --spec-type draft-mtp --spec-draft-n-max 4 与 -fa on。Prompt 处理正常,但在生成阶段(示例中 task 0、n_gen = 159 附近)进程收到 SIGABRT 退出。用户反馈在读取较大源文件、或目标模型拒绝全部草稿候选(accepted 0/4 draft tokens)后重新生成草稿时触发。

报错原文

ggml/src/ggml-sycl/fattn.cpp:318: Not support Flash-Attention

#4  ggml_sycl_flash_attn_ext(...) from libggml-sycl.so.0
#13 common_speculative_impl_draft_mtp::draft(...) from libllama-common.so.0
#14 common_speculative_draft(...) from libllama-common.so.0

Vulkan 后端(Issue #29418)的同类报错:

ggml-vulkan.cpp:8060: GGML_ASSERT(neq0 == HSK) failed
neq0 = 2048, HSK = 256   // TP=2
neq0 = 4096, HSK = 256   // 单卡

原因分析

从 Issue 中的复现矩阵看,崩溃与后端、量化、上下文大小、单卡/多卡都无关,共同点是启用了 MTP。可能原因是:MTP draft 图在构建时传给 Flash-Attention 的查询头维度(q->ne[0],即 neq0)为 2048(TP=2)或 4096(单卡),而 FA 内核期望的头维度 HSK 为 256,两者不匹配,导致 SYCL 路径直接判定“不支持 Flash-Attention”,Vulkan 路径则触发 GGML_ASSERT(neq0 == HSK)。触发点位于 common_speculative_impl_draft_mtp::draft(),发生在目标模型拒绝全部草稿候选、重新发起 draft decode 时。该定位目前是用户侧分析,尚待维护者确认。

环境排查

  • 确认 llama.cpp 构建版本与提交(Issue 为 0.5.0-dev build 1,commit cd74ef6),并确认是否为自己编译。
  • 确认后端:SYCL 与 Vulkan 均可复现,重点不在后端选择。
  • 确认是否启用了 MTP:启动参数中是否包含 --spec-type draft-mtp 及 --spec-draft-n-max。
  • 确认草稿模型是否为与主模型配套的 mtp-gemma-4-31B-it.gguf。
  • 如为多卡环境,记录单卡(TP=1)与多卡(TP=2)下的失败点差异(D=4096 与 D=2048)。
  • SYCL 环境可按 Issue 建议用 llama-ls-sycl-device 查看驱动与设备信息,用 llama-server --list-devices 确认设备 ID,并设置 GGML_SYCL_DEBUG=1 获取调试输出。

解决步骤

  1. 先做对照测试:移除 --spec-type draft-mtp --spec-draft-n-max 4,其余参数不变,重新运行同一 prompt,确认崩溃是否消失。Issue 中验证的结果是关闭 MTP 后不再崩溃。
  2. 如确认为 MTP 相关,保留 -fa on 但关闭 MTP 作为规避方案,待上游修复后再重新启用投机解码。
  3. 如需继续定位,使用 Issue 给出的可稳定触发的 prompt(关于下雨与风扇的两段问题)缩短复现路径,并考虑用 llama-bench 以更自动化的方式复现(可优先尝试):
    GGML_SYCL_DEV2DEV_MEMCPY=2 llama-bench \
     -hf unsloth/gemma-4-31B-it-qat-GGUF:UD-Q4_K_XL \
     -sm tensor -fa on -dev SYCL0,SYCL1
  4. 多后端共存时,按 Issue 建议显式限定后端设备(例如 -dev SYCL0,SYCL1),排除设备调度干扰后再判断问题是否仍存在。
  5. 收集完整日志与堆栈(含 D/neq0/HSK 数值),补充到上游 Issue,等待 MTP draft 图维度处理方面的修复。

验证方法

用同一 prompt 分别测试开启与关闭 MTP 两种情况:关闭 MTP 时连续多次生成不再出现 Not support Flash-Attention 或 GGML_ASSERT(neq0 == HSK) failed,且进程不再 SIGABRT,即可确认问题被规避。待上游修复后,在启用 MTP 且 -fa on 的情况下重复该 prompt,并重点观察“拒绝全部草稿后重新 draft”这一环节是否仍报维度不匹配,作为判定修复是否生效的依据。

参考来源

ggml-org/llama.cpp #29419

交叉参考:ggml-org/llama.cpp #29418(Vulkan 后端同类问题)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34583

发表回复

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