Prhub

#26825 Fix TokenizerManager crash on top_logprobs with tensor values

原始 PR 作者 kflansburg 合并时间 2026-06-04 04:55 文件变更 2 提交数 1 评论 3 代码增减 +83 / -1

执行摘要

修复 top_logprobs 张量值导致预填充进程被 SIGKILL

在分解式 PD 部署中,当客户端发送 top_logprobs > 0 的请求时,detokenize_top_logprobs_tokensif token_logprobs_val[i]: 对多元素张量做了歧义布尔求值,抛出 RuntimeError: Boolean value of Tensor with more than one value is ambiguous。该异常被 print_exception_wrapper 捕获后调用 kill_process_tree 发送 SIGKILL,导致 prefill 进程循环重启。

不建议精读此 PR,因为它已被主维护者否认为错误修复,并且已被回退。正确的修复应参考 #27085 或 #26299。

讨论亮点

项目主维护者 merrymercy 明确指出该 PR 是错误的,正确的修复是 #27085,并认为此 PR 隐藏了一个致命 bug,应当暴露而非隐藏。虽然 Jiminator 验证了在 2 节点 PD 部署上该 PR 解决了崩溃问题,但维护者的意见表明该修复掩盖了更深层的类型不一致问题。

实现拆解

  1. 定位 bug:在 python/sglang/srt/managers/tokenizer_manager.pydetokenize_top_logprobs_tokens 方法中,第 2147 行使用 if token_logprobs_val[i]: 来跳过空缺位置。当 token_logprobs_val[i] 为多元素张量(而非 List[float])时,该布尔求值不合法。
  2. 修复:将条件改为 if token_logprobs_val[i] is not None,明确检查 sentinel 值,同时兼容 listtensor 类型。
  3. 添加单元测试:新增 test/registered/unit/managers/test_tokenizer_manager_top_logprobs_tensor.py,包含三个测试用例:
    • test_multi_element_tensor_value_does_not_crash:验证多元素张量不再崩溃。
    • test_none_position_yields_none:验证 None sentinel 依然返回 None
    • test_plain_list_values_still_work:验证普通 List[float] 路径不受影响。
      测试使用 _make_tokenizer_manager 辅助函数绕过 __init__ 创建最小实例。
文件 模块 状态 重要度
python/sglang/srt/managers/tokenizer_manager.py 调度器 modified 4.82
test/registered/unit/managers/test_tokenizer_manager_top_logprobs_tensor.py 测试 added 7.62

关键符号

detokenize_top_logprobs_tokens

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

修复正确性争议 正确性

merrymercy 认为此 PR 是错误的,正确修复是 #27085,此 PR 隐藏了致命 bug。

结论:PR 被否定,后被回退。 · resolved by revert

风险与影响

  1. 掩盖根本问题:此 PR 仅处理了布尔求值异常,但根本原因是 token_logprobs_val 中的元素可能为张量而非列表,修复未解决类型不一致的来源。
  2. 回退风险:该 PR 已被合并后又回退(见 #27187),说明可能引入了其他问题。
  3. 影响范围:仅在 top_logprobs > 0 且后端返回张量值的场景下触发,对多数用户无影响。
  • 用户:在分解式 PD 部署中,此 PR 修复了 prefill 崩溃重启的问题,但未解决根本原因,用户可能仍会遇到其他类型相关的异常。
  • 系统:避免进程被 SIGKILL,提高了稳定性。
  • 团队:需要跟进 #27085 或其他正确修复来彻底解决缺陷。
已被主维护者否定 已被回退 可能掩盖根本原因

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论