llama.cpp 与 GGUF 生态
Ollama 背后的引擎
当你用 Ollama 运行模型时,底层做推理的其实是 llama.cpp——一个纯 C/C++ 实现的 LLM 推理引擎。
为什么要了解 llama.cpp?因为当你需要更精细的控制时——自定义推理参数、优化性能、集成到自己的应用中——直接使用 llama.cpp 会给你更大的灵活性。
llama.cpp 是什么
llama.cpp 由 Georgi Gerganov 在 2023 年发起,最初目标是在 MacBook 上运行 Meta 的 LLaMA 模型。现在它已经发展成一个支持几乎所有主流开源模型的通用推理引擎。
核心特点:
- 纯 C/C++,无 Python 依赖,编译后就是一个二进制文件
- 支持多种硬件:CPU(x86、ARM)、NVIDIA GPU(CUDA)、Apple GPU(Metal)、AMD GPU(ROCm)
- GGUF 格式的定义者——本地模型的事实标准
- 极致优化:手写 SIMD 指令、内存映射、各种量化方案
从源码编译
大多数情况下你不需要自己编译——Ollama 已经封装好了。但如果你想深入定制:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# macOS (Metal GPU 加速)
cmake -B build
cmake --build build --config Release
# Linux with CUDA
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release
# 纯 CPU
cmake -B build
cmake --build build --config Release
编译后会生成几个关键工具:
llama-cli:命令行对话工具llama-server:HTTP API 服务器llama-quantize:模型量化工具
命令行推理
# 基本对话
./build/bin/llama-cli \
-m models/llama-3-8b-Q4_K_M.gguf \
-p "Explain recursion in simple terms:" \
-n 256
# 交互模式
./build/bin/llama-cli \
-m models/llama-3-8b-Q4_K_M.gguf \
--interactive \
--color
关键参数详解
| 参数 | 含义 | 推荐值 |
|---|---|---|
-m | 模型文件路径 | — |
-ngl | GPU 卸载层数(越大用 GPU 越多) | 全部层数(如 33) |
-c | 上下文长度 | 4096-8192 |
-t | CPU 线程数 | 物理核心数 |
--temp | 温度(越高越随机) | 0.7(对话)/ 0(确定性任务) |
--top-p | nucleus 采样阈值 | 0.9 |
--repeat-penalty | 重复惩罚 | 1.1 |
-n | 最大生成 token 数 | 256-2048 |
最重要的参数是 -ngl(GPU layers)。它决定了多少模型层放到 GPU 上运行。设为 999 表示"尽可能多地用 GPU"。如果 GPU 显存不够,llama.cpp 会自动把剩余层放到 CPU 上——这就是部分卸载(partial offload)。
llama-server:HTTP API 服务
./build/bin/llama-server \
-m models/llama-3-8b-Q4_K_M.gguf \
-c 4096 \
-ngl 99 \
--host 0.0.0.0 \
--port 8080
启动后,你得到一个兼容 OpenAI API 的 HTTP 服务:
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama-3-8b",
"messages": [{"role":"user","content":"Hello!"}]
}'
llama-server 还自带一个 Web UI,浏览器打开 http://localhost:8080 就能直接对话。
llama.cpp vs Ollama
| llama.cpp | Ollama | |
|---|---|---|
| 定位 | 底层推理引擎 | 用户友好的模型管理工具 |
| 上手难度 | 需要手动配置 | 开箱即用 |
| 灵活性 | 完全可控 | 封装了常用场景 |
| 模型管理 | 手动下载文件 | 内置模型仓库 |
| 参数调优 | 精细控制每个参数 | 提供常用参数 |
| 性能 | 相同(Ollama 底层就是 llama.cpp) | 相同 |
| 适合 | 需要深度定制的场景 | 日常使用、快速原型 |
简单来说:日常使用选 Ollama,需要深度控制选 llama.cpp。
模型量化
如果你有一个 FP16 的模型,可以用 llama.cpp 自己做量化:
# 转换 Hugging Face 模型为 GGUF
python convert_hf_to_gguf.py /path/to/model --outfile model-f16.gguf
# 量化
./build/bin/llama-quantize model-f16.gguf model-Q4_K_M.gguf Q4_K_M
llama.cpp 的绑定和生态
虽然 llama.cpp 是 C/C++ 写的,但有丰富的语言绑定:
- llama-cpp-python:Python 绑定,可以直接在 Python 中调用
- node-llama-cpp:Node.js 绑定
- Ollama:本质上是 llama.cpp 的 Go 封装
- LM Studio:基于 llama.cpp 的桌面 GUI 应用
要点总结
- llama.cpp 是本地 LLM 推理的基础设施——Ollama、LM Studio 等工具底层都在用它。
-ngl是最关键的参数——它决定了 GPU 使用比例,直接影响推理速度。- llama-server 提供 OpenAI 兼容 API——比 Ollama 更轻量,适合需要精细控制的场景。
- 日常用 Ollama,深度定制用 llama.cpp。两者性能相同,选择取决于你需要多少控制权。