快速结论:该问题出现在 vLLM 的 V1 模型执行路径(MRV1,即 Model Runner V1)上,当“thinking budget”(思考预算)与投机解码(speculative decoding)同时启用,且 reasoning_end_str 对应多个 token 时,预算状态机在单步内只能强制一个位置,导致 reasoning_end_str 被写坏。优先排查你的配置是否走的是 MRV1、reasoning_end_str 是否为多 token,以及是否同时启用了投机解码。
适用环境:Issue 中确认的环境为 Ubuntu 24.04.4 LTS(aarch64)、Python 3.12.14、PyTorch 2.13.0+cu130、NVIDIA GB10(驱动 580.173.02)。代码定位基于 vLLM 提交 9f07d023d;问题在基线 8a2364605c0b 上仍可复现(对应文件 thinking_budget_state.py 自 c94cdd0ae038 起未变化)。
最快修复方案:暂无确认的一步修复方案(Issue 最终未合入 V1 修复,相关改动被收窄到 MRV2)。按讨论中已验证的方向,可将配置切换到 MRV2 以绕开 V1 路径;但注意下述路由限制。
注意事项:若改用 ngram、ngram_gpu、draft_model、suffix、medusa、mlp_speculator、custom_class 这些投机方法,仍会被 _get_v2_model_runner_unsupported_features 路由回 MRV1,此时无法自动规避;EAGLE 并行草稿、mamba_cache_mode='all'、以及 ROCm 上的 DeepSeek-V3.2 / DeepSeek-V4 / GLM-MoE-DSA 也存在回退到 V1 的路由。强制 VLLM_USE_V2_MODEL_RUNNER=0 会主动回到有问题的 V1 路径。
问题场景
在 vLLM 中启用 V1 模型执行器(MRV1),同时开启投机解码与 thinking budget(思考预算),并配置一个会映射为多个 token 的 reasoning_end_str(例如 docs/features/reasoning_outputs.md 中描述的过渡短语)。此时生成过程在单步中需要跨多个位置匹配并截断该结束串,问题即被触发。
报错原文
[Bug]: V1 thinking budget corrupts a multi-token reasoning_end_str under speculative decoding
该 Issue 主要描述的是生成结果被写坏(corrupt),而非抛出某条具体异常堆栈;评论区未给出错误日志原文。
原因分析
核心原因(讨论中已从源码层面确认):在 vllm/v1/sample/thinking_budget_state.py(提交 9f07d023d)的 582 行中,全部 16 处 force_index 赋值要么是空列表,要么是单元素列表,例如 [0]、[remaining_budget]、[spec_len]、[i]。也就是说,该文件没有任何分支能在一个解码步内强制多个位置。因此,当 reasoning_end_str 跨多个 token、而投机解码一次产生多个位置时,步内只处理一个位置,导致结束串匹配不完整,输出被破坏。
另有一处“是否在草稿 token 而非已接受 token 上推进”的推断,讨论者明确表示未做追踪验证,可视为未证实。
环境排查
- 确认 vLLM 版本/提交:问题在
8a2364605c0b仍存在,thinking_budget_state.py自c94cdd0ae038后未变化。 - 确认实际走的是 MRV1 还是 MRV2:检查是否设置
VLLM_USE_V2_MODEL_RUNNER=0,以及所用投机方法是否落在 V2 不支持列表中。 - 确认投机解码相关配置:
ngram、ngram_gpu、draft_model、suffix、medusa、mlp_speculator、custom_class会回退到 MRV1;EAGLE 并行草稿同理。 - 确认
reasoning_end_str是否对应多个 token(如过渡短语),这是触发条件。 - Issue 环境:Python 3.12.14、PyTorch 2.13.0+cu130、NVIDIA GB10、驱动 580.173.02、Ubuntu 24.04.4 aarch64。
解决步骤
- 先判断你的配置是否真的无法离开 V1:如果使用的是 V2 不支持的投机方法(
ngram、draft_model、medusa、mlp_speculator、suffix、custom_class等),或者属于 EAGLE 并行草稿、mamba_cache_mode='all'、ROCm 上的 DeepSeek-V3.2 / V4 / GLM-MoE-DSA 等回退场景,则当前没有可用的官方修复。 - 如果你的配置不在上述回退列表中,且未设置
VLLM_USE_V2_MODEL_RUNNER=0,说明默认已走 MRV2,应能避开该问题(讨论中在 GB10 上直接以 3-token 结束串 + 3 位置 spec window 验证 V2 强制结果为正确的完整序列)。 - 可优先尝试:确认配置走 MRV2 后重跑原负载,观察
reasoning_end_str是否被完整、正确地截断。 - 不要寄希望于合并
#52677修复 V1:该 PR 已按 MRV2 方向收窄为仅 V2,V1 修复已从中移除。
验证方法
在 MRV2 路径下,以多 token 的 reasoning_end_str 配合大于 1 的投机窗口运行原场景,检查输出是否在正确的结束位置被截断、结束串没有被部分写入或残留。若要复现问题,可在 MRV1 上使用同样的配置对比输出。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: rust vllm-bench result is quite different from vllm bench serve](https://www.chat-gpts.plus/wp-content/uploads/2026/11/59154-ea9f2c53-768x403.jpg)
![[Bug]: [ROCm] Qwen4Exp (AMD path): PLE n-gram IDs read a stale query_start_loc tail during PIECEWISE CUDA-graph replay](https://www.chat-gpts.plus/wp-content/uploads/2026/11/61486-25e2f379-768x403.jpg)
