先看现象。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 更有效。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
