第3章 环境搭建(一):Linux/macOS系统下的编译安装、依赖项与cmake配置
先把话说在前头:llama.cpp 的编译,没你想的那么玄乎。说白了就是一套标准的 CMake 流程,跟我们平时编译其他 C++ 项目差不多。但有几个坑,我当年踩了一遍又一遍。这章咱们就把 Linux 和 macOS 上的环境捋顺,跟着走一遍,基本不会出幺蛾子。
3.1 为什么非要源码编译?
你可能会问:官方不是有 Releases 吗?下个二进制包不行吗?
嗯,这里要注意。官方预编译包用的是通用指令集,比如 AVX2、AVX512 这种。但你的 CPU 可能支持更新的指令集,或者你打算用 GPU 加速(CUDA / Metal / Vulkan)。这个时候预编译包就跑不满了。
我个人习惯,只要是做模型转换,一定走源码编译。原因是:你能精确控制编译选项,压榨出硬件的全部性能。
核心思路:源码编译 ≈ 给 llava.cpp 套上一件为你 CPU/GPU 量身定做的跑鞋。套错了,跑起来可能还不如别人穿拖鞋快。
3.2 安装基础依赖项
不管 Linux 还是 macOS,第一件事是把基础工具链补齐。这里我列一张对照表,方便你对照自己系统操作。
| 操作系统 | 包管理器 | 安装命令(核心依赖) | 备注 |
|---|---|---|---|
| Ubuntu / Debian | apt | sudo apt install build-essential cmake git |
build-essential 包含了 gcc / g++ |
| Fedora / CentOS / RHEL | dnf / yum | sudo dnf groupinstall "Development Tools" && sudo dnf install cmake git |
也可以用 epel 源更新 cmake 版本 |
| Arch Linux | pacman | sudo pacman -S base-devel cmake git |
base-devel 已包含 gcc / make 等 |
| macOS | Homebrew | brew install cmake git |
Xcode Command Line Tools 需提前装好 |
macOS 用户特别注意:gcc 实际上是苹果的 Clang,不是 GNU GCC。不过 llava.cpp 对此完全兼容,所以不用纠结。我之前在 macOS 上跑过上百次编译,Clang 的优化效果有时候比 Linux 上的 GCC 还稳。
我的小建议:装完 cmake 后跑一下 cmake --version,版本至少 ≥ 3.20。太老的版本有些选项不认识,报错了别来找我,先看看是不是这里的问题。
3.3 下载 llama.cpp 源码
这一步很简单,你想想看,跟克隆任何 GitHub 项目没区别:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
我习惯在克隆之后,先切到一个稳定的发布的 tag,而不是直接用 main 分支。原因很现实:main 分支可能随时有 API 变更,你今天配好了,明天就可能跑不起来。
git tag -l "b*" | sort -V
git checkout bXXXX # 选一个近期稳定的版本,比如 b4082
踩坑回忆:我曾经有一次偷懒没切 tag,直接用 main 分支编译。结果那天作者刚好大改了量化接口,我的整个测试脚本全部报废。从那以后,我再也不敢在 main 分支上跑生产流程了。
3.4 CMake 配置详解
好了,前面都是热身。现在进入正题:cmake 的配置。这是很多人第一次卡住的地方。
llava.cpp 的 CMake 层设计得很清晰,所有可选项都在 CMakeLists.txt 里。我这里提炼了一份最实用的选项清单:
| 选项 | 默认值 | 作用 | 什么时候打开 |
|---|---|---|---|
-DCMAKE_BUILD_TYPE=Release |
无 | 优化编译,生成最快可执行程序 | 永远打开 |
-DLLAMA_CUBLAS=ON |
OFF | 启用 NVIDIA CUDA 加速 | 你有 NVIDIA GPU 且装了 CUDA Toolkit |
-DLLAMA_METAL=ON |
OFF | 启用 Apple Metal 加速(M1/M2/M3) | 装的是 macOS + Apple Silicon |
-DLLAMA_CLBLAST=ON |
OFF | 启用 OpenCL 加速(AMD / Intel GPU) | 你的 GPU 只能用 OpenCL,且装了相关库 |
-DLLAMA_BLAS=ON |
OFF | 用 BLAS 库加速 CPU 推理 | 想压榨 CPU 算力(一般服务器上用得多) |
实际执行时,先在项目根目录建一个 build 目录,这是个好习惯——不要把编译产生的垃圾散落在源码里。
mkdir build && cd build
# CPU-only,通用配置
cmake .. -DCMAKE_BUILD_TYPE=Release
# 如果你有 NVIDIA GPU
cmake .. -DCMAKE_BUILD_TYPE=Release -DLLAMA_CUBLAS=ON
# 如果你是 macOS Apple Silicon 用户
cmake .. -DCMAKE_BUILD_TYPE=Release -DLLAMA_METAL=ON
cmake 跑完之后,会输出一大堆信息。我一般会扫一眼最后几行,看有没有 -- Configuring done 以及 -- Generating done。如果看到红字报错,先别慌。多半是缺少某个库,或者路径不对。你想想看,llava.cpp 对 CUDA 的依赖其实很轻,如果你不用 GPU 加速,完全可以把 GPU 相关的选项全部关掉。
一句话总结:第一次编译不要追求什么都打开。先走纯 CPU 的配置,跑通了再慢慢加 GPU 支持。这样万一出问题,你才知道是哪个环节挂了。
3.5 编译与验证
配置完 cmake 之后,编译就一句话的事:
make -j$(nproc)
# macOS 上没有 nproc,可以用这个:
make -j$(sysctl -n hw.logicalcpu)
-j 后面的数字表示并行编译的线程数。我建议填你 CPU 的逻辑核心数,这样编译最快。但如果你电脑上还在跑别的任务,比如还在训练模型,那就少开点,否则风扇吵得你想砸电脑。
编译完成后,build/bin/ 目录下会出现一堆可执行文件。我们最关心的是这几个:
- main —— 最核心的推理程序,以后跑模型全靠它
- quantize —— 量化工具,GGUF 转换的关键步骤
- convert.py —— Python 脚本,负责把原始模型转成 GGUF 格式(这个不在 build 里,在项目根目录的根目录下)
- server —— HTTP 服务接口,可以部署成 API 服务
验证一下:
./bin/main --help
如果能看到一堆参数说明,恭喜你,环境搭建成功了。
一个实用技巧:我一般会在 build 目录下把所有生成的可执行文件都列一遍:ls -lh bin/。如果看到文件大小是几十 KB 甚至几 KB,那可能是编译失败了(正确的文件应该是几 MB 到几十 MB)。别问我怎么知道的,问就是见过太多回。
3.6 本章知识结构图
下面这张 SVG 流程图,把整个环境搭建的逻辑串了一遍。你可以对照着它,一步步走。
看这张图,从左到右就是实际操作顺序。每一步都可能踩坑,但只要你按表格里的命令走,别漏掉切稳定版本那一步,基本就能顺利走到最后。
再啰嗦一句:别在 build 目录外执行 make。我见过有人直接在项目根目录下 run make,结果 CMakeLists.txt 找不到 include 路径,报错一堆。规矩点,进 build 再编译。