Eval bug: Corrupted output when mixing draft-mtp and ngram-mod

该报错出现在 llama-server 同时启用 --spec-type draft-mtp,ngram-mod 进行投机解码时,模型输出大段逐字代码会在 token 回滚后出现重复或缺失的代码块。优先排查两路 draft 混用与 CUDA 构建的配合问题,而不是模型文件本身。

快速结论:该报错出现在 llama-server 同时启用 --spec-type draft-mtp,ngram-mod 进行投机解码时,模型输出大段逐字代码会在 token 回滚后出现重复或缺失的代码块。优先排查两路 draft 混用与 CUDA 构建的配合问题,而不是模型文件本身。

适用环境:llama.cpp Windows CUDA 13.4 x64 预编译包(llama-b11632-bin-win-cuda-13.4-x64,llama-server),CUDA backend,RTX 3090,测试模型 Qwen3.8-27B-Q4_K_S.gguf。另有报告者在 RTX 5080 + Qwen3.5-4B Q8_0 上复现;Python、PyTorch 版本 Issue 未提供。

最快修复方案:暂无确认的一步修复方案。可优先尝试改用 b11630 及更早的可用构建,或不要同时启用 draft-mtp,ngram-mod:单独使用 draft-mtp 或 ngram-mod 均正常。

注意事项:Issue 被标记为 bug-unconfirmed,且已于 2026-10-29 关闭;报告者提到有服务端修复并将提交 PR,但正文未给出已验证的修复版本或提交号,不能据此认定某个构建已修复。-ub 32 只是复现者个人的规避手段,会使 prompt processing 约慢 3 倍,且不是确认的解决方案。

问题场景

在 Windows 上运行 llama-server(CUDA 版本),加载 Qwen3.8-27B-Q4_K_S.gguf,并使用 --spec-type draft-mtp,ngram-mod 同时启用 MTP draft 与 ngram-mod 投机解码。当要求模型逐字输出一大段代码(例如粘贴脚本后要求“给出包含修复的完整代码”)时,输出中出现代码块的重复或缺失。该问题仅在两路投机方式混用时出现,单独使用 draft-mtp 或 ngram-mod 均符合预期。

报错原文

Eval bug: Corrupted output when mixing draft-mtp and ngram-mod
The corruption is only reproducible with --spec-type draft-mtp,ngram-mod. Individually draft-mtp and ngram-mod work as expected.
The first affected build is llama-b11632-bin-win-cuda-13.4-x64, still unfixed in b11881.
b11630 is the last build that works as intended.

原因分析

根据复现者的分析,b11632 对应 #29353 的合并(引入 CUDA GDN chunked kernel)。输出损坏发生在服务端通过 recurrent snapshots 回滚 ngram-mod 的 64-token draft 中 1–3 个被拒绝的 token 之后。#29353 之后,CUDA kernel 对 64+ token 的批次只写入最终状态(ggml.h 在 n_tokens > K 时允许这样做),因此回滚时恢复的是一个从未被写入的状态,导致输出错乱。这属于可能原因层面的分析,Issue 本身未给出官方确认结论;根本修复以报告者后续 PR 为准。

环境排查

  • 确认 llama.cpp 构建版本号:b11630 为最后正常版本,b11632 起出现异常,b11881 仍复现。
  • 确认启动参数是否包含 --spec-type draft-mtp,ngram-mod;可分别改成只用 draft-mtp 或只用 ngram-mod 做对照。
  • 确认 GGML backend 是否为 CUDA,以及 CUDA 版本是否为 13.4 x64 预编译包(原报告环境)。
  • 确认显卡型号(RTX 3090 / RTX 5080)与模型量化版本,便于排除模型差异。
  • 建议留意 server 回滚 ngram-mod draft 时是否出现 token 被拒绝(rejected)后紧接输出异常。

解决步骤

  1. 先记录当前构建版本与完整启动命令,确认确实使用了 --spec-type draft-mtp,ngram-mod。
  2. 临时规避:回退到 b11630(Issue 报告者确认的最后一个正常构建),或升级到包含后续服务端修复的构建(修复 PR 未在本 Issue 中给出,需自行核对发布说明)。
  3. 若不回退版本,将 --spec-type 改为单一取值(draft-mtp 或 ngram-mod),避免两路混用触发回滚路径。
  4. 可选验证:在复现环境中设置 -ub 32 观察是否不再出现损坏;该方法由复现者提出,代价是 prompt processing 约慢 3 倍,不宜作为长期方案。
  5. 若以上均无效,保留启动日志与可复现的最小代码提示,提交到上游 Issue 或在原 Issue 中补充信息。

验证方法

用同一模型和同一段“逐字输出大段代码”的提示重复测试:回退到 b11630 后输出应完整无重复、无缺失;单独使用 draft-mtp 或 ngram-mod 时同样应一致。若在启用混用的情况下仍出现重复或缺失代码块,则问题未解决。可同时对比多次生成结果的哈希或逐行 diff,确认代码块未被重复或截断。

参考来源

ggml-org/llama.cpp #31160

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30946

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注