为什么我要做这么细?
llama.cpp 支持多GPU并行,底层靠的是CUDA或CLBlast。少了哪个依赖,编译出来的二进制跑单卡都费劲,更别提并行。我习惯把依赖拆成两块:**必选**(CMake、C++编译器)和**加速可选**(CUDA、cuBLAS、CLBlast)。摸清这些,再动手编译。1. 安装依赖
CMake
llama.cpp 的构建系统是CMake。版本别太低,我建议至少 3.20 以上。
# Ubuntu / Debian
sudo apt update && sudo apt install cmake
# macOS (Homebrew)
brew install cmake
# Windows (直接去官网下载msi)
# 或者用 scoop: scoop install cmake
装完记得验证:cmake --version。低于3.15的必须升级,不然有些CUDA选项不识别。
CUDA 与 cuBLAS
多GPU的首选加速库。cuBLAS 是 CUDA 自带的线性代数库,llama.cpp 用它做矩阵计算。
# 从 NVIDIA 官网下载 runfile / deb 安装
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
sudo sh cuda_12.1.0_530.30.02_linux.run
# 安装后加环境变量
export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH
我踩过的坑:cuBLAS 的版本必须跟 CUDA 一致。曾经想偷懒,把 CUDA 11.8 和 cuBLAS 12.0 混着用,编译通过了,运行就段错误。老老实实用配套版本吧。
CLBlast
如果显卡不是 N 卡(比如 AMD、Intel 独显),可以用 OpenCL 路线,CLBlast 就是 OpenCL 版的 cuBLAS。性能略差,但能用。
# Ubuntu
sudo apt install opencl-headers ocl-icd-opencl-dev
git clone https://github.com/CNugteren/CLBlast.git
cd CLBlast && cmake . && make -j4 && sudo make install
注意:CLBlast 需要显卡驱动支持 OpenCL。我试过 Intel 核显,也能跑,就是慢点。
依赖清单速查表:
| 依赖 | 最低版本 | 用途 | 来源 |
|---|---|---|---|
| CMake | 3.20 | 构建系统 | apt/homebrew/官网 |
| CUDA | 11.7 | GPU驱动+编译器 | NVIDIA官网 |
| cuBLAS | 与CUDA版本匹配 | GPU矩阵加速 | 随CUDA附送 |
| CLBlast | 1.5 | OpenCL矩阵加速 | GitHub Release |
2. 编译选项详解
环境装好,就该编译了。llama.cpp 的编译选项特别多,我挑几个跟多GPU强相关的讲。
# 基本编译命令(进入 llama.cpp 目录)
mkdir build && cd build
cmake .. \
-DLLAMA_CUDA=ON \
-DLLAMA_CUBLAS=ON \
-DCMAKE_CUDA_ARCHITECTURES="80;86" \
-DLLAMA_NATIVE=OFF
make -j$(nproc)
这里重点讲 -DLLAMA_CUDA 和 -DLLAMA_CLBLAST。
-DLLAMA_CUDA=ON
启用CUDA支持。打开后,llama.cpp 会把大部分计算放到GPU上。但注意:这个选项默认只编译一个GPU后端。要启用多GPU,必须配合 -DLLAMA_CUBLAS=ON。
-DLLAMA_CUBLAS=ON
这个才是多GPU的关键。它让 llama.cpp 使用 cuBLAS 的 cublasSgemmStridedBatched 等API,自动将矩阵乘法分发到所有可用GPU上。我见过有人只开了 LLAMA_CUDA 没开 LLAMA_CUBLAS,结果跑起来只用了1张卡,气得够呛。
-DLLAMA_CLBLAST=ON
对应 OpenCL 路线,跟 LLAMA_CUBLAS 互斥。只能选一个。如果你用 AMD 或 Intel 显卡,就开这个。
其他重要选项
| 选项 | 值示例 | 说明 |
|---|---|---|
| -DCMAKE_CUDA_ARCHITECTURES | "80;86" | 限定CUDA架构,加快编译。RTX 30系列用80,40系列用90。 |
| -DLLAMA_NATIVE | ON/OFF | 是否针对本机CPU优化。ON会跑一些快速检测,但版本敏感。 |
| -DLLAMA_METAL=OFF | 默认OFF | 苹果M系列芯片专用,跟CUDA冲突,显式关掉。 |
| -DLLAMA_AVX2=ON | ON/OFF | 启用AVX2指令集,CPU算子能快20%。老CPU(如Haswell以下)可能不支持。 |
我的编译小技巧:
- 第一次编译加
-j$(nproc),多核并行,能省一半时间。 - 如果编译报错提示“找不到cublas”,先检查
CUDA_PATH环境变量,没有就自己export CUDA_PATH=/usr/local/cuda-12.1。 - 用
cmake .. -LA可以列出所有选项,方便排查。
曾经有人问我:能不能同时开 CUDA 和 CLBlast?
不行。两者是不同后端,编译时只能二选一。但运行时你可以通过命令行参数切换 --gpu-layers 和 --no-gpu-accel,不过那是后话了。
3. 验证编译结果
编译完后,在 build/bin 下会有个 main 可执行文件。跑一下 ./main --help,看看有没有 --gpu-layers 选项。如果有,说明CUDA支持成功。再跑一个小模型试试:
./main -m /path/to/llama-7b.gguf -p "Hello" -n 10 --gpu-layers 35
如果输出正常,且显卡占用率飙起来,那就恭喜了,环境通了。
小结一下:环境准备就是三步走——装CMake、装CUDA/CLBlast、选对编译选项。我建议你先把依赖装全,再执行 cmake 命令。如果不确定,先跑 cmake .. -DLLAMA_CUDA=ON -DLLAMA_CUBLAS=ON 试一下,出错就回头看依赖。别慌,出错提示通常很明确。