快速结论:该报错发生在 llama.cpp 启动并通过 Metal 后端编译 unary.metal 内核库的阶段,此时 macOS 工具链拒绝了新增的 constexpr bfloat 转换函数,导致 Metal 库构建失败、后端无法初始化。可优先尝试设置环境变量 GGML_METAL_BF16_DISABLE=1 临时绕开,然后升级到包含 #31360 修复的版本。
适用环境:macOS(Issue 中已确认 macOS 14、macOS 15.8.1、macOS 15.8.2);Apple Silicon M2 Ultra、M2 Max、M3 Ultra、M4 Pro;Apple clang 15.0.0(clang-1500.3.9.4)与 17.0.0(clang-1700.6.4.2);llama.cpp Metal 后端,受影响版本在 Git commit 27b7a8a、bcdb7a23(version 4100)附近;模型为 LFM3-VL-2B-GGUF。
最快修复方案:Issue 中用户明确验证:运行同一命令时设置 GGML_METAL_BF16_DISABLE=1,可绕过 unary 库的编译失败,模型正常运行。最终修复为合并 #31360 后升级 llama.cpp 到该修复之后的版本。
注意事项:关闭 Metal BF16 可能影响 BF16 相关路径的性能或精度行为,仅作为临时绕过手段;#31360 修复尚未在 Issue 中给出逐行补丁说明,不要自行手工改动 Metal 源码作为长期方案;回归来源被指向 commit de5122d(#31146)。
问题场景
用户在 Apple Silicon Mac(Mac Studio M2 Ultra,另有 M2 Max、M3 Ultra、M4 Pro 复现)上运行 llama-server 加载 LFM3-VL-2B-Q6_K.gguf,启动阶段 Metal 后端需要编译 unary 内核库,结果编译失败,Metal 设备初始化报 failed to initialize the Metal library,模型无法进入推理。每日 CI 在 Apple M4 Pro 上也出现相同错误,llama-bench 在推理开始前即失败。
报错原文
E ggml_metal_library_compile_all: failed to build 'unary' library: Error Domain=MTLLibraryErrorDomain Code=3 "program_source:1570:26: error: constexpr function never produces a constant expression [-Winvalid-constexpr]
inline constexpr bfloat4 ggml_metal_unary_cast<bfloat4, float4>(float4 x) {
^
program_source:1571:27: note: subexpression not valid in a constant expression
return bfloat4(bfloat(x[0]), bfloat(x[1]), bfloat(x[2]), bfloat(x[3]));
^
}
E ggml_metal_device_init: error: failed to create library
E ggml_metal_init: error: failed to initialize the Metal library
E ggml_backend_metal_device_init_backend: error: failed to allocate context
原因分析
最可能的原因是 #31146(commit de5122d)新增了 BF16 转换辅助函数 ggml_metal_unary_cast,其中被标记为 constexpr 的模板在旧版 Apple 工具链上无法作为常量表达式求值。Issue 中的判断是:真正触发错误的是第一个模板里对 x[0]、x[1] 等的索引操作,该子表达式不被视为合法常量表达式,因此 Metal 编译器拒绝该 constexpr 函数声明,整个 unary 库构建失败,Metal 后端随之初始化失败。
环境排查
- 确认 llama.cpp 版本/commit,重点检查是否在 #31146 之后、#31360 之前。
- 确认 macOS 版本,Issue 中 macOS 14、15.8.1、15.8.2 均出现。
- 确认 Apple clang 版本,Issue 中涉及 15.0.0 与 17.0.0。
- 确认硬件为 Apple Silicon,Issue 中 M2 Ultra、M2 Max、M3 Ultra、M4 Pro 均复现。
- 确认 GGML 后端为 Metal,并检查启动日志中是否出现
failed to build 'unary' library。
解决步骤
- 临时绕过(Issue 中已验证):在启动
llama-server的命令前加入环境变量GGML_METAL_BF16_DISABLE=1,再运行原命令,确认 Metal 后端可正常初始化并加载模型。 - 升级 llama.cpp 到包含 #31360 的版本(可优先尝试):Issue 中多位用户确认 #31360 合并后问题消失,日志显示恢复正常。
- 若自行从源码构建,确保构建的代码已包含 #31360;不要长期依赖手工删除
constexpr的临时修改,因为 Issue 中明确指出该改法只是 stopgap。
验证方法
重新运行原 llama-server 启动命令,确认日志中不再出现 failed to build 'unary' library 与 failed to initialize the Metal library,Metal 后端完成初始化后模型可正常加载并开始推理;亦可运行 llama-bench 验证不再在推理前失败。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[Bug]: Qwen3.6-35B-A3B (hybrid GDN + MoE): a prompt's logprobs move by up to 0.2 when another sequence shares its engine step (v0.30.0, sm_1](https://www.chat-gpts.plus/wp-content/uploads/2026/10/59764-7f760e85-768x403.jpg)
