这个坑值得记一笔。用 llama.cpp b3720 跑 Qwen3-30B-A3B 的 Q4 量化,显卡 12GB,加了 --n-cpu-moe 24 把部分专家放 CPU,结果生成速度从每秒 18 token 掉到 4 token。

刚开始盯着「内存带宽成为瓶颈」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。专家层频繁在 CPU 与 GPU 之间搬运;n-cpu-moe 给多了 主干也被拖慢;线程数与物理核不匹配。

动手时先记录当前速度作为基线

llama-cli -m qwen3-30b-a3b-q4.gguf -p '你好' -n 64 --n-cpu-moe 24

从 8 层开始逐档试

llama-cli -m qwen3-30b-a3b-q4.gguf -p '你好' -n 64 --n-cpu-moe 8

然后把线程数固定到物理核

llama-cli -m qwen3-30b-a3b-q4.gguf -p '你好' -n 64 -t 8

等前面都确认过,再观察搬运期间的显卡利用率

nvidia-smi dmon -s u -c 20

这台环境是别人交接的,不少默认值被动过,只能一项项核。

同事提醒我看一下最近一次发布,时间点确实对得上。

别只看报错消失,验证要多做一步。找到一个速度高于基线的层数,显存不溢出,生成同样的 64 token 耗时明显下降。

专家放 CPU 只在显存差一点点时有意义,搬得太多反而比全放 GPU 慢,必须实测每一档。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189