背景
Ollama 在 macOS 上只支持 Apple Silicon(M 系列)的 Metal 加速。Intel Mac 即使有 AMD 独显(如 5500M),Ollama 也只能纯 CPU 推理,7B 模型基本超时。
目标:让 llama.cpp 通过 Vulkan(MoltenVK)调用 AMD Radeon Pro 5500M 的 8GB VRAM,跑 Qwen2.5-Coder-7B Q4_K_M 量化模型。
环境:macOS 13.7.4 Ventura、Intel Core + AMD Radeon Pro 5500M (8GB)、cmake 4.3.4。
一、前置依赖
- cmake ≥ 3.19 —
brew install cmake - MoltenVK — macOS 上的 Vulkan→Metal 翻译层
- VulkanSDK(仅需 glslc) — Vulkan shader 编译器
- spirv-headers — SPIR-V 头文件
- Command Line Tools —
xcode-select --install
二、下载 MoltenVK
从 GitHub Releases 下载预编译的 MoltenVK:
# 下载 MoltenVK (v1.4.1)
curl -L -o ~/Downloads/MoltenVK-macos.tar \
"https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.1/MoltenVK-all.tar"
cd ~/Downloads && tar xf MoltenVK-macos.tar
# 解压后得到 MoltenVK/ 目录,包含动态库和 Vulkan 头文件
三、安装 glslc(Vulkan Shader 编译器)
llama.cpp 的 Vulkan 后端需要 glslc 编译 GLSL shader。brew 的 shaderc 编译太长易超时,直接从 LunarG VulkanSDK 提取:
# 下载 VulkanSDK(macOS installer 版本,~350MB)
curl -L -o /tmp/vulkan-sdk-mac.tar.gz \
"https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.tar.gz"
cd /tmp && unzip -o -q vulkan-sdk-mac.tar.gz
# 静默安装到 /tmp/vulkan-install
/tmp/vulkansdk-macOS-*/Contents/MacOS/vulkansdk-macOS-* \
--accept-licenses --default-answer --confirm-command \
--root /tmp/vulkan-install install
# glslc 位置: /tmp/vulkan-install/macOS/bin/glslc
四、安装 SPIRV-Headers
brew install spirv-headers
这一步很快,bottle 安装仅几秒。
五、克隆并编译 llama.cpp
⚠️ 关键:必须禁用 Metal 后端(-DGGML_METAL=OFF),否则 Metal 和 Vulkan 会抢 AMD 设备导致崩溃。
# 克隆 llama.cpp (如果 GitHub 慢可挂代理)
git clone --depth=1 https://github.com/ggerganov/llama.cpp.git /tmp/llama.cpp
cd /tmp/llama.cpp
# CMake 配置 — 启用 Vulkan,禁用 Metal
mkdir build && cd build
VULKAN_SDK=/tmp/vulkan-install/macOS cmake .. \
-DGGML_VULKAN=ON \
-DGGML_METAL=OFF \
-DGGML_METAL_EMBED_LIBRARY=OFF \
-DCMAKE_BUILD_TYPE=Release
# 编译(16 核约 5-10 分钟)
cmake --build . --config Release -j$(sysctl -n hw.logicalcpu)
六、验证设备识别
export VULKAN_SDK=/tmp/vulkan-install/macOS
export DYLD_LIBRARY_PATH=/tmp/llama.cpp/build/bin
./bin/llama-cli --list-devices
# 输出示例:
# Available devices:
# MTL0: AMD Radeon Pro 5500M (8176 MiB, 8175 MiB free)
# BLAS: Accelerate (0 MiB, 0 MiB free)
MTL0 即为 AMD 独显通过 MoltenVK(Vulkan→Metal→AMD GPU)暴露的设备。8176 MiB = 8GB VRAM。
七、下载 GGUF 量化模型
以 Qwen2.5-Coder-7B-Instruct Q4_K_M 为例(4.4GB,恰好适配 8GB VRAM):
# 从 ModelScope 下载(国内快)
curl -L -o ~/.local/share/llama-models/qwen2.5-coder-7b-instruct-q4_k_m.gguf \
"https://www.modelscope.cn/models/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF/resolve/master/qwen2.5-coder-7b-instruct-q4_k_m.gguf"
# 文件大小: ~4.5GB (Q4_K_M 量化)
八、运行推理
export VULKAN_SDK=/tmp/vulkan-install/macOS
export DYLD_LIBRARY_PATH=/tmp/llama.cpp/build/bin
llama-cli -m ~/.local/share/llama-models/qwen2.5-coder-7b-instruct-q4_k_m.gguf \
-ngl 99 \ # 99 层全部加载到 GPU
-p "写一个Python快速排序函数" \
-n 256 \ # 最大输出 256 token
--temp 0.7
九、已知问题与优化
首次运行慢
MoltenVK 首次运行需将 Vulkan compute pipeline 转换为 Metal PSO(Pipeline State Object),7B 模型涉及数十个 shader 变体,首次初始化可达数十分钟。后续运行直接使用缓存,速度正常。
用 llama-bench 预热可以提前创建 pipeline cache:
llama-bench -m model.gguf -ngl 1 -n 16
# 首次运行会创建 pipeline cache,之后推理快很多
Metal 与 Vulkan 冲突
同时启用 GGML_METAL 和 GGML_VULKAN 会导致 GGML_ASSERT(buf_src) failed 崩溃。llama.cpp 的 Metal 后端假设统一内存架构(Apple Silicon),在 Intel Mac + AMD 独显上不兼容。编译时必须 -DGGML_METAL=OFF。
VRAM 预算
模型 量化 大小 适合显卡
Qwen2.5-Coder-7B Q4_K_M 4.4GB 8GB VRAM
Qwen2.5-Coder-7B Q4_0 4.1GB 6-8GB VRAM
Qwen2.5-Coder-7B Q5_K_M 5.1GB 10GB+ VRAM
Qwen2.5-Coder-1.5B Q4_K_M ~1GB CPU 也可以
十、依赖清单总结
组件 版本 用途 来源
macOS 13.7.4 操作系统 —
GPU AMD Radeon Pro 5500M 8GB 推理加速 硬件
MoltenVK v1.4.1 Vulkan→Metal 翻译层 GitHub Releases
VulkanSDK (glslc) 1.4.350.1 / shaderc v2026.2 GLSL shader 编译 LunarG
SPIRV-Headers 1.4.350.1 SPIR-V 头文件 Homebrew
llama.cpp commit c1a1c8e LLM 推理引擎 GitHub
cmake 4.3.4 构建系统 Homebrew
十一、实测性能数据
| 模型 | 量化 | 大小 | 适合显卡 |
|---|---|---|---|
| Qwen2.5-Coder-7B | Q4_K_M | 4.4GB | 8GB VRAM |
| Qwen2.5-Coder-7B | Q4_0 | 4.1GB | 6-8GB VRAM |
| Qwen2.5-Coder-7B | Q5_K_M | 5.1GB | 10GB+ VRAM |
| Qwen2.5-Coder-1.5B | Q4_K_M | ~1GB | CPU 也可以 |
| 组件 | 版本 | 用途 | 来源 |
|---|---|---|---|
| macOS | 13.7.4 | 操作系统 | — |
| GPU | AMD Radeon Pro 5500M 8GB | 推理加速 | 硬件 |
| MoltenVK | v1.4.1 | Vulkan→Metal 翻译层 | GitHub Releases |
| VulkanSDK (glslc) | 1.4.350.1 / shaderc v2026.2 | GLSL shader 编译 | LunarG |
| SPIRV-Headers | 1.4.350.1 | SPIR-V 头文件 | Homebrew |
| llama.cpp | commit c1a1c8e | LLM 推理引擎 | GitHub |
| cmake | 4.3.4 | 构建系统 | Homebrew |
2026-06-29 实测,Qwen2.5-Coder-7B Q4_K_M,AMD Radeon Pro 5500M (8GB),macOS 13.7.4:
| 指标 | Vulkan GPU | CPU (BLAS) | 提升 |
|---|---|---|---|
| pp512 (prompt 处理) | 108.47 t/s | 27.09 t/s | 4.0× |
| tg16 (逐 token 生成) | 28.04 t/s | 6.07 t/s | 4.6× |
十二、踩坑:VK_ICD_FILENAMES 环境变量
编译完成后 llama-cli --list-devices 只显示 BLAS(CPU),不显示 AMD 独显。原因是 没设 VK_ICD_FILENAMES。
MoltenVK 不是真正的 Vulkan 驱动,而是通过 ICD(Installable Client Driver)JSON 注册到 Vulkan Loader。macOS 不像 Linux 有 /etc/vulkan/icd.d/,必须手动设置:
export VK_ICD_FILENAMES=/tmp/vulkan-sdk/macOS/share/vulkan/icd.d/MoltenVK_icd.json
设完后验证:
Available devices:
Vulkan0: AMD Radeon Pro 5500M (8176 MiB, 8176 MiB free)
Vulkan1: Intel(R) UHD Graphics 630 (65536 MiB, 1531 MiB free)
BLAS: Accelerate (0 MiB, 0 MiB free)
十三、/tmp 清理问题与持久化
llama.cpp 编译产物和 VulkanSDK 都放在 /tmp 下,macOS 重启后 /tmp 全部清空。二进制虽然拷贝到了 /usr/local/bin/,但依赖的 .dylib 丢失,导致启动时报 Library not loaded: @rpath/libllama-server-impl.dylib。
解决方案:编译产物安装到 ~/llama-metal/{bin,lib}/,rpath 修改为 @loader_path/../lib,VulkanSDK 备份到持久目录。
十四、启动 Server
#!/bin/bash
LLAMA_HOME="$HOME/llama-metal"
VULKAN_SDK=/tmp/vulkan-sdk/macOS
export VULKAN_SDK VK_ICD_FILENAMES DYLD_LIBRARY_PATH
export VK_ICD_FILENAMES="$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json"
export DYLD_LIBRARY_PATH="$VULKAN_SDK/lib:$LLAMA_HOME/lib"
exec "$LLAMA_HOME/bin/llama-server-vk" -m ~/.local/share/llama-models/qwen2.5-coder-7b-instruct-q4_k_m.gguf -ngl 99 --host 0.0.0.0 --port 28080
首次启动 server 也会触发 MoltenVK pipeline 编译,用 llama-bench 预热可大幅缩短等待时间。启动后 curl 验证:
curl http://localhost:28080/v1/chat/completions -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"Hi"}],"max_tokens":10}'
简记。







