快速结论:在 llama.cpp 的 llama-server 中对 Qwen3.6 MTP 模型启用 draft-mtp 投机解码(--spec-type draft-mtp)时,即使固定 seed、temperature: 0,生成结果仍会与未启用投机解码的基线不同,报错特征为 Eval bug: draft-mtp changes deterministic output on Qwen3.6 MTP model。优先排查是否是 Q4_K_M 量化 / 特定 kernel 路径导致,而不是先怀疑参数配置错误。
适用环境:llama.cpp version 9216 (1ff0fc138),AppleClang 21.0.0.21000101 编译,macOS 26.5,arm64,Metal 后端,Apple M4 Pro;模型为 Qwen3.6-27B-Q4_K_M.gguf(general.architecture = qwen35,qwen35.nextn_predict_layers = 1)。
最快修复方案:暂无确认的一步修复方案。Issue 中的实测证据显示,改用 Q8_0 量化后不再复现该差异,因此可优先尝试切换到 Q8_0 模型。
注意事项:Q8_0 能消除差异是 Issue 中被验证过的观察,但这不等于 Q4_K_M 的问题已被修复;维护者指出不同 batch size 会使用不同 kernel,因此“投机解码必须与基线逐 token 完全一致”的预期本身可能并不成立。若你依赖 Q4_K_M,需自行验证是否可接受该差异。
问题场景
用户在 macOS(Apple M4 Pro,Metal 后端)上用 llama.cpp 的 llama-server 加载 Qwen3.6-27B Q4_K_M GGUF(来自 unsloth/Qwen3.6-27B-MTP-GGUF),并通过 --spec-type draft-mtp 启用投机解码(speculative decoding),同时设置 --spec-draft-n-max 为 1/2/3/4。请求体固定了 seed: 1234、temperature: 0、cache_prompt: false,期望确定性输出,但启用 draft-mtp 后提交的 token 流与不启用投机解码时不同。
报错原文
Eval bug: draft-mtp changes deterministic output on Qwen3.6 MTP model
no speculative decoding: output A
draft-mtp width 1: output B
draft-mtp width 2: output C
draft-mtp width 3: output C
draft-mtp width 4: output C
draft_n: 31
draft_n_accepted: 31
原因分析
可能原因:该差异与 Q4_K_M 量化相关的 kernel 路径有关,而并非单纯的 sampler 设置问题。Issue 讨论中,维护者指出不同 batch size 会走不同 kernel,因此启用投机解码时与基线走不同计算路径,其数值结果可能不同;当模型换成 Q8_0 时,报告者不再复现该 token 流差异。注意 Issue 处于 bug-unconfirmed 状态,根因未被最终确认,以上仅为讨论中给出的可能性方向。
环境排查
- 确认 llama.cpp 版本:Issue 使用 version 9216 (1ff0fc138);有用户报告在 release b9222 上复现模式发生变化,因此版本很关键。
- 确认操作系统与硬件:macOS 26.5、arm64、Apple M4 Pro。
- 确认 GPU 后端:Metal。
- 确认模型量化:Q4_K_M 复现,Q8_0 未复现。
- 确认模型元数据:general.architecture = qwen35,qwen35.nextn_predict_layers = 1。
- 确认启动参数:是否使用
--spec-type draft-mtp,以及--spec-draft-n-max/--spec-draft-n-min取值。 - 确认请求体:
seed、temperature、cache_prompt、stream、return_tokens等是否一致。
解决步骤
- 先复现基线:启动 llama-server,不加
--spec-type draft-mtp,用 Issue 中相同的 curl 请求体(固定seed: 1234、temperature: 0)记录返回的tokens数组。 - 启用投机解码:保持其余参数不变,加入
--spec-type draft-mtp,分别设置--spec-draft-n-max 1/2/3/4再请求,对比各宽度的tokens是否与基线一致。 - 若在 Q4_K_M 上复现差异,可优先尝试换用 Q8_0 权重(例如
-hf unsloth/Qwen3.6-27B-MTP-GGUF:Q8_0),重复上述对比。Issue 中报告者用 Q8_0 后各宽度(1–5)结果全部一致。 - 若必须使用 Q4_K_M 且依赖严格确定性输出,暂时避免启用 draft-mtp 投机解码,或接受投机解码下 token 流可能与基线不同。
- 若问题在新版本上表现不同,记录所用 release tag 与 llama.cpp version,便于对照。
验证方法
用相同 prompt、相同请求体分别请求“无投机解码”和“开启 draft-mtp”两种 llama-server 配置,比较返回 JSON 中的 tokens 数组是否逐元素一致。若切换到 Q8_0 后所有 --spec-draft-n-max 取值的 tokens 都与无投机解码基线一致,即符合 Issue 中报告的解决状态;若仍不一致,则应保留日志并按未确认 bug 处理。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug] Embedded chatbot drops numeric zero defaults and required number values](https://www.chat-gpts.plus/wp-content/uploads/2026/10/43242-e549e47a-768x403.jpg)

