记一次成功的本地部署 LLM MTP 模型的过程
(一)前言
就在我刚才瞎折腾过后,发现llama.cpp已经官方支持MTP模型了(那个MTP的PR合并啦)。
不需要单独的draft模型。
(二)步骤
(2.1)llama.cpp
必须得再去🔗官方仓库下载一次最新的二进制。
它更像得太快了,自己编译得速度堪忧,还是下载即用更方便。
(2.2)模型
我用的是Qwen3.6-35B-A3B-UD-IQ2_M.gguf已经很激进了是吧,其实还有IQ1_M!!!
下载位置请看🔗这里。
(2.3)运行
我突然发现原来可以在运行时控制不要启用推理模式,这对于RAG简直是特大喜讯!
.\llama-server.exe ^
-m D:\AI\llama.cpp\models\Qwen3.6-35B-A3B-UD-IQ2_M_MTP.gguf ^
--gpu-layers all ^
--ctx-size 16384 ^
--threads 8 ^
-fa on ^
--spec-type draft-mtp --spec-draft-n-max 2 ^
--reasoning off ^
--host 127.0.0.1 ^
--port 8999
实际上就只加了两个参数:
有说每次猜2个token比较合适,所以我设置的2,后来发现3也行。
--spec-type draft-mtp
--spec-draft-n-max 2
(三)测试
(3.1)日志观察
因为关闭了推理,快到我以为用的是在线LLM……
============================================================
[2026-05-17 02:01:32.971] Question: 中兴HSS数据有哪些类型和格式?
[2026-05-17 02:01:32.982] [Service] Starting... <11ms>
[2026-05-17 02:01:33.363] [Service] Dict not hit <380ms>
[2026-05-17 02:01:34.501] [Rewrite] 意图是: 查询中兴HSS数据的类型和格式 (detailed) <1.14s>
[2026-05-17 02:01:34.501] [Rewrite] 关键词: 中兴HSS数据 类型 格式
[2026-05-17 02:01:34.594] [Cache] no cache hit <92ms>
[2026-05-17 02:01:34.663] [Retrieve] nodes: 30 → 28 <69ms>
[2026-05-17 02:01:38.049] [Rerank] nodes: 15, top score: 4.7967 <3.38s>
[2026-05-17 02:01:38.049] [Dynamic] nodes: 5
[2026-05-17 02:01:38.051] Answer starting, input prompt len: 4073
[2026-05-17 02:01:40.574] Streaming... <2.52s>
[2026-05-17 02:01:45.328] [Cache] Saved <4.75s>
[2026-05-17 02:01:45.329] Answer completed
[2026-05-17 02:01:45.329] ----------------
[2026-05-17 02:01:45.329] Query: 4686.29 ms, LLM: 7276.98 ms, Total: 12345.25 ms
[2026-05-17 02:01:45.331] Rewrite token in: 439, out:58, from: Qwen3.6-35B-A3B-IQ2-M-MTP
[2026-05-17 02:01:45.331] Answers token in: 2158, out:425, from: Qwen3.6-35B-A3B-IQ2-M-MTP estimate!!!
[2026-05-17 02:01:45.332] Total token usage: 3080
快到这个地步了,怎么知道MTP生效了没呢?
看llama.cpp的日志吧。
这是最后一次调用的日志。
对应大概Streaming... <2.52s>和[Cache] Saved <4.75s>的位置,就是正式开始回答问题的时长。
猜中率很高啊!
prompt eval time = 1943.85 ms / 2191 tokens ( 0.89 ms per token, 1127.14 tokens per second)
eval time = 4638.57 ms / 464 tokens ( 10.00 ms per token, 100.03 tokens per second)
total time = 6582.42 ms / 2655 tokens
draft acceptance rate = 0.88623 ( 296 accepted / 334 generated)
改成--spec-draft-n-max 3 之后,接受率会稍微下降,但也在0.7和0.9之间。
(3.2)表格对比
因为IQ2我显存不够,所以我这里用了IQ1,然后加MTP时依然轻微不够(模型文件是完全一样的)。
测试时先跑2次,保证没有奇怪的磁盘缓存一类的问题(但LLM会缓存)。
我没办法控制RAG的总输出Token,因为不靠我自己的缓存,让LLM每次回答都不太一样。
显存占用是指我自己程序跑的过程中,观察到的最高占用。
看到TTFT(输出首个token的响应时间)有点反常,可能仅MTP下有缓存?
| Qwen3.6-35B-A3B-IQ1M | rewrite time | TTFT | Stream time (秒) | Token out (token/秒) | Token in and out (个) | VRAM+共享 (GB) |
|---|---|---|---|---|---|---|
| MTP off | 1.31 | 1.51 | 4.51 | 48.89 | 1185 - 216 | 15.5 + 0.3 |
| MTP draft(3) | 1.03s | 0.91 | 3.13 | 113.90 | 1783 - 350 | 15.7 + 1.7 |
| - | - | - | - | - | - | - |
| deepseek-v4-flash (官方在线 ) | 2.75 | 3.38 | 1.94 | 198.96 | 1774 - 386 | 非本地 |
| deepseek-v4-flash (阿里在线 ) | 1.98 | 2.19 | 0.72 | 134.72 (估算) | 1781 - 97 (估算) | 非本地 |
也就是说MTP打开时,输出了更多内容却更快。
(四)结论
- 在显存足够的范围内,MTP有助于输出token的生成。但16GB依然在极限的边缘(还没开vision)。
- 对于RAG来说,模型推理真的不适合,但之前在代码里关不掉。关掉后直逼在线LLM速度。
- 对于RAG整体流程提升不大,但最后流式蹦字明显快,用户感受会比较好。
希望大家都能快乐地进行本地LLM的RAG!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)