Eval bug: GLM-5.3-Flash + mmproj + –spec-type draft-mtp: every image request fails with “failed to process speculative batch” (Vulkan), no

在 GLM-5.3-Flash + mmproj 的多模态推理场景下启用 --spec-type draft-mtp (GLM5Next MTP 投机解码)时,所有带图片的请求都会返回 HTTP 500,日志报出 “failed to process speculative batch”,原因是投机

快速结论:在 GLM-5.3-Flash + mmproj 的多模态推理场景下启用 --spec-type draft-mtp(GLM5Next MTP 投机解码)时,所有带图片的请求都会返回 HTTP 500,日志报出 “failed to process speculative batch”,原因是投机批次未正确处理图像 token 的位置。优先排查 llama.cpp 构建版本,并确认是否已包含修复投机解码对 mtmd 输入处理的补丁。

适用环境:llama.cpp 0.6.0-dev(build 11505,commit ff5888f99,预编译包 llama-b11505-bin-ubuntu-vulkan-x64);Linux Ubuntu 26.04.1(kernel 7.0.0-38-generic);Vulkan 后端(RADV,Mesa 26.2.4);AMD Ryzen AI MAX+ 395 / Radeon 8060S(Strix Halo,gfx1151),128 GB 统一内存;模型为 unsloth/GLM-5.3-Flash-GGUF UD-IQ2_XXS(含 blk.45.nextn.* MTP 张量)+ 同仓库 mmproj-F16.gguf。

最快修复方案:升级到包含 PR #30257(“spec: properly handle mtmd input for mtp”,2026-10-10 合并,首次出现于 b11548)的构建版本;报告者在 b11721(ff5a23376)上复测确认修复。若暂无法升级,可先以不带 --spec-type draft-mtp 的方式启动服务,让图片请求恢复正常,代价是全部文本流量失去投机解码加速。

注意事项:请求级关闭投机的字段("speculative.n_max": 0,无论平铺还是嵌套为 "speculative": {"n_max": 0})在该构建中被忽略,无法作为按请求的临时规避手段。修复后图像请求仍会进行投机解码,报告者测得草稿 token 被接受(例如 33/60、73/102),文本吞吐与 b11505 基本持平。以上结果来自 GLM-5.3-Flash + Vulkan 单一环境验证,其他模型或后端组合尚未确认。

问题场景

用户以 llama-server 加载 GLM-5.3-Flash-GGUF(UD-IQ2_XXS,4 个分片)与对应的 mmproj-F16.gguf,在 Vulkan 后端下启用 --spec-type draft-mtp --spec-draft-n-max 3 进行投机解码。纯文本请求正常返回 200,且 timings.draft_n > 0,说明投机解码已生效;但只要 /v1/chat/completions 请求中包含 image_url 图片部分(任意 JPEG 即可复现),服务端即返回 HTTP 500。服务进程本身不会崩溃,仅该 slot 被取消,后续文本请求仍可正常处理。

报错原文

E init: the tokens of sequence 3 in the input batch have inconsistent sequence positions:
 - the last position stored in the memory module of the context (i.e. the KV cache) for sequence 3 is X = 17
 - the tokens for sequence 3 in the input batch have a starting position of Y = 942
 it is required that the sequence positions remain consecutive: Y = X + 1
E srv        decode: failed to process speculative batch
E srv  update_slots: decode() failed: failed to process speculative batch

原因分析

核心问题是投机批次(speculative batch)没有为图像 token 正确预留位置:输入批次中序列的起始位置与 KV cache 中记录的最后位置不连续(Y ≠ X + 1),位置校验失败后整个投机批次处理中止,请求以 500 结束。这与 PR #29928 中作者提到的图像请求中止现象一致,机制上类似 #25129 / #25144 中讨论的“位置缺口”,本次在 GLM-5.3-Flash + Vulkan 上复现。

评论中提到的 a748c27057(“support vision input for mtp”,2026-09-12)曾尝试重做 llama-batch / common/speculative.cpp,使草稿批次考虑图像 token 位置;但该提交仅存在于分支上、无对应 PR,且早于 #29385 的 batch_ext 迁移,无法直接合入。最终由 PR #30257 修复。另需注意,该构建不支持请求级关闭投机解码,因此客户端无法逐请求规避。

环境排查

  • 确认 llama.cpp 构建版本:llama-server --version 输出中的 build 号与 commit;低于 b11548 的构建不含 #30257 修复。
  • 确认是否加载了 mmproj(--mmproj mmproj-F16.gguf),问题仅在多模态输入出现。
  • 确认启动参数包含 --spec-type draft-mtp;去掉该参数后图片请求是否恢复正常,可作为对照验证。
  • 确认后端与驱动:Issue 环境为 Vulkan(RADV,Mesa 26.2.4),GPU 为 gfx1151;其他后端是否受影响在 Issue 中未验证。
  • 确认模型文件是否含 blk.45.nextn.* MTP 张量(UD-IQ2_XXS 4 分片),非 MTP 版模型无法验证此路径。

解决步骤

  1. 运行 llama-server --version 记录当前 build 号;若低于 b11548,说明缺少 PR #30257 修复。
  2. 升级到包含 #30257 的构建版本(首次出现于 b11548;报告者验证版本为 b11721,commit ff5a23376),可通过官方预编译包或自行从 master 构建。
  3. 使用原报告中的参数启动服务(-m GLM-5.3-Flash-UD-IQ2_XXS-00001-of-00004.gguf --mmproj mmproj-F16.gguf -ngl 99 -fa on --jinja -c 131072 -b 4096 -ub 1024 --spec-type draft-mtp --spec-draft-n-max 3,主机与端口按实际调整),保持 draft-mtp 开启。
  4. 若暂时无法升级,可先移除 --spec-type draft-mtp 启动服务作为临时规避;不要依赖 "speculative.n_max": 0 请求字段,该构建会忽略它。
  5. 升级后分别测试纯文本请求和带图片请求,确认文本投机解码仍生效、图片请求不再报错。

验证方法

向 /v1/chat/completions 发送单张图片、一条消息内两张图片,以及图片后的多轮追问,均应返回 200,日志中不再出现 inconsistent sequence positions 或 failed to process speculative batch。同时确认图像请求中投机解码仍处于工作状态(响应 timings 中可见草稿 token 接受,如 33/60、73/102),并对比文本吞吐与升级前基本一致(报告者测得代码约 32–33 tok/s、散文约 22–24 tok/s)。

参考来源

ggml-org/llama.cpp #30204

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29398

发表回复

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