这个坑值得记一笔。用 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 慢,必须实测每一档。这类问题最好一次改到位,反复小改反而容易把原因搅混。
