Eval bug: Unable to load Qwen MoE model with MTP and -sm tensor

用户使用 llama-server (版本 9219, commit 45b455e66),在 Linux + CUDA 后端、3 张 A6000(Ampere 架构)的环境下,加载 Qwen3.5-35B-A3B-MTP-GGUF 或 Qwen3.6-27B-UD-GGUF 模型时触发。问题复现命

Eval bug: Unable to load Qwen MoE model with MTP and -sm tensor

Eval bug: Unable to load Qwen MoE model with MTP and -sm tensor

快速结论:当同时使用 --spec-type draft-mtp(MTP 投机解码)和 --split-mode tensor(张量并行拆分)时,加载 Qwen MoE 模型(含 MTP 头)报 GGML_ASSERT(buffer) failedsplit_state 断言失败。优先排查:先单独去掉 -sm tensor--spec-type draft-mtp,看是否能正常加载;目前该组合在多个量化版本下均被证实有问题,且不限于 MoE 模型。

问题场景

用户使用 llama-server(版本 9219, commit 45b455e66),在 Linux + CUDA 后端、3 张 A6000(Ampere 架构)的环境下,加载 Qwen3.5-35B-A3B-MTP-GGUF 或 Qwen3.6-27B-UD-GGUF 模型时触发。问题复现命令:

./llama-server -m ~/models/qwen3.6/MTP/Qwen3.6-35B-A3B-UD-Q8_K_XL.gguf --split-mode tensor -ngl 999 --ctx-size 262144 --host 0.0.0.0 --port 8081 --parallel 1 --flash-attn on --spec-type draft-mtp --spec-draft-n-max 2

即同时启用 --split-mode tensor(多 GPU 张量并行)和 --spec-type draft-mtp(MTP 投机解码)时必现。相同参数对 Qwen3.6-27B 密集模型 Q8 量化版本成功,但对 Q6 量化版本仍失败。

报错原文

以下为两种不同断言的报错原文:

GGML_ASSERT(buffer) failed
# 完整 backtrace:
/llama.cpp/ggml/src/ggml-backend.cpp:119: GGML_ASSERT(buffer) failed
...
ggml_backend_meta_alloc_ctx_tensors_from_buft
llama_kv_cache::llama_kv_cache(...)
llama_model::create_memory(...)
llama_context::llama_context(...)
llama_init_from_model

以及另一种场景:

GGML_ASSERT(split_state.ne[j] * tensor->src[i]->ne[src_ss[i].axis] == sum * tensor->ne[split_state.axis]) failed
/llama.cpp/ggml/src/ggml-backend-meta.cpp:1015: GGML_ASSERT(split_state.ne[j] * tensor->src[i]->ne[src_ss[i].axis] == sum * tensor->ne[split_state.axis]) failed

原因分析

可能原因:llama.cpp 在创建 MTP 投机解码上下文时,与张量并行(-sm tensor)的显存分配逻辑存在冲突。具体表现为在调用 llama_kv_cachecreate_memory 时,ggml 后端无法正确分配 buffer(断言 buffer 为空),或拆分成 assert 时 tensor shape 不匹配。该问题在多个模型提供商(unsloth、AesSedai)的 GGUF 上均被复现,因此不是模型格式问题。

注意:Issue 讨论中用户尝试回退到 commit 39cf5d61915769124b7efbbfa69c46f19a6363ee 后问题仍然存在,说明该 Bug 并非由近期某个特定 commit 引入(或该 commit 未完全修复)。

环境排查

  • llama.cpp 版本:version 9219 (45b455e66),构建于 GNU 12.2.0 for Linux x86_64
  • Python / PyTorch 版本:Issue 未提及,但在使用 llama-server 时通常不依赖 Python 运行时
  • CUDA 后端:GGML backends 设为 CUDA
  • GPU 数量与架构:3× A6000 (Ampere 架构)
  • 模型量化版本:已测试 Q6_K 和 Q8_K 两种量化(UD 量化),均触发错误
  • 模型架构:Qwen MoE 模型含 MTP heads(35B-A3B-MTP);密集模型 Qwen27B 在 Q6_K 量化下也会触发第二个断言错误

解决步骤

  1. 临时绕过(可优先尝试):去除 --split-mode tensor 参数,使用默认的 --split-mode layer(逐层拆分),或单 GPU 运行(不指定 -sm)。经验证,此时模型可以正常加载。
  2. 替代方案:如果不使用 MTP 投机解码,可以不加 --spec-type draft-mtp 参数,仅使用 --split-mode tensor。Issue 报告者确认“仅开 -sm tensor 且不启用 MTP”可以成功加载 MoE 模型。
  3. 等待上游修复:截至 Issue 关闭(标签 bug-unconfirmed),该问题尚未被确认 Bug 或合并修复。建议关注 ggml-org/llama.cpp 后续更新,或尝试切换到 --split-mode none 或更新版本的 llama.cpp
  4. 验证模型完整性:可先用单 GPU + 无 MTP 模式加载相同模型,确认模型文件本身无损坏。

验证方法

使用以下命令(去掉 --split-mode tensor)能正常启动 llama-server 且无断言崩溃,即可证明问题与张量并行 + MTP 的组合相关:

./llama-server -m ~/models/qwen3.6/MTP/Qwen3.6-35B-A3B-UD-Q8_K_XL.gguf -ngl 999 --ctx-size 262144 --host 0.0.0.0 --port 8081 --parallel 1 --flash-attn on --spec-type draft-mtp --spec-draft-n-max 2

或者仅去掉 --spec-type draft-mtp 也能正常启动,则进一步确认是两者共存的兼容性问题。

参考来源

ggml-org/llama.cpp #23294

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 8154

发表回复

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