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模型文件路径
-nglGPU 卸载层数(越大用 GPU 越多)全部层数(如 33)
-c上下文长度4096-8192
-tCPU 线程数物理核心数
--temp温度(越高越随机)0.7(对话)/ 0(确定性任务)
--top-pnucleus 采样阈值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.cppOllama
定位底层推理引擎用户友好的模型管理工具
上手难度需要手动配置开箱即用
灵活性完全可控封装了常用场景
模型管理手动下载文件内置模型仓库
参数调优精细控制每个参数提供常用参数
性能相同(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 应用

要点总结

  1. llama.cpp 是本地 LLM 推理的基础设施——Ollama、LM Studio 等工具底层都在用它。
  2. -ngl 是最关键的参数——它决定了 GPU 使用比例,直接影响推理速度。
  3. llama-server 提供 OpenAI 兼容 API——比 Ollama 更轻量,适合需要精细控制的场景。
  4. 日常用 Ollama,深度定制用 llama.cpp。两者性能相同,选择取决于你需要多少控制权。