Prhub

#21514 [rl][sgl] fix tensor mismatch after pause

原始 PR 作者 bixue2010 合并时间 2026-03-27 23:02 文件变更 2 提交数 1 评论 5 代码增减 +217 / -1

执行摘要

修复 pause_generation 中由于 batch 处理不当导致的 tensor 形状不匹配错误。

根据PR body描述,根因是在pause_generation中,调用filter_batch后无条件调用merge_batch。当last_batch的所有请求完成时,filter_batch会清空reqs但早期返回,tensors仍保留旧大小,导致merge_batch后tensor形状与reqs数量不一致,破坏len(reqs) == seq_lens.shape[0]的不变量,进而引发KV-cache分配错误和RuntimeError: The size of tensor a must match the size of tensor b。

建议技术管理者和工程师精读此PR,以理解调度中batch处理的一致性原则。关注pause_generation函数的修改如何与get_next_batch_to_run保持逻辑对齐,以及模拟测试的设计如何隔离核心依赖,这对于维护调度系统的稳定性有参考价值。

讨论亮点

在review评论中,reviewer ispobock提出两条建议:一是询问测试是否遵循指定的编写指南(https://github.com/sgl-project/sglang/blob/main/.claude/skills/write-sglang-test/SKILL.md),二是建议将单元测试移动到https://github.com/sgl-project/sglang/tree/main/test/registered/unit目录下。这些讨论关注测试的规范性和位置,但并未涉及核心逻辑的争议或决策结论。

实现拆解

实现分为两部分:首先,在python/sglang/srt/managers/scheduler.py的pause_generation函数中,将原本的无条件merge_batch调用替换为条件检查,只有当last_batch不为空时才进行合并,逻辑与同文件中的get_next_batch_to_run函数保持一致。其次,新增test/registered/rl/test_pause_generation_tensor_consistency.py文件,模拟ScheduleBatch的is_empty、filter_batch和merge_batch方法,通过单元测试验证修复后的tensor一致性。

文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py scheduling modified 6.0
test/registered/rl/test_pause_generation_tensor_consistency.py testing added 5.0

关键符号

pause_generation _FakeBatch.is_empty _FakeBatch.filter_batch _FakeBatch.merge_batch

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

评论区精华

测试编写指南遵循 documentation

reviewer ispobock 询问是否可以遵循指定的测试编写指南

结论:未明确说明是否已遵循,但测试文件已添加 · 已解决

测试文件位置建议 style

reviewer ispobock 建议将单元测试移动到指定目录

结论:状态未知,但 PR 已合并,可能已处理或未处理 · pending

风险与影响

风险较低:修复仅添加条件检查,逻辑简单,且新增了专门的单元测试覆盖相关场景。但仍需确保条件检查不会引入新的边缘情况,例如当running_batch为空时的处理是否正确。此外,修改位于核心调度路径,需通过CI验证不影响其他功能。

该PR修复了一个影响RL(强化学习)相关调度功能的bug,防止了因tensor不匹配导致的运行时错误。通过确保batch处理的一致性,提高了调度模块的可靠性,可能对依赖pause_generation的用户场景产生积极影响,提升系统稳定性。

核心路径变更 测试覆盖新增

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论