第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
-DLLAMA_BLAS_VENDOR=OpenBLAS
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 流程图,把整个环境搭建的逻辑串了一遍。你可以对照着它,一步步走。

环境搭建核心流程 安装基础工具链 下载 llama.cpp 源码 切到稳定发布版本 cmake 配置编译选项 使用 make 编译 验证可执行文件 踩坑点: GPU 选项别一次全开

看这张图,从左到右就是实际操作顺序。每一步都可能踩坑,但只要你按表格里的命令走,别漏掉切稳定版本那一步,基本就能顺利走到最后。

再啰嗦一句:别在 build 目录外执行 make。我见过有人直接在项目根目录下 run make,结果 CMakeLists.txt 找不到 include 路径,报错一堆。规矩点,进 build 再编译。