## 2、环境准备与编译:安装依赖与编译选项详解 说实话,环境配置这一步,很多人觉得枯燥。但我在项目里栽过跟头——有次为了赶演示,直接跳过了cuBLAS版本检查,结果跑出来的结果全是错的。从那以后,我老老实实把依赖一项项捋清楚,再也没出过这种低级问题。

为什么我要做这么细?

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 核显,也能跑,就是慢点。

依赖清单速查表:

依赖最低版本用途来源
CMake3.20构建系统apt/homebrew/官网
CUDA11.7GPU驱动+编译器NVIDIA官网
cuBLAS与CUDA版本匹配GPU矩阵加速随CUDA附送
CLBlast1.5OpenCL矩阵加速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_NATIVEON/OFF是否针对本机CPU优化。ON会跑一些快速检测,但版本敏感。
-DLLAMA_METAL=OFF默认OFF苹果M系列芯片专用,跟CUDA冲突,显式关掉。
-DLLAMA_AVX2=ONON/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

如果输出正常,且显卡占用率飙起来,那就恭喜了,环境通了。

llama.cpp 多GPU编译流程 安装依赖 CMake CUDA 选择后端 CUDA CLBlast 编译选项 -DLLAMA_CUDA=ON -DLLAMA_CUBLAS=ON -DLLAMA_CLBLAST=ON cmake .. && make -j$(nproc) 运行 ./main --help 注意:CUDA 与 CLBlast 二选一,不能同时开启

小结一下:环境准备就是三步走——装CMake、装CUDA/CLBlast、选对编译选项。我建议你先把依赖装全,再执行 cmake 命令。如果不确定,先跑 cmake .. -DLLAMA_CUDA=ON -DLLAMA_CUBLAS=ON 试一下,出错就回头看依赖。别慌,出错提示通常很明确。