在6GB显存笔记本上使用Qwen3.6-35B-A3B的MTP:不值得
摘要
在6GB显存笔记本上对llama.cpp中Qwen3.6-35B-A3B模型的多Token预测(MTP)支持进行的基准测试显示,MTP不值得使用,因为提示处理速度显著变慢,抵消了微小的生成速度提升。作者发现,对草稿KV缓存使用q4_0量化可以节省显存而不影响质量。
我有一台2021年的华硕游戏笔记本,去年花500欧元买的二手。我想看看llama.cpp最近合并的MTP支持在这样显存受限的设备上对Qwen3.6-35B-A3B模型是否值得使用。所以我做了一些实验,比较开启和不开启MTP时的性能。**TL;DR:不值得。MTP的提示处理速度慢得多,以至于超越了TG速度的微小提升。不过,我发现了一个有用的显存节省技巧:对草稿KV缓存使用q4_0量化效果与q8_0一样好,而且能节省少量显存。**
# 硬件
* 华硕ROG Zephyrus G14笔记本,2021款
* AMD Ryzen 7 5800HS 含Radeon显卡(8 CPU核 / 16线程)
* NVIDIA RTX 3060 Laptop GPU,6GB显存
* 24GB内存(DDR4 3200 MT/s),1TB固态硬盘
# 软件
* Linux Mint 22.2(基于Ubuntu 24.04),使用Cinnamon桌面运行在Radeon集成显卡上(这样3060只用于llama.cpp)
* llama.cpp版本:9198 (a6d6183db),从当前主分支构建,编译器GNU 13.3.0 for Linux x86_64
* CUDA 12.0,从Ubuntu仓库安装
# 测试配置
我对所有实验固定了以下参数:
* Unsloth Qwen3.6-35B-A3B-MTP-UD-Q4_K_XL模型(该系统能运行的极限;我在MTP和非MTP实验中使用了相同的模型,只是通过命令行参数调整,使得MTP部分在非MTP运行时不被使用)
* 主KV缓存使用q8_0量化(我不想在质量上妥协太多)
* 上下文大小65536(足以在例如Pi或Dirac上进行智能体编码,或运行Hermes Agent)
* 对于MTP,我使用了--spec-draft-n-max 2(我知道在有些情况下3可能略好,但决定坚持用2以使结果可比)
* 启用mmap(这是我能运行该模型而不会冻结机器的唯一方式……)
我变化了以下参数:
* MTP vs 非MTP(包含/省略MTP特定的CLI参数)
* ubatch大小:512、1024、1536、2048
* 草稿模型KV缓存量化:q8_0或q4_0(K和V始终相同)
* --fit-target设置为能正常运行无OOM错误的最小值(步长64)
以下是完整的llama-server命令示例(下表中的MTP 1):
build/bin/llama-server \
-m Qwen3.6-35B-A3B-MTP-UD-Q4_K_XL.gguf \
--threads 8 \
-ub 512 \
--parallel 1 \
--fit-target 448 \
-c 65536 \
-ctk q8_0 \
-ctv q8_0 \
-ctkd q8_0 \
-ctvd q8_0 \
--chat-template-kwargs '{"preserve_thinking": true}' \
--temp 0.6 \
--top-p 0.95 \
--min-p 0.0 \
--top-k 20 \
--repeat-penalty 1.0 \
--presence-penalty 0.0 \
--spec-type draft-mtp \
--spec-draft-n-max 2
我给了模型两个任务:
1. MB:运行[mtp-bench.py](https://gist.github.com/am17an/228edfb84ed082aa88e3865d6fa27090)脚本来在不同任务上基准测试MTP。
2. S:将一份较长的文档(MTP PR [22673](https://github.com/ggml-org/llama.cpp/pull/22673) from github)总结成几个要点。这是一个包含13448个token的提示,后面生成2000-3000个token。
# 结果
下表总结了结果。ub = ubatch大小,dKV = 草稿KV量化类型,fitt = fit-target值,acc% = 接受率。
|设置|ub|dKV|fitt|MB TG|MB acc%|S PP|S TG|S acc%|
|:-|:-|:-|:-|:-|:-|:-|:-|:-|
|No MTP 1|512|\-|0|25.0|\-|178|23.8|\-|
|No MTP 2|1024|\-|0|23.1|\-|292|22.5|\-|
|No MTP 3|1536|\-|0|24.5|\-|299|24.4|\-|
|No MTP 4|2048|\-|0|23.0|\-|**436**|**26.1**|\-|
|MTP 1|512|q8\_0|448|**27.3**|81.5|143|**26.1**|76.5|
|MTP 2|1024|q8\_0|960|18.7|82.7|138|25.9|72.0|
|MTP 3|512|q4\_0|448|26.4|81.5|139|25.3|73.4|
|MTP 4|1024|q4\_0|960|25.4|82.7|198|23.7|73.7|
我还尝试了更高的ubatch值,但结果太差(TG 10-15 tok/s,可能由于内存耗尽和交换),所以放弃了那些运行。
# 结论
* 基线"No MTP 4"(ubatch=2048)显然是不开启MTP的最佳设置。PP速度超过400 tok/s,TG速度23-26 tok/s。
* "MTP 1"运行(ubatch=512)在mtp-bench中达到了最佳TG速度(超过27 tok/s),但在摘要任务TG上与"No MTP 4"持平。PP速度远低于所有非MTP设置。
* 增加MTP的ubatch大小可以稍微提高PP速度,特别是在也使用了q4_0量化草稿KV缓存的"MTP 4"设置中。但这几乎消除了TG速度的优势,同时PP速度仍降低了一半以上。
* 简而言之:**在这种设置下MTP不值得。某些情况下TG略有提升,但PP速度总是大幅下降。** 如果以后llama.cpp改进了MTP的PP速度(这在PR中列为已知问题),情况可能会改变。
# 观察
* **我惊讶地发现,对草稿模型KV缓存使用q4_0量化对草稿模型准确率的影响微乎其微。** 这能节省少量显存,因此对于显存非常受限的系统可能是个有用的技巧。
* 测量值之间存在一些无法解释的变化,可能是由于随机变化、CPU/GPU温度降频等。不算太差,但也不能完全信以为真。
* 显存从一开始就显然非常紧张。MTP的显存开销很容易将系统推入性能不佳的状态。
* --fit和--fit-target选项似乎没有考虑MTP的开销;你需要为MTP预留一些内存,这个量主要取决于ubatch大小。因此,如果你想从有限的显存中榨出最大性能,就必须手动设置--fit-target。在我的例子中,将fit-target设置为略小于ubatch大小的数值似乎可行,但你的情况可能会有所不同。
# 备注
本文由100%有机成分构成。制作过程中没有AI受到伤害。这是我的第二篇帖子。很乐意回答任何问题。
相似文章
在 Qwen3.6 - RTX 5090 上测试 llama.cpp 的 MTP 支持
在 RTX 5090 上使用 Qwen3.6 模型对 llama.cpp 的新多标记预测(MTP)支持进行技术测试,比较不同提示和 GGUF 量化下开启和关闭 MTP 的性能表现。
我在 vLLM 和 llama.cpp 上对 Gemma 4 和 Qwen 3.6 测试了 MTP —— 推理速度提升 3.34 倍,这是我的发现(RTX 6000 PRO)。
使用 vLLM 和 llama.cpp 对 Gemma 4 31B 和 Qwen 3.6 27B 进行的多令牌预测(MTP)基准测试显示,推理速度最高提升 3.34 倍,最优推测令牌数量因模型和引擎而异。
@Snixtp: https://x.com/Snixtp/status/2055734339346768225
某用户使用llama.cpp在单张RTX 3090上对Qwen3.6 27B的MTP变体与普通版本进行了基准测试,发现MTP在长上下文(32k-64k)下生成速度最高可提升2.37倍,但预填充较慢且暂不支持并发。
在 12GB 显存下,使用 Qwen3.6 35B A3B 与 llama.cpp MTP 实现 80 tok/sec 的速度和 128K 上下文
一名用户分享了一份配置方案,该方案在使用 llama.cpp 和多令牌预测(MTP)的情况下,能在 12GB 显存的 GPU 上让 Qwen3.6 35B A3B 模型实现超过每秒 80 个令牌的生成速度。帖子中包含了基准测试结果以及用于优化性能的具体命令行参数。
RTX 5080 16GB:Qwen3.6 35B MoE 在 128k 上下文下的表现——56 tok/s,以及 MTP 为何无济于事
Qwen3.6 35B MoE 在 RTX 5080 16GB 上的详细基准测试表明,MTP(多令牌预测)由于显存限制,在 128k 上下文中无法提升推理速度;最佳配置为不带 MTP 的 Q4_K_XL,在 128k 上下文下生成速度约 56 tok/s。