为什么要在 CPU 上跑 LLM?
你可能没有一张像样的 NVIDIA 显卡:
- 你的主力机是 MacBook
- 你的台式机没有独显(核显办公机)
- 你想利用 E5 洋垃圾的 28 个核心做免费劳动力
- 你需要 7×24 跑一个后台推理服务,不想占用 GPU 资源
llama.cpp 就是为此而生的。 它是一个纯 C/C++ 实现的 LLM 推理引擎,没有 Python 依赖,不需要 CUDA,在 CPU 上就能高效运行大模型。
安装 llama.cpp
编译安装(推荐,能获得最佳性能)
# 克隆仓库
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# 方法1:标准编译(所有 CPU 通用)
make -j$(nproc)
# 方法2:开启优化编译(推荐,E5 用户选这个)
make LLAMA_NATIVE=1 LLAMA_AVX2=1 -j$(nproc)
# 方法3:如果你有 NVIDIA 显卡但也想用 CPU 模式
make LLAMA_CUDA=1 LLAMA_AVX2=1 -j$(nproc)
# 验证安装
./llama-cli --version
懒人方案:下载 Release 版
去 llama.cpp Releases 下载对应系统的预编译包:
# Linux/macOS
wget https://github.com/ggerganov/llama.cpp/releases/download/b4360/llama-b4360-bin-ubuntu-x64.zip
unzip llama-b4360-bin-ubuntu-x64.zip
cd llama-b4360-bin-ubuntu-x64
下载 GGUF 模型
llama.cpp 使用 GGUF 格式的模型文件。你可以从 HuggingFace 下载:
# 下载 Qwen2.5-7B GGUF(Q4量化,约 4.5GB)
pip install huggingface-hub
huggingface-cli download Qwen/Qwen2.5-7B-Instruct-GGUF qwen2.5-7b-instruct-q4_k_m.gguf \
--local-dir ./models
# 或者直接 wget
wget https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF/resolve/main/qwen2.5-7b-instruct-q4_k_m.gguf \
-O ./models/qwen2.5-7b-instruct-q4_k_m.gguf
推荐模型与量化选择
| 模型 | 量化 | 文件大小 | 推荐 CPU |
|---|---|---|---|
| Qwen2.5-7B | Q4_K_M | 4.5GB | 任何 6 核以上 |
| Qwen2.5-7B | Q8_0 | 7.5GB | 8 核以上 |
| Qwen2.5-14B | Q4_K_M | 8.5GB | 12 核以上 |
| DeepSeek-R1-7B | Q4_K_M | 4.7GB | 任何 6 核以上 |
| Llama-3.2-3B | Q4_K_M | 2.0GB | 轻量首选,4 核都能跑 |
| Llama-3.1-8B | Q4_K_M | 5.0GB | 8 核以上推荐 |
| Mistral-7B | Q4_K_M | 4.3GB | 6 核以上 |
量化级别说明:Q4_K_M 是性价比最高的选择,占用小、速度尚可、质量损失很小。Q8_0 质量更好但体积翻倍。Q2_K 虽然最小但不推荐,质量下降明显。
运行你的第一个模型
基本用法
# 交互模式(类似 ChatGPT)
./llama-cli \
-m ./models/qwen2.5-7b-instruct-q4_k_m.gguf \
-p "你好,请介绍一下你自己" \
-n 512 \
-t 8
# 参数说明:
# -m: 模型文件路径
# -p: 输入提示词
# -n: 最大生成 token 数
# -t: CPU 线程数(建议设为物理核心数)
交互式聊天模式
# 用 chat 模板启动完整对话
./llama-cli \
-m ./models/qwen2.5-7b-instruct-q4_k_m.gguf \
-f ./prompts/chat-with-bob.txt \
-n 512 \
-t 8 \
-c 4096 \
--chat-template chatml
# 聊完输入 /reset 清空历史
# 输入 /exit 退出
启动 API 服务器
# 启动兼容 OpenAI API 的服务
./llama-server \
-m ./models/qwen2.5-7b-instruct-q4_k_m.gguf \
-t 8 \
-c 4096 \
--port 8080
# 然后可以用 curl 调用
curl http://localhost:8080/v1/chat/completions \
-d '{
"model": "qwen2.5-7b",
"messages": [{"role": "user", "content": "你好"}]
}'
性能优化指南
E5 多核优化
E5 2680 v4(14核28线程)的最佳配置:
# 方案1:极致吞吐量(适合 API 服务)
./llama-cli -m model.gguf -t 12 -tb 2 -ngl 0
# 方案2:平衡模式(适合交互聊天)
./llama-cli -m model.gguf -t 8 -tb 2 -c 4096
# 方案3:低延迟模式
./llama-cli -m model.gguf -t 6 -c 2048 --no-mmap
关键性能参数:
| 参数 | 作用 | 建议值 |
|---|---|---|
-t | 推理线程数 | CPU 物理核心数(不要用超线程) |
-tb | 批处理线程数 | 2-4,多核 CPU 建议 2 |
-c | 上下文大小 | 2048-8192,越大越占内存 |
--no-mmap | 禁用内存映射 | 内存不够时开启 |
--mlock | 锁定内存防交换 | 推荐开启提升稳定性 |
-ngl | GPU 层数 | 0=纯CPU,>0 表示有多少层交给 GPU |
内存需求计算
7B Q4_K_M: 约 4.5GB 模型 + 4096 上下文 ≈ 5.5GB 内存
7B Q8_0: 约 7.5GB 模型 + 4096 上下文 ≈ 8.5GB 内存
14B Q4_K_M: 约 8.5GB 模型 + 4096 上下文 ≈ 10GB 内存
14B Q8_0: 约 15GB 模型 + 4096 上下文 ≈ 17GB 内存
实测速度基准
在 E5 2680 v4 (14核, 32G RECC) 上的实测:
| 模型 | 量化 | 线程 | Prompt 处理 | 生成速度 |
|---|---|---|---|---|
| Qwen2.5-7B | Q4_K_M | 8 | 8.2 tok/s | 5.6 tok/s |
| Qwen2.5-7B | Q4_K_M | 12 | 10.5 tok/s | 6.8 tok/s |
| Qwen2.5-7B | Q4_K_M | 14 | 11.2 tok/s | 7.1 tok/s |
| Qwen2.5-7B | Q8_0 | 12 | 5.5 tok/s | 3.8 tok/s |
| Llama-3.2-3B | Q4_K_M | 8 | 28 tok/s | 15 tok/s |
| DeepSeek-R1-7B | Q4_K_M | 12 | 9.8 tok/s | 6.2 tok/s |
可见 12-14 线程是甜点区,继续增加线程收益递减。生成速度 5-7 tok/s 对阅读来说已经可以接受(相当于每分钟 300-400 字)。
macOS (Apple Silicon) 用户
# M1/M2/M3 芯片用 Metal 加速
make LLAMA_METAL=1 -j$(nproc)
# M系列芯片跑 7B Q4 可以达到 20-30 tok/s
./llama-cli -m model.gguf -ngl 1
Windows 特殊配置
用 MSVC 编译
# 打开 x64 Native Tools Command Prompt
cd llama.cpp
mkdir build && cd build
cmake .. -DLLAMA_AVX2=ON -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
或者用 WSL
最简单的方法是在 WSL2 里跑,完全遵循 Linux 教程即可。
高级用法
从模型库批量生成
#!/bin/bash
# batch.sh - 批量处理文本
while read -r line; do
./llama-cli -m model.gguf -p "$line" -n 256 -t 8 --no-display-prompt
done < prompts.txt
模型拼接与量化
想把其他格式(如 PyTorch)的模型转成 GGUF?
# 转换 HuggingFace 模型到 GGUF
python convert_hf_to_gguf.py \
./my-model/ \
--outfile ./models/my-model-q4_k_m.gguf \
--outtype q4_k_m
嵌入向量提取
# 获取文本嵌入向量(可用于 RAG)
./llama-embedding \
-m ./models/qwen2.5-7b-instruct-q4_k_m.gguf \
-p "需要嵌入的文本" \
--embd-normalize 2
总结
llama.cpp 让没有 NVIDIA 显卡的用户也能跑大模型,核心要点:
- 选对量化:Q4_K_M 是性价比之王
- 控制上下文:4096 是平衡值,不要无脑开大
- 线程不是越多越好:设为核心数,再多反而变慢
- 7B 模型在 E5 上可达 5-7 tok/s:可用的速度,适合后台服务
- 如果追求交互体验:还是建议上显卡,CPU 适合不赶时间的场景
记住:llama.cpp 不是要和 GPU 方案竞争,而是要填补”没有显卡”这个空白。 对于 E5 洋垃圾用户、Mac 用户、服务器后台任务来说,它是最好的选择。