环境准备
在动手之前,先确认一下你的硬件和驱动。这套操作我在 RX 6800 XT 上跑通,其他 RDNA2/3 卡也适用,但显存不够的卡可能要自觉降模型。
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| AMD 显卡 | RX 580 8GB | RX 6800 XT |
| 系统内存 | 16GB | 32GB |
| 驱动版本 | 22.5.1 | 23.11.1+ |
| 存储空间 | 20GB 可用 | 50GB 可用 |
驱动这块,如果是较新的内核,直接装 mesa-vulkan-drivers 就行,不用折腾 ROCm。跑一下 vulkaninfo --summary 确认能看到自己的卡。
快速编译部署
先把项目拉下来,编译时打开 Vulkan 支持。我习惯把所有步骤写进一个脚本,省得每次手敲:
#!/bin/bash
# 检查驱动版本
VULKAN_VERSION=$(vulkaninfo | grep "driverVersion" | head -1)
echo "当前 Vulkan 驱动版本:$VULKAN_VERSION"
sudo apt update
sudo apt install -y build-essential cmake vulkan-utils
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build && cd build
cmake -DLLAMA_VULKAN=ON -DAMD_VULKAN_COMPAT=ON ..
make -j$(nproc)
echo "编译完成"
AMD_VULKAN_COMPAT 这个选项在一些老卡上能避免奇怪的显存分配错误,如果确定是新卡也可以不加。
内存分配配置
llama.cpp 默认的显存分配比较保守,尤其是跨设备内存共享时容易成为瓶颈。可以把下面内容写成 amd_memory.cfg(非必须,但方便调参):
[memory]
device_local_ratio = 0.8
host_visible_ratio = 0.2
max_buffer_size = 4294967296
prefer_coherent = true
device_local_ratio 设成 0.8 能更激进地使用显存,但 32G 不到的卡别这么玩,容易 OOM。我在 RX 6800 XT 上跑 13B 模型,这个值可以到 0.75 比较稳妥。
运行时参数调整
如果不想动源码,启动参数直接影响推理速度。下面是一些常用的组合:
# RX 6800 XT 上跑 13B 的典型配置
./main -m model.gguf -p "你的提示词" \
--backend vulkan \
--vulkan-device 0 \
--n-gpu-layers 35 \
--vulkan-queue-count 4 \
--vulkan-workgroup-size 256
--n-gpu-layers设成 35 基本把整个模型怼进显存,速度快一截。--vulkan-queue-count调成 4 在 RDNA2 上表现不错,再大意义不大。--vulkan-workgroup-size256 是这代卡的一个甜点值。
至于代码层的调优,可以参照下面这个 struct 自己改 src/llama.cpp,但通常不必要:
struct amd_optimize_config {
bool enable_async_transfer = true;
int compute_units_override = 0; // 0 表示自动检测
bool use_shared_memory = true;
float memory_compression_ratio = 0.75f;
};
实测速度
下面是我在 RX 6800 XT 上跑不同模型得到的数据,优化前指的是默认参数,优化后是用了上述内存配置和运行时参数:
| 模型大小 | 优化前 (tokens/s) | 优化后 (tokens/s) | 提升幅度 |
|---|---|---|---|
| 7B | 12.5 | 28.3 | +126% |
| 13B | 8.2 | 18.7 | +128% |
| 70B | 2.1 | 5.8 | +176% |
70B 模型其实已经爆显存了,全靠内存这边扛着,所以绝对值低,但相对提升依然明显。
按显卡系列微调
RX 6000 系列 (RDNA2)
上面的参数基本就是为这个系列试出来的,额外可以试一下 --tensor-split 1.0 强制所有张量放一块卡上(多卡才需要切)。
RX 7000 系列 (RDNA3)
新架构的 workgroup 优化有所不同,有些反馈把 --vulkan-workgroup-size 设成 128 反而更快。可以自己对比一下:
./main -m model.gguf \
--gpu-layers 40 \
--main-gpu 0 \
--tensor-split 1.0 \
--vulkan-workgroup-size 128
常见问题
启动时报 vkCreateInstance failed
十有八九是 Vulkan 驱动没装全或用户组权限问题。执行:
sudo apt install mesa-vulkan-drivers mesa-opencl-icd
vulkaninfo --summary
确认没有报错。如果还不行,检查 VK_ICD_FILENAMES 环境变量是否指向正确的 ICD 文件。
模型加载到一半卡住
显存不够,--n-gpu-layers 设得太高了。先降一些,比如先试 25,看能否完整加载,再慢慢往上加。
推理速度明显不如预期
先跑一下 rocm-smi --showuse(如果有 ROCm)或 nvtop,看 GPU 占用率。如果占用率低,检查 --vulkan-device 是否指向了正确的卡,或者尝试 --vulkan-queue-count 稍微调高。
实时监控
我平时会在另一个终端跑个小脚本,随时看 GPU 和显存状态:
#!/bin/bash
while true; do
GPU_USAGE=$(rocm-smi --showuse 2>/dev/null | grep "GPU use" | awk '{print $3}')
MEMORY_USAGE=$(rocm-smi --showmemuse 2>/dev/null | grep "GPU memory use" | awk '{print $4}')
echo "GPU 使用率:$GPU_USAGE% | 显存使用:$MEMORY_USAGE%"
sleep 2
done
没有 ROCm 的卡就用 radeontop 或者看 /sys/class/drm/card*/device/gpu_busy_percent。
