llama-bench 实测:扫 4 个参数,定位本地 LLM 基准测试的性能瓶颈
llama-bench 实测:扫 4 个参数,定位本地 LLM 基准测试的性能瓶颈
【免费下载链接】llama.cppLLM inference in C/C++项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp
同事同一张卡、同一个模型跑出了你的两倍速度,问题多半不在硬件,而在参数。llama-bench 是 llama.cpp 官方的性能测试工具,专门做本地 LLM 基准测试:它把每次推理拆成 PP(prompt processing,提示词处理速度)和 TG(text generation,文本生成速度)两个指标,反复跑多轮取均值,让你用同一把尺子比较量化方案、GPU 层分配和线程数。
矩阵乘法是 LLM 推理的性能核心,也是所有参数调优最终要撬动的东西。
第一次部署:先跑一条默认命令拿到基线
工具在仓库tools/llama-bench/目录下,编译后就在 build 目录里:
git clone https://gitcode.com/GitHub_Trending/ll/llama.cpp cd llama.cpp cmake -B build cmake --build build --config Release -j --target llama-bench然后直接跑:
./build/bin/llama-bench -m models/qwen2.5-7b-q4_k_m.gguf默认测试是 512 token 提示词 + 128 token 生成,每个配置重复 5 次取均值,输出带标准差:
| model | size | backend | ngl | test | t/s |
|---|---|---|---|---|---|
| qwen2 7B Q4_K - Medium | 4.36 GiB | CUDA | -1 | pp512 | 7285.68±100.06 |
| qwen2 7B Q4_K - Medium | 4.36 GiB | CUDA | -1 | tg128 | 119.92±0.43 |
看 tg128 这列就行,那是对话体感的直接反映。标准差大说明机器在飘,先关后台程序再测。注意这个数值不含分词和采样耗时,衡量的是纯推理速度。
生成速度上不去:先查 -ngl,再对比量化版本
扫 -ngl:层数没卸完,速度就卡在 CPU 上
-ngl指定卸载到 GPU 的层数,默认 -1 是全卸。想确认当前分配合不合理,一条命令扫:
./build/bin/llama-bench -m models/qwen2.5-7b-q4_k_m.gguf -ngl 10,20,30,35| ngl | pp512 | tg128 |
|---|---|---|
| 10 | 373.36 | 13.45 |
| 20 | 472.65 | 21.36 |
| 30 | 631.87 | 40.04 |
| 35 | 2400.01 | 131.66 |
注意最后两档:34→35 层时 tg 从 71.76 跳到 131.66。数没你想的那么线性——7B 模型 Q4 量化后约 4.7 GiB,加上 KV cache,8G 显存装得下,全量卸载才解锁 GPU 的真实算力。中间档速度上不去,说明瓶颈还在 CPU 上那一截层。
Q4_K_M 对 Q8_0:两个量化版本谁更值得部署
-m可以传多个文件,一次测完:
./build/bin/llama-bench -m models/qwen2.5-7b-q4_k_m.gguf \ -m models/qwen2.5-7b-q8_0.gguf -p 0 -n 128| model | size | tg128 |
|---|---|---|
| qwen2 7B Q4_K - Medium | 4.36 GiB | 131.42±0.59 |
| qwen2 7B Q8_0 | 8.32 GiB | 87.20±0.31 |
Q8_0 慢约 34%,体积是 2.4 倍,换来的精度提升值不值,取决于你的场景——这是 GGUF 量化性能对比要回答的问题。显存紧张就留 Q4_K_M,追求质量就 Q8_0,拿数据说话。
一条命令扫完整参数矩阵
参数支持逗号分隔多值、区间first-last,以及first-last+step(步长)和first-last*mult(倍数)两种区间写法。多个参数同时给多值时,llama-bench 会跑完所有组合:
./build/bin/llama-bench -m models/qwen2.5-7b-q4_k_m.gguf \ -ngl 8-24+8 -b 128,256,512,1024 -p 1024 -n 04 个层数 × 4 个 batch,16 行结果一次出完,比手动一个个试快得多。重复次数用-r控制,默认 5 次;结果飘的时候把它调到 10,同时检查机器温度。
长上下文:-b 和 -t 各管一头
场景换成 RAG 或长文总结,卡点变成提示词处理速度。关掉生成、只测 PP:
./build/bin/llama-bench -m models/qwen2.5-7b-q4_k_m.gguf -n 0 -p 1024 -b 128,256,512,1024| n_batch | pp1024 |
|---|---|
| 128 | 1436.51±3.66 |
| 512 | 2254.45±15.59 |
| 1024 | 2498.61±13.58 |
1024 相对 128 提升约 74%;再往上报显存不足就降档,小一档的值照样能当参照。
纯 CPU 推理时,线程数用-t扫:
./build/bin/llama-bench -m models/qwen2.5-7b-q4_k_m.gguf -n 0 -n 16 -p 64 -t 4,8,16,32| threads | pp64 | tg16 |
|---|---|---|
| 4 | 23.18±0.06 | 12.22±0.07 |
| 8 | 32.29±1.21 | 16.71±0.66 |
| 16 | 33.52±0.03 | 15.32±0.05 |
| 32 | 59.00±1.11 | 16.41±0.79 |
别急着往上加线程:8 到 16 时 tg 不升反降,内存带宽争用的典型信号。最优值通常贴着物理核数,超线程数翻倍往上加多半白搭。
把基线存下来:四种输出格式一张表收完
-o切换输出格式:
| 格式 | 命令 | 用途 |
|---|---|---|
| md | -o md(默认) | 直接贴进文档、PR 描述 |
| csv | -o csv | 喂给 Excel 做透视表 |
| json | -o json | 含samples_ts每次重复的原始数据和完整硬件配置,方便程序化分析 |
| sql | -o sql | 直接导入 SQLite 长期追踪 |
./build/bin/llama-bench -o json -m models/qwen2.5-7b-q4_k_m.gguf > baseline.json ./build/bin/llama-bench -o sql -m models/qwen2.5-7b-q4_k_m.gguf | sqlite3 bench.db之后每次代码或驱动更新后重跑,sqlite3 bench.db "select test_time, avg_ts from llama_bench"一条查询就能看出回退发生在哪次提交。
把基线 JSON 存进仓库,每次 merge 前跑一次再入库,llama.cpp 的性能迭代就不会悄无声息地漏掉。
【免费下载链接】llama.cppLLM inference in C/C++项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
