llama.cpp 基准测试与调参实战
本地跑大语言模型,速度问题通常不是'硬件行不行',而是参数有没有喂对。很多人会碰到这种情况:同一台机器,别人的 tokens/秒 明显更高,自己却一直上不去。llama-bench 的价值就在这里——它把测试流程尽量固定下来,先把基线跑出来,再谈优化,不然很容易把偶然波动当成调参成果。
先看清楚要测什么
llama-bench 主要看两类指标:
- PP(Prompt Processing):提示词处理速度,反映模型吃输入的效率。
- TG(Text Generation):生成速度,直接关系到对话时的体感。
这两个数经常不是一起涨的。某些参数会明显提升 PP,但 TG 没怎么动;也有些配置生成更顺手,处理长上下文却一般。只盯一个指标,很容易调偏。
环境准备和基础跑法
先把 llama.cpp 编出来,生成 llama-bench:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make llama-bench
准备好 GGUF 模型后,可以直接跑默认测试:
./llama-bench -m models/7B/ggml-model-q4_0.gguf
默认输出是 Markdown 表格,里面会给出提示词处理和文本生成的平均速度。示例大概长这样:
| model | size | params | backend | ngl | test | t/s |
|---|---|---|---|---|---|---|
| llama 7B mostly Q4_0 | 3.56GiB | 6.74B | CUDA | 99 | pp512 | 2368.80±93.24 |
| llama 7B mostly Q4_0 | 3.56GiB | 6.74B | CUDA | 99 | tg128 | 131.42±0.59 |
llama-bench 还支持几种常见测试方式,够用就行,不必把参数堆得太满:
| 测试模式 | 参数组合 | 适用场景 |
|---|---|---|
| 仅提示词处理 | -p 1024 -n 0 | 评估长文档理解性能 |
| 仅文本生成 | -p 0 -n 256 | 优化对话生成流畅度 |
| 混合测试 | -pg 512,128 | 模拟实际对话场景 |
真正影响速度的几个参数
GPU 层分配 -ngl
-ngl 基本是最先该试的参数。它决定多少层模型会被卸载到 GPU 上。层数越多,通常越快,但也更容易碰到显存边界。这个参数不是越大越好,顶满之后如果显存吃紧,反而会让测试结果变得不稳定。
./llama-bench -m models/7B/ggml-model-q4_0.gguf -ngl 10,20,30,35

