Gemma 4 MTP 实测调参:用 assistant 草稿模型冲 120 tokens/s

整理 Gemma 4 使用 assistant-MTP 草稿模型进行投机解码的命令行示例:如何用 llama-cli 挂载 draft 模型、理解 -md、--draft-max、-ngl 等参数,以及为什么 120 tokens/s 只能作为特定硬件下的调参目标。

如果主模型、assistant 草稿模型和推理框架都配对正确,MTP 可以让 Gemma 4 在本地显卡上明显提速。一些 12GB 显存的显卡,例如 RTX 4070,在合适量化和参数下,有机会看到接近 120 tokens/s 的生成速度。

但这不是一个“复制命令就必然得到”的数字。它更适合作为调参目标:跑得起来、显存够、草稿命中率高、采样参数稳定,速度才会漂亮。

MTP 在这里做什么

MTPMulti-Token Prediction,也就是多 Token 预测。

普通自回归模型一次生成一个 token。assistant-MTP 则先替主模型草拟未来几个 token,再由主模型并行验证。如果草稿猜对,主模型就能一次接受多个 token,减少逐 token 等待。

这套机制常叫:

  • Speculative Decoding
  • 投机解码
  • 草稿模型加速
  • draft model / drafter

它的目标是加速,不是提升模型能力。最后是否接受某个 token,仍然由主模型决定。

命令行示例

下面是一个偏进阶的 llama-cli 参考命令:

1
2
3
4
5
6
./llama-cli \
  -m gemma-4-12b-it-qat-GGUF.gguf \
  --draft-max 2 \
  -md gemma-4-12b-it-qat-assistant-MTP-Q8_0-GGUF.gguf \
  -ngl 99 \
  -p "<|think|>\n写一篇关于量子计算的短文。"

这条命令的意思是:

  • gemma-4-12b-it-qat-GGUF.gguf 作为主模型。
  • gemma-4-12b-it-qat-assistant-MTP-Q8_0-GGUF.gguf 作为草稿模型。
  • 每轮最多让草稿模型预测 2 个 token。
  • 尽量把模型层卸载到 GPU。
  • 直接传入一个 prompt 测试生成速度。

注意:不同 llama.cpp 版本的参数名可能不同。有的版本用 -md,有的版本更推荐 --model-draft;有的版本用 --draft-max,有的版本用 --spec-draft-n-max。实测前先看:

1
./llama-cli --help

或者:

1
./llama-server --help

参数解释

-m

1
-m gemma-4-12b-it-qat-GGUF.gguf

这是主模型。最终输出由它验证和决定。

assistant-MTP 必须和主模型匹配。不要随便拿一个 assistant 模型去配另一个尺寸或版本的主模型,否则轻则没有速度收益,重则直接加载失败或输出异常。

-md

1
-md gemma-4-12b-it-qat-assistant-MTP-Q8_0-GGUF.gguf

-md 用来挂载 draft model,也就是 assistant-MTP 草稿模型。

可以把它理解成“预测候选答案的小助手”。它先猜接下来几个 token,主模型再决定是否接受。

如果你的 llama.cpp 版本不认识 -md,试试:

1
--model-draft gemma-4-12b-it-qat-assistant-MTP-Q8_0-GGUF.gguf

--draft-max

1
--draft-max 2

它控制草稿模型一次最多预测多少 token。

建议从 2 开始,而不是一上来拉很大。草稿 token 越多,不代表越快;如果猜错率上升,主模型会频繁拒绝,反而浪费计算。

可以这样试:

1
--draft-max 1
1
--draft-max 2
1
--draft-max 4

观察 tokens/s 和输出质量,再决定保留哪个值。

-ngl 99

1
-ngl 99

这个参数表示尽量把模型层卸载到 GPU。对 12GB 显存来说,如果模型量化足够小,可能可以把大部分甚至全部层放进显卡。

但 8GB 显存通常不要照抄。因为 MTP 会多加载一个 assistant 模型,显存压力比只跑主模型更高。

如果 OOM,可以按这个顺序降:

1
-ngl 80
1
-ngl 60
1
-ngl 40

真正稳定的值要看模型量化、上下文长度、显卡剩余显存和系统桌面占用。

-p

1
-p "<|think|>\n写一篇关于量子计算的短文。"

-p 是直接传入 prompt。

这里的 <|think|> 是否需要,取决于当前 GGUF 模型的聊天模板和模型说明。它不是所有 Gemma 4 模型的通用开关。为了做速度测试,可以先用更简单的 prompt:

1
-p "写一篇关于量子计算的短文。"

先确认 MTP 本身能跑,再讨论模板和特殊 token。

更稳的测试命令

第一次测试建议把参数写保守一点:

1
2
3
4
5
6
7
8
9
./llama-cli \
  -m gemma-4-12b-it-qat-GGUF.gguf \
  -md gemma-4-12b-it-qat-assistant-MTP-Q8_0-GGUF.gguf \
  --draft-max 2 \
  -ngl 60 \
  -c 8192 \
  -n 512 \
  --temp 0.7 \
  -p "用三段话解释量子计算。"

如果能稳定跑,再逐步提高 -ngl

1
-ngl 80

再试:

1
-ngl 99

不要第一次就把 -ngl 拉满。MTP 多了一个 draft 模型,显存余量比普通运行更重要。

为什么 120 tokens/s 不一定复现

120 tokens/s 很诱人,但它依赖很多条件。

影响因素 说明
显卡 RTX 4070 这类 12GB 显卡比 8GB 显卡更容易跑高 -ngl
量化 QAT / Q4 / Q8 draft 模型组合会影响显存和速度
draft 命中率 草稿猜得越准,主模型一次接受的 token 越多
prompt 类型 结构化文本、代码、固定格式通常更容易加速
temperature 越随机,草稿越难猜中
上下文长度 上下文越长,KV cache 压力越大
llama.cpp 版本 MTP 支持仍在演进,参数和性能可能变化

因此,文章里更建议把它当成“可以冲的速度目标”,而不是承诺值。

适合用来测速的 prompt

MTP 最容易在结构化、低随机性的输出里体现价值。测速时别只让模型自由写散文,可以多试这些:

1
写一个 Python 函数,把 Markdown 表格转换成 CSV,只输出代码。
1
2
修复下面 JSON,只输出合法 JSON:
{"name":"demo","items":[{"id":1,"tags":["a","b",],},]}
1
用固定格式输出 10 条 Linux 故障排查步骤,每条包含:问题、命令、判断标准。

如果这些任务的 tokens/s 明显提升,并且输出结构没有变差,说明 assistant-MTP 在你的机器上是有价值的。

常见问题

加了 -md 反而 OOM

正常。assistant-MTP 也要占显存或内存。

先降:

1
-ngl 60

再降上下文:

1
-c 4096

如果还不稳,就换更小量化,或者先不用 MTP。

参数不识别

说明 llama.cpp 版本和文章里的命令不一致。先看帮助:

1
./llama-cli --help

重点搜索:

1
draft
1
spec

如果当前版本没有 MTP / draft 支持,需要更新 llama.cpp。

输出变奇怪

先去掉 <|think|>,用普通 prompt 测试。再把 temperature 降低:

1
--temp 0.4

然后把 draft 数量降到:

1
--draft-max 1

如果这样恢复正常,说明之前的模板、采样或 draft 参数太激进。

小结

Gemma 4 assistant-MTP 的高速度玩法,本质是主模型加草稿模型的投机解码。-md 挂载草稿模型,--draft-max 控制一次草拟多少 token,-ngl 决定 GPU 卸载程度。

12GB 显存机器可以尝试冲更高速度,120 tokens/s 可以作为调参目标;8GB 显存机器则要更保守,因为 draft 模型会额外占资源。

最稳的做法是先跑通,再加速:先低 -ngl、短上下文、低 draft 数量,确认稳定后再逐步提高。

记录并分享
使用 Hugo 构建
主题 StackJimmy 设计