ggml-backend-meta: multi buffers are unsupported leading to vulkan segfault

该报错通常发生在 llama.cpp 使用 Vulkan 后端、开启多设备张量并行( -sm tensor )并加载模型时,进程在模型加载阶段触发 SIGSEGV;日志中会先出现 ggml-backend-meta: multi buffers are unsupported leading to

快速结论:该报错通常发生在 llama.cpp 使用 Vulkan 后端、开启多设备张量并行(-sm tensor)并加载模型时,进程在模型加载阶段触发 SIGSEGV;日志中会先出现 ggml-backend-meta: multi buffers are unsupported leading to vulkan segfault。优先排查上下文长度(-c)相关的缓冲区分配路径,而不是先怀疑模型文件本身。

适用环境:llama.cpp version 8863(97895129e),GNU 13.3.0,Linux x86_64;Ubuntu 24.04,内核 6.8.0-110-generic;Vulkan 后端;CPU 为 Intel Xeon E5-2630L v3;显卡为 2× AMD Radeon RX 480(Polaris10,各 4 GB,合计 8 GB VRAM);Mesa 25.2.8 / RADV 驱动;无 peer-to-peer,PCIe 3.0 x16。

最快修复方案:在启动命令中显式传入一个较小的上下文长度,例如 -c 2048,Issue 中确认该 workaround 可以避免崩溃。

注意事项:该 workaround 只绕过崩溃,并未从根源修复多缓冲区不支持的问题;小上下文会限制可用上下文长度。Issue 中未确认其他版本、其他后端或其他上下文值是否同样有效,也未给出根本修复补丁。Issue 关闭时间为 2026-09-23,相关修复状态需以仓库最新代码为准。

问题场景

用户在 Linux 上编译 llama.cpp,并尝试用 Vulkan 后端和双 AMD Radeon RX 480 运行 llama-cli。命令中启用了 -ngl 99-dev Vulkan0,Vulkan1-sm tensor 以及 -fa 1,模型为 unsloth/Llama-3.2-3B-Instruct-GGUF:Q4_K_M。程序在 Loading model... 阶段、尚未进入推理时发生段错误。

报错原文

ggml-backend-meta: multi buffers are unsupported leading to vulkan segfault

Thread 1 "llama-cli" received signal SIGSEGV, Segmentation fault.
0x00007ffff3970fb0 in ggml_backend_vk_graph_compute(ggml_backend*, ggml_cgraph*) () from /home/matto/llama.cpp/build/bin/libggml-vulkan.so.0

#0  __gnu_cxx::__atomic_add_dispatch (__val=1, __mem=0x39) at /usr/include/c++/13/ext/atomicity.h:111
#1  std::_Sp_counted_base::_M_add_ref_copy (this=0x31)
#5  ggml_vk_tensors_overlap (elementwise=false, b=, a=0x7ffe1f485480) at /home/matto/llama.cpp/ggml/src/ggml-vulkan/ggml-vulkan.cpp:14319
#6  ggml_backend_vk_graph_compute (backend=, cgraph=0x555559bbcc20) at /home/matto/llama.cpp/ggml/src/ggml-vulkan/ggml-vulkan.cpp:14690

原因分析

调试堆栈显示,崩溃发生在 ggml_vk_tensors_overlap() 内构造 std::shared_ptr<vk_buffer_struct> 时,访问了一个明显异常的对象地址(this=0x31),随后在原子引用计数自增阶段触发 SIGSEGV。结合报错中的 ggml-backend-meta: multi buffers are unsupported,可能原因是:在 tensor split 模式下,Vulkan 后端为多个设备拆分图计算时,调度层仍然把跨设备的多缓冲区当作单一缓冲区处理,导致缓冲区对象或 shared_ptr 引用链失效。显式指定较小的 -c 会改变缓冲区分配规模和图结构,从而避开崩溃点。该机制在 Issue 中未被最终确认,属于基于堆栈和 workaround 的推断。

环境排查

  • 确认 llama.cpp 构建版本,Issue 中为 version 8863(97895129e)。
  • 确认使用 Vulkan 后端编译,并能加载 libggml-vulkan.so.0
  • 确认显卡与驱动:2× AMD Radeon RX 480,Mesa 25.2.8 / RADV。
  • 确认是否使用了 -dev Vulkan0,Vulkan1-sm tensor 组合。
  • 确认崩溃时是否没有显式指定 -c,或指定的上下文长度较大。
  • 确认模型路径和量化格式与 Issue 一致:Llama 3.2 3B,Q4_K_M GGUF。

解决步骤

  1. 先在不带 -sm tensor 的情况下运行,确认问题是否只在张量并行模式下出现。
  2. 在启动命令中显式加上小上下文,例如 -c 2048,其他参数保持 Issue 中的配置不变。
  3. 如果仍然崩溃,用调试构建并开启 gdb 获取完整 backtrace,确认崩溃点是否仍在 ggml_vk_tensors_overlapggml_backend_vk_graph_compute
  4. 如果必须使用多设备 tensor split,可关注仓库后续对 ggml-backend-meta 多缓冲区支持的更新;在 Issue 关闭前未有根本修复方案被验证。

验证方法

使用相同命令加上 -c 2048 后,llama-cli 应能越过 Loading model... 阶段并进入交互,不再出现 Segmentation fault (core dumped)。若仍崩溃,则说明该 workaround 在当前构建或驱动组合下无效,需要回到 gdb backtrace 继续定位。

参考来源

ggml-org/llama.cpp #22197

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25297

发表回复

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