(一)前言

就在我刚才瞎折腾过后,发现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: 3028  <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打开时,输出了更多内容却更快。

(四)结论

  1. 在显存足够的范围内,MTP有助于输出token的生成。但16GB依然在极限的边缘(还没开vision)。
  2. 对于RAG来说,模型推理真的不适合,但之前在代码里关不掉。关掉后直逼在线LLM速度。
  3. 对于RAG整体流程提升不大,但最后流式蹦字明显快,用户感受会比较好。

希望大家都能快乐地进行本地LLM的RAG!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐