Misc. bug: ggml_metal_synchronize error: Mac M4 Pro Tahoe 26.3 Crash due to kIOGPUCommandBufferCallbackErrorInnocentVictim

这个报错通常发生在 macOS 26.3+ 系统下,使用 llama.cpp 将模型层数(-ngl > 0)卸载到 Apple GPU(Metal)时触发,表现为 llama-cli 或 llama-server 在提示词处理或长上下文生成中崩溃。优先排查系统显卡驱动与 llama.cpp 的兼容性

快速结论:这个报错通常发生在 macOS 26.3+ 系统下,使用 llama.cpp 将模型层数(-ngl > 0)卸载到 Apple GPU(Metal)时触发,表现为 llama-cli 或 llama-server 在提示词处理或长上下文生成中崩溃。优先排查系统显卡驱动与 llama.cpp 的兼容性,并尝试设置环境变量 AGX_RELAX_CDM_CTXSTORE_TIMEOUT=1。

适用环境:llama.cpp(版本 8100-8882+,含 llama-cli / llama-server);Apple Silicon Mac(M4 Pro、M1 Max、M2 Max);macOS Tahoe 26.3、26.4、26.4.1;llama.cpp 内置 Metal 后端。

最快修复方案:暂无对所有场景确认的一步修复方案。在部分用户(M2 Max,macOS 26.4.1)上,设置环境变量 AGX_RELAX_CDM_CTXSTORE_TIMEOUT=1 可明显推迟或消除 kIOGPUCommandBufferCallbackErrorImpactingInteractivity 崩溃;但此方案在 macOS 26.3(M4 Pro)上仍未验证,且 llms.cpp 开发者已强制注入该变量,若仍复现需等待上游修复。

注意事项:AGX_RELAX_CDM_CTXSTORE_TIMEOUT=1 是针对“Impacting Interactivity”错误的工作区,可能影响 GPU 驱动超时策略,但未见性能损失报告。原 Issue 用户(M4 Pro)报告其他运行时参数(如 GGML_METAL_TENSOR_DISABLE=1 等)会显著降低性能。上下文长度与 uint 溢出(2^n 应改为 2^n-1)是另一类“已解决”情况,但与本 Issue 报错无法完全对应。

问题场景

使用 llama.cpp 的 llama-cli 或 llama-server 加载大型模型(如 Qwen2.5-Coder-1.5B、Qwen3.5/3.6 35B)时,通过 -ngl 参数将层加载到 GPU(Metal),在提示词预填充(prefill)或长上下文推理(当前后文超过约 7 万 token 时)触发崩溃。用户报告从 macOS 和 XCode 26.2 升级到 26.3 后开始复现,且不同模型、不同上下文长度、不同批大小参数均无法规避,只有完全使用 CPU(-ngl 0)才能正常工作。

报错原文

ggml_metal_synchronize: error: command buffer 0 failed with status 5 error: Impacting Interactivity (0000000e:kIOGPUCommandBufferCallbackErrorImpactingInteractivity)
Misc. bug: ggml_metal_synchronize error: Mac M4 Pro Tahoe 26.3 Crash due to kIOGPUCommandBufferCallbackErrorInnocentVictim

原因分析

可能原因并非单一的 llama.cpp 逻辑错误,而是 macOS 26.3/26.4 Tahoe 更新后,Apple GPU 驱动(AGX)与 llama.cpp 的 Metal 命令缓冲区调度产生了兼容性问题。原 Issue 在第一报错(kIOGPUCommandBufferCallbackErrorInnocentVictim)中无法通过回退 llama.cpp 版本、调整 -ngl/-c/-b 或禁用 Metal 特性(如 GGML_METAL_GRAPH_REUSE=0)解决,线索指向驱动层面的悬挂或超时。

后续评论中,另一类错误(kIOGPUCommandBufferCallbackErrorImpactingInteractivity,status 5)在 M2 Max 上复现,经社区讨论后引用 MLX 项目(ml-explore/mlx#3267)的建议,设置 AGX_RELAX_CDM_CTXSTORE_TIMEOUT=1 可延长驱动命令存储超时窗口,从而避免“innocent victim”误杀,但该证据链只覆盖部分硬件/系统组合。

另一种“可能原因”为上下文长度的 uint 溢出:部分用户发现将 2^n 上限改为 2^n-1(如 65536→65535,8192→8191)可解决崩溃,但这是针对邻近但不同报错的自救方案,并非本文原始 M4 Pro 场景的确定性结论。

环境排查

  • llama.cpp 版本:确认是否 ≥ 8882(ca7f7b7b9),开发者声称已强制注入 AGX 环境变量;若仍报错,记录当前 commit 哈希。
  • macOS 版本:是否为 26.3(第一报错)或 26.4/26.4.1(第二类报错);从 26.2 升级后开始复现是关键线索。
  • Apple Silicon 型号:M4 Pro(Mac16,8)、M1 Max、M2 Max 均有报告,但工作区可能因 GPU 代际而异。
  • 依赖环境:Xcode 版本(26.3 后);确认 lldb/backtrace 工具是否可用(GGML_BACKTRACE_LLDB=1)。
  • 上下文长度设置:检查 n_ctx 是否设为 2^n(如 65536、8192、262144),这类值可能触发 uint 溢出(虽然本 Issue 无法与 M4 Pro 场景直接绑定,但建议在非 LLM 推理任务中排查)。

解决步骤

  1. 首选尝试:在启动 llama-cli/llama-server 前,设置环境变量并重新运行(M2 Max 验证有效,M4 Pro 未验证):
    export AGX_RELAX_CDM_CTXSTORE_TIMEOUT=1
  2. 升级 llama.cpp 至最新 master(≥ 8882 或 ca7f7b7b9 之后),开发者已强制覆盖该变量,观察是否自动生效;若仍有问题,回到步骤 1 检查环境变量是否被禁用。
  3. 若属于“Impacting Interactivity”错误且步骤 1/2 无效,可尝试将上下文长度 -c 设置为 2^n - 1(如 65535 而非 65536,或 8191 而非 8192),但此仅为部分用户验证过的替代方案,并非本 Issue 原始环境下的确认修复。
  4. 若以上均失败,暂时使用 -ngl 0(纯 CPU 推理),该模式在原 Issue 中确认能正常工作,代价是性能下降。
  5. 若必须使用 GPU 且上述方案无效,可尝试运行时参数(但不推荐,因报告称会“destroy performance”):
    export GGML_METAL_TENSOR_DISABLE=1
    export GGML_METAL_BF16_DISABLE=1
    export GGML_METAL_NO_RESIDENCY=1
  6. 报告复现:如果在设置 AGX 变量后仍崩溃,建议在 llama.cpp issue #20141 下追加日志和硬件信息(报错时刻的 n_ctx、ngl 等),帮助开发者定位驱动兼容性补丁。

验证方法

重现原失败命令(如 llama-cli -hf ggml-org/Qwen2.5-Coder-1.5B-Instruct-Q8_0-GGUF -ngl 1 -p "ping" -c 256 -b 32 -ub 32),若不再输出 ggml_metal_synchronize: error 且模型能正常产生回复,即为修复成功。若之前是在长上下文(如 7 万-9 万 token 后崩溃),建议用大的 -c 值(如 252144)和长 prompt 重复测试,确认能超过之前崩溃点(例如 M2 Max 用户在用 AGX 变量后从 69360 推进到 97237+ token)。

参考来源

ggml-org/llama.cpp #20141
额外引用的外部链接:ml-explore/mlx #3267(AGX 超时工作区)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21621

发表回复

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