快速结论:该报错出现在 Apple Silicon 上启用 Metal shader validation 后运行 llama.cpp 的 test-backend-ops,执行 SOLVE_TRI 测试时 kernel_solve_tri_f32 发生越界设备内存读取;优先排查 Metal 后端版本是否已包含对应修复,而不只是关闭校验。
适用环境:Issue 确认的环境为 Apple M4、macOS 26.5.2,llama.cpp 源码提交 956591f4570aa6636895d90439892fef7c075b17,以 GGML_METAL=ON、LLAMA_CURL=OFF 进行 Release 构建;Issue 未提供 Python、CUDA、PyTorch 或依赖版本信息。
最快修复方案:暂无确认的一步修复方案;Issue 评论说明该问题已由 PR #32103 修复,可优先尝试更新到包含该修复的 llama.cpp 版本后重新构建并验证。
注意事项:关闭 shader validation 会让 24 个现有 SOLVE_TRI 测试用例通过,但这只隐藏了越界检测,不能证明内核安全。PR #32103 的具体提交范围与合并版本,请以仓库记录为准。
问题场景
用户在 Apple M4 Mac 上使用 llama.cpp 的 Metal 后端,运行 test-backend-ops 并只筛选 SOLVE_TRI 算子测试。在启用 MTL_SHADER_VALIDATION 和 fault 中止机制后,测试用例 ne_lhs=[79,79,5,3]、ne_rhs=[417,79,5,3] 触发 Metal GPU 校验报错,进程因 SIGABRT 终止,shell 退出码为 134。关闭 shader validation 后,当时全部 24 个 SOLVE_TRI 测试用例均能运行成功。
报错原文
Metal GPU validation enabled
ggml_metal_library_compile_pipeline: compiling pipeline: base = 'kernel_solve_tri_f32', name = 'kernel_solve_tri_f32_nsg=8_n=79_k=417'
Invalid device load at offset 4358292, executing kernel function: "kernel_solve_tri_f32"
buffer: , length:4358144, resident:Read Write
* frame #0: kernel_solve_tri_f32() - /program_source:1638:39
原因分析
根据 Issue 描述,问题位于 solve_tri.metal 的内核实现:把矩阵 A 加载到 threadgroup 内存的循环缺少对填充列索引的检查,也没有处理超出最后一行的 SIMD group;同时求和循环在乘以 (idx < r) 布尔判断之前就先读取了 dst_ptr[idx*K],因此该条件判断无法阻止前面的越界读取。Metal shader validation 检测到 kernel_solve_tri_f32 对长度为 4358144 的缓冲区在偏移 4358292 处执行无效设备读取,这个偏移已经超出缓冲区范围。Issue 评论说明该问题已由 PR #32103 修复。
环境排查
- 确认 Apple Silicon 机型与 macOS 版本,Issue 中为 Apple M4、macOS 26.5.2。
- 确认 llama.cpp 源码提交或发行版本是否早于 PR #32103 的修复范围。
- 确认构建配置是否为 Metal 后端启用状态,例如
GGML_METAL=ON。 - 确认复现时是否启用了
MTL_SHADER_VALIDATION=1、MTL_SHADER_VALIDATION_REPORT_TO_STDERR=1、MTL_SHADER_VALIDATION_ABORT_ON_FAULT=1。 - Issue 未提供 Python、CUDA、PyTorch 或额外依赖版本,无需据此排查这些项目。
解决步骤
- 记录当前 llama.cpp 版本或源码提交,确认是否仍包含
956591f4570aa6636895d90439892fef7c075b17及更早的solve_tri.metal实现。 - 更新 llama.cpp 到包含 PR #32103 的版本,并重新进行带 Metal 支持的 Release 构建;可优先尝试此方案,但需以实际仓库合并记录确认修复已纳入。
- 使用原复现命令重新运行
test-backend-ops,并继续保持 shader validation 与 abort-on-fault 开启,以确认越界读取不再触发。 - 如果更新后仍报错,保留完整的 Metal validation 输出、构建配置和源码提交信息,再向仓库反馈。
验证方法
在启用 MTL_SHADER_VALIDATION=1、MTL_SHADER_VALIDATION_REPORT_TO_STDERR=1、MTL_SHADER_VALIDATION_ABORT_ON_FAULT=1 的情况下运行同一 SOLVE_TRI 测试,应不再出现 Invalid device load,进程也不再因 SIGABRT 以 134 退出。修复不依赖关闭 shader validation 才通过。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


