先看现象。llama.cpp b3900 用 -ngl 99 加载 Qwen2.5-14B-Q4,日志显示 offloaded 41/49 layers,剩余层跑在 CPU,生成速度只有每秒 6 token,一度以为是量化质量差。

把日志和配置对完,能解释这个现象的基本就这几处。层数超过显存后会自动少卸载几层。也可能是-ngl 只是上限,不保证全部卸载。

还有一种情况,KV cache 与上下文也占显存。

另外,上下文设得越大,能卸载的层越少。

上来先在启动日志里看 offloaded 的实际层数

python -c "print(open('llama.log',encoding='utf-8').read().count('offloaded'))"

接着把上下文从 32k 降到 4k 再试

./llama-server -m qwen2.5-14b-q4.gguf -ngl 99 -c 4096 --port 8080

然后按日志逐步下调 ngl 找到刚好不溢出的值

./llama-server -m qwen2.5-14b-q4.gguf -ngl 36 -c 4096 --port 8080

剩下的就是用统一的 prompt 测两种配置的生成速度

python bench_gen.py --url http://localhost:8080 --n 20

白天有业务在跑,能验证的部分都压到了晚上做。

当时还开着另一个排查窗口,两边日志对照着看才定位到。

怎么算真的好了,看的是同一批现象。日志里 offloaded 与总层数一致,生成速度提升到每秒 20 token 以上,显存没有溢出。

ngl 给得越大不代表越快,先看日志确认实际卸载层数,把上下文降下来往往比调 ngl 更有效。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189