Misc. bug: test-llama-context crashing on deepseek41-moe.gguf

该报错出现在启用 Vulkan 后端、使用 GGML_SCHED_DEBUG_REALLOC=1 运行 llama.cpp 单元测试 test-llama-context 加载 DeepSeek MoE 模型时,属于后端调度器的图重分配检查失败导致 ggml_abort 。应优先排查后端调度与图重分

快速结论:该报错出现在启用 Vulkan 后端、使用 GGML_SCHED_DEBUG_REALLOC=1 运行 llama.cpp 单元测试 test-llama-context 加载 DeepSeek MoE 模型时,属于后端调度器的图重分配检查失败导致 ggml_abort。应优先排查后端调度与图重分配相关改动,而非模型文件本身。

适用环境:llama.cpp 0.8.0-dev(build 11976,commit 2e0d86beb),使用 GNU 13.3.0 编译,Linux x86_64;硬件为 Intel U7-258V,系统 Ubuntu 24.04.5(内核 7.0.0-38-generic),Mesa 25.2.8,Vulkan 1.4.350.1;构建选项含 -DGGML_VULKAN=1、-DGGML_SCHED_NO_REALLOC=ON、-DLLAMA_FATAL_WARNINGS=ON、-DLLAMA_OPENSSL=OFF。

最快修复方案:Issue 中说明该崩溃已由 PR #31344 修复,可优先尝试切换到包含该 PR 的代码版本后重新构建并复测。

注意事项:PR #31344 的修复效果是基于 Issue 讨论的结论,并非本文独立验证;此外维护者提到在 WebGPU 构建下测试仍然失败,疑似 DeepSeek 模型与新增测试之间另有问题,且该环境未实际验证。因此修复后仍需按“验证方法”复测,Vulkan 与 WebGPU 后端应分别确认。

问题场景

用户在 Linux 上自行编译 llama.cpp,开启 Vulkan 后端,并通过 ctest -R test-llama-context 生成测试模型后,手动运行 test-llama-context 加载 deepseek41-moe.gguf,只执行 comp_padding 这一项测试(-j 1)。同时设置了环境变量 GGML_SCHED_DEBUG_REALLOC=1,用于打开调度器的重分配调试检查。

复现命令在运行时触发断言并 abort,进程产生 core dump,调用栈经过 ggml_backend_sched_alloc_graph → llama_context::process_ubatch → llama_context::decode → case_comp_padding::run。

报错原文

ggml_backend_sched_alloc_splits: unexpected graph reallocation (graph size = 907, nodes = 907, leafs = 202), debug_realloc = 1
...
ggml_abort ()
ggml_backend_sched_alloc_graph ()
llama_context::process_ubatch (...)
llama_context::decode (...)
case_comp_padding::run(model_run&) const ()
...
Aborted (core dumped)

原因分析

核心信息是 ggml_backend_sched_alloc_splits: unexpected graph reallocation。在 debug_realloc = 1(由 GGML_SCHED_DEBUG_REALLOC=1 触发)时,调度器检测到计算图在分配过程中发生了预期之外的重分配,于是调用 ggml_abort 终止进程,而非返回普通错误。

结合构建选项 -DGGML_SCHED_NO_REALLOC=ON 与 -DGGML_VULKAN=1,可能原因在于这一组合下某个后端调度路径没有按预期预先分配好图缓冲,导致运行期出现重分配。DeepSeek MoE 模型在 comp_padding 场景下的图结构较复杂(日志显示 graph size = 907、nodes = 907),使该问题更容易被触发。

Issue 讨论中维护者的结论是此问题“seems like it is fixed by PR #31344”,因此可认为它属于调度相关代码缺陷,而非用户配置或模型文件损坏。但该 Issue 标签为 bug-unconfirmed,且 WebGPU 下仍报告失败,说明修复未必覆盖所有后端。

环境排查

  • 确认 llama.cpp 版本是否为包含 PR #31344 的 commit;Issue 报告版本为 0.8.0-dev(build 11976,commit 2e0d86beb),该版本存在问题。
  • 确认后端是否为 Vulkan:构建时是否启用 -DGGML_VULKAN=1,运行时是否实际走了 Vulkan 后端,可结合 -lv 4 日志观察。
  • 确认是否设置了 GGML_SCHED_DEBUG_REALLOC=1;该变量打开调试断言,需区分“调试检查报错”与“正常路径完全无重分配”两种情况。
  • 确认是否存在 -DGGML_SCHED_NO_REALLOC=ON 这一组合,Issue 中的复现构建包含该选项。
  • 确认测试模型已由 ctest -C Release --output-on-failure -R test-llama-context 生成到 ./tests/test-models/(评论中路径为 ./build/tests/test-models),路径不一致时需按实际构建目录调整。
  • 确认编译器与系统环境:Issue 使用 GNU 13.3.0、Ubuntu 24.04.5、Mesa 25.2.8、Vulkan 1.4.350.1;不确定这些版本是否与触发直接相关。

解决步骤

  1. 先记录当前复现状态:保持原构建配置,运行一次 GGML_SCHED_DEBUG_REALLOC=1 ./bin/test-llama-context -m ./tests/test-models/deepseek41-moe.gguf --test '^comp_padding$' -j 1,确认仍出现 unexpected graph reallocation。
  2. 将代码同步到包含 PR #31344 的版本,不再停留在 commit 2e0d86beb。
  3. 按原配置重新构建,保留与 Issue 一致的构建选项以便对比结果:cmake -B build-release -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Release -DLLAMA_FATAL_WARNINGS=ON -DLLAMA_OPENSSL=OFF -DGGML_SCHED_NO_REALLOC=ON -DGGML_VULKAN=1,然后 cmake --build build-release/ --config Release -j。
  4. 重新用 ctest 生成测试模型:ctest -C Release --output-on-failure -R test-llama-context。
  5. 按维护者在评论中给出的加日志方式复测:./build/bin/test-llama-archs -o ./build/tests/test-models 生成模型后,执行 GGML_SCHED_DEBUG_REALLOC=1 ./build/bin/test-llama-context -m ./build/tests/test-models/deepseek41-moe.gguf -lv 4,观察是否仍触发重分配断言。
  6. 若使用 WebGPU 后端构建,需单独按上述步骤复测;Issue 中报告 WebGPU 下测试仍失败,暂未确认原因。

验证方法

重新运行 test-llama-context 测试 deepseek41-moe.gguf 时,不再出现 ggml_backend_sched_alloc_splits: unexpected graph reallocation 与 Aborted (core dumped),且测试正常结束(无 abort、无 core dump),即可认为该崩溃已解决。建议同时保留 GGML_SCHED_DEBUG_REALLOC=1 与 -lv 4 运行,以确认是检查通过而非检查被跳过。如需确认后端一致性,可对照日志中实际使用的后端是否为 Vulkan。

参考来源

ggml-org/llama.cpp #31346(讨论中提及修复 PR:#31344)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31830

发表回复

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