Compile bug: shaderc v2025.2 causes vulkan compilation failure

用户在 Linux 系统上编译 llama.cpp 的 Vulkan 后端时触发问题。使用 Nix 构建系统(`nix flake update && nix build '.#vulkan'`)或其他构建系统均可复现。当 shaderc 版本为 v2025.2(nixos-unstable 中的最

Compile bug: shaderc v2025.2 causes vulkan compilation failure

Compile bug: shaderc v2025.2 causes vulkan compilation failure

快速结论:该报错发生在使用 llama.cpp 编译 Vulkan 后端时,当构建依赖 shaderc 版本为 v2025.2 时会出现编译失败(提示 bfloat16 相关错误)。优先排查 shaderc 版本,并在可能的情况下将其回退到 v2024.0,或应用禁用 bfloat16 着色器优化标记的补丁。

问题场景

用户在 Linux 系统上编译 llama.cpp 的 Vulkan 后端时触发问题。使用 Nix 构建系统(`nix flake update && nix build ‘.#vulkan’`)或其他构建系统均可复现。当 shaderc 版本为 v2025.2(nixos-unstable 中的最新版本)时构建失败,而 shaderc v2024.0 可正常编译。

报错原文

/build/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp:226: error: 'GL_EXT_bfloat16' not declared in this scope

完整编译日志中会显示一连串 bfloat16 相关错误,例如:

error: 'GL_EXT_bfloat16' not declared in this scope

原因分析

可能原因:shaderc v2025.2 在 nixpkgs 中的依赖关系(glslang、SPIRV-Tools、SPIRV-Headers)版本组合不正确。具体来说,nixpkgs 中的 shaderc 包定义引用了 shaderc v2025.1 的依赖提交哈希,而非 v2025.2 的正确依赖(google/shaderc 030484b)。旧版本的 SPIRV-Headers 可能包含不兼容的 bfloat16 定义,导致编译脚本的 GL_EXT_bfloat16 支持测试产生假阳性,后续实际生成 Vulkan 着色器时失败。

另一可能原因是 shaderc v2025.2 自身对 bfloat16 着色器的优化处理(spirv-opt)存在兼容性问题。移除 -O 优化标志(禁用 spirv-opt)可以让编译通过,且不影响功能正确性。

环境排查

  • shaderc 版本:确认版本是否为 v2025.2,可运行 glslc --version 查看。注意:如果输出中显示奇怪的日期(如 1980-01-01),通常表示依赖版本组合可能存在问题。
  • 构建系统:确认是否使用 Nix 或其他构建系统(如 CMake)。注意 nix flake.lock 中引用的 nixpkgs 分支(nixos-unstable 可能包含有问题的 shaderc)。
  • 上游依赖提交哈希:如果使用 Nix,检查 shaderc 包的 glslang、SPIRV-Tools、SPIRV-Headers 的修订哈希是否与 shaderc v2025.2 的正确依赖提交一致。
  • llama.cpp 版本:确认 Git commit,本 Issue 测试于 7aeee88cfe9c0434eac722b0f7c21404f48758a5

解决步骤

  1. (优先尝试)禁用 bfloat16 着色器的优化标志
    修改 ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp 第 226 行,移除 -O 参数。此方法由 Issue 作者验证编译通过且功能正常(llama-bench 可运行)。对应 Pull Request:#15352
  2. 回退 shaderc 版本到 v2024.0
    在 Nix 构建中,覆盖 shaderc 包为来自 nixos-25.05 的 v2024.0 版本。参见 Issue 中提供的 diff 示例(添加 stable-nixpkgs 输入源,将 shaderc 指向 nixos-25.05 的版本)。
  3. 使用 nixpkgs 中已应用补丁的 llama-cpp 包
    Nixpkgs 已通过 PR #432350 应用了禁用 bfloat16 着色器扩展支持测试的补丁(disable_bfloat16.patch)。可等待该 PR 合并后升级 nixpkgs。
  4. 修复 shaderc 包依赖(Nix 用户)
    手动修改 nixpkgs 中 shaderc 包的依赖提交哈希,使 glslang、SPIRV-Tools、SPIRV-Headers 与 shaderc v2025.2 的正确依赖提交一致。

验证方法

运行 nix build '.#vulkan' 或对应的编译命令,确认不再出现 GL_EXT_bfloat16 not declared 错误。完成后可以运行 llama-bench 或加载模型推理,验证功能正常。

参考来源

ggml-org/llama.cpp #15344

相关链接:NixOS/nixpkgs #409284NixOS/nixpkgs #432350ggml-org/llama.cpp PR #15352shaderc v2025.2 正确依赖提交:google/shaderc 030484bggml(whisper.cpp 中类似问题的根源)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 13856

发表回复

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