Intel Mac + AMD 独显跑 llama.cpp Vulkan 后端简记

发表于 1 天前  23 次阅读


文章目录

背景

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 Toolsxcode-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_METALGGML_VULKAN 会导致 GGML_ASSERT(buf_src) failed 崩溃。llama.cpp 的 Metal 后端假设统一内存架构(Apple Silicon),在 Intel Mac + AMD 独显上不兼容。编译时必须 -DGGML_METAL=OFF

VRAM 预算

模型量化大小适合显卡
Qwen2.5-Coder-7BQ4_K_M4.4GB8GB VRAM
Qwen2.5-Coder-7BQ4_04.1GB6-8GB VRAM
Qwen2.5-Coder-7BQ5_K_M5.1GB10GB+ VRAM
Qwen2.5-Coder-1.5BQ4_K_M~1GBCPU 也可以

十、依赖清单总结

组件版本用途来源
macOS13.7.4操作系统
GPUAMD Radeon Pro 5500M 8GB推理加速硬件
MoltenVKv1.4.1Vulkan→Metal 翻译层GitHub Releases
VulkanSDK (glslc)1.4.350.1 / shaderc v2026.2GLSL shader 编译LunarG
SPIRV-Headers1.4.350.1SPIR-V 头文件Homebrew
llama.cppcommit c1a1c8eLLM 推理引擎GitHub
cmake4.3.4构建系统Homebrew

十一、实测性能数据

2026-06-29 实测,Qwen2.5-Coder-7B Q4_K_M,AMD Radeon Pro 5500M (8GB),macOS 13.7.4:

指标Vulkan GPUCPU (BLAS)提升
pp512 (prompt 处理)108.47 t/s27.09 t/s4.0×
tg16 (逐 token 生成)28.04 t/s6.07 t/s4.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}'

简记。


scanz个人博客