快速结论:在 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 版模型无法验证此路径。
解决步骤
- 运行
llama-server --version记录当前 build 号;若低于 b11548,说明缺少 PR #30257 修复。 - 升级到包含 #30257 的构建版本(首次出现于 b11548;报告者验证版本为 b11721,commit ff5a23376),可通过官方预编译包或自行从 master 构建。
- 使用原报告中的参数启动服务(
-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开启。 - 若暂时无法升级,可先移除
--spec-type draft-mtp启动服务作为临时规避;不要依赖"speculative.n_max": 0请求字段,该构建会忽略它。 - 升级后分别测试纯文本请求和带图片请求,确认文本投机解码仍生效、图片请求不再报错。
验证方法
向 /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)。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Bug]: Text PEFT LoRAs can silently no-op for wrapper models whose LM is mounted under language_model](https://www.chat-gpts.plus/wp-content/uploads/2026/10/48019-e47a4f68-768x403.jpg)