Vulkan: GGML_ASSERT(descriptor_set_idx < descriptor_sets.size()) crash on ARM UMA (Mali-G720-Immortalis, CIX CP8180)

用户在使用 llama-bench 工具测试 Qwen3-8B-Q4_K_M.gguf 模型时触发问题,硬件为 MINISFORUM MS-R1(CIX CP8180 SoC),配备 Mali-G720-Immortalis GPU 和共享内存池(UMA)。即使用 -ngl 0 参数禁止层卸载到 G

快速结论:此断言失败错误发生在 ARM UMA 架构(如 Mali-G720-Immortalis GPU、CIX CP8180 SoC)上运行 llama.cpp 的 Vulkan 后端时,即使设置 -ngl 0 也会触发。优先尝试更新 GPU 驱动或禁用 Vulkan 图形优化。

问题场景

用户在使用 llama-bench 工具测试 Qwen3-8B-Q4_K_M.gguf 模型时触发问题,硬件为 MINISFORUM MS-R1(CIX CP8180 SoC),配备 Mali-G720-Immortalis GPU 和共享内存池(UMA)。即使用 -ngl 0 参数禁止层卸载到 GPU,Vulkan 后端仍然被调度执行操作并崩溃。

报错原文

ggml_vulkan: Found 1 Vulkan devices:
ggml_vulkan: 0 = Mali-G720-Immortalis (Mali-G720-Immortalis) | uma: 1 | fp16: 1 | bf16: 0 | warp size: 16 | shared memory: 32768 | int dot: 1 | matrix cores: none
/mnt/storage/llama.cpp/ggml/src/ggml-vulkan/ggml-vulkan.cpp:6766: GGML_ASSERT(ctx->descriptor_set_idx < ctx->descriptor_sets.size()) failed

原因分析

可能原因:在 ARM UMA 架构上,GPU 驱动处理描述符集合时存在并发或资源管理问题。报错代码行(ggml-vulkan.cpp:6791)出现在 ggml_vk_dispatch_pipeline 函数中,具体操作是 GGML_OP_SOFT_MAX。用户尝试过增大描述符池大小、禁用 coopmat 支持、禁用图形优化等方法均无效。另一种可能原因是 GPU 驱动中虚拟地址空间不足(从 32 位扩展到 40 位的 Mesa 修复未包含在 CIX 专有驱动中)。

环境排查

  • 确认 Vulkan 设备信息:ggml_vulkan: 0 = Mali-G720-Immortalis | uma: 1 | fp16: 1 | bf16: 0 | warp size: 16 | shared memory: 32768 | int dot: 1 | matrix cores: none
  • 确认 llama.cpp 构建标志:-DGGML_VULKAN=ON -march=armv9-a+i8mm -fopenmp
  • 确认 glslc 版本:shaderc v2026.3-dev(需支持 GL_EXT_integer_dot_product)
  • 确认 Vulkan-Headers 版本:v1.4.351
  • 确认操作系统:Debian forky/sid,内核 6.6.10-cix-build-generic aarch64
  • 确认内存:64GB LPDDR5X(UMA 架构,CPU 和 GPU 共享)

解决步骤

  1. 更新 GPU 驱动:检查 CIX 是否发布更新版本的 libmali.so 闭源 Vulkan 驱动,或考虑切换到开源 Mesa 驱动(需确认 Mesa 是否包含 VA 地址空间大小修复)。
  2. 禁用 Vulkan 图形优化:运行程序前设置环境变量GGML_VK_DISABLE_GRAPH_OPTIMIZE=1(Issue 用户尝试过但无效,可优先尝试)。
  3. 禁用 coopmat 支持:尝试设置GGML_VK_DISABLE_COOPMAT=1 GGML_VK_DISABLE_COOPMAT2=1(Issue 用户尝试过但无效,可优先尝试)。
  4. 增大描述符池大小:修改源代码中 VK_DEVICE_DESCRIPTOR_POOL_SIZE 的值(从 256 增大到 4096),然后重新编译(Issue 用户尝试过但无效,可优先尝试)。
  5. 回退 llama.cpp 版本:如果上述步骤均无效,尝试使用更早版本的 llama.cpp 提交(Issue 未指定具体版本,需自行排查)。
  6. 切换到 CPU 后端:如果不能解决问题,可以考虑使用 -ngl 0 配合 CPU 后端(使用 -DGGML_CUDA=OFF-DGGML_VULKAN=OFF 构建),绕过 Vulkan 后端。但 Issue 表明即使 -ngl 0 也会触发此 bug,所以这可能不是长期解决方案。

验证方法

重新运行相同的命令:llama-bench -m qwen3-8b-Q4_K_M.gguf -mmp 0 -t 6 -ngl 0 -r 1 -p 512 -n 128。如果不再出现 GGML_ASSERT 失败并且 benchmark 正常完成,则问题已解决。

参考来源

ggml-org/llama.cpp #23057

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 16175

发表回复

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