Prhub

#23327 Skip mamba_pool_idx revert for session requests in _get_new_batch_prefill_raw

原始 PR 作者 shenxiul 合并时间 2026-04-22 22:28 文件变更 1 提交数 1 评论 6 代码增减 +9 / -2

执行摘要

修复调度器中会话请求的 Mamba 池索引双重释放问题。

根据PR描述,先前在#21404中引入的回滚路径会释放会话持有的Mamba槽位,当请求无法加入批次时,这会导致会话后续关闭时发生双重释放(实际工作负载中观察到mamba_leaked=-9)。流式会话请求的mamba_pool_idx是通过SessionSlot.restore_to_req从会话槽恢复的,该槽位有意在多个轮次中保持相同索引。无条件释放req.mamba_pool_idx会使槽位的引用悬空,因此需要跳过会话请求的回滚。

该PR值得精读,尤其是对于涉及会话管理和Mamba模型调度的开发者。关注点在于理解会话槽位生命周期与调度器批次管理之间的交互,以及如何通过简单的属性检查避免复杂的资源管理冲突。

讨论亮点

PR的评论主要集中在CI流程和代码风格上,而非技术讨论。作者ispobock要求修复lint问题,并使用/tag-and-rerun-ci/rerun-test命令触发特定会话相关测试的运行。测试结果显示所有相关测试通过,表明修复未引入回归。没有出现关于设计或实现细节的深度技术讨论。

实现拆解

  1. 定位问题代码:在python/sglang/srt/managers/scheduler.py文件的_get_new_batch_prefill_raw方法中,找到负责回滚未加入批次请求的Mamba池索引释放的逻辑块。
  2. 添加会话检查:修改条件判断,在原有检查(请求未加入批次且mamba_pool_idx不为空)的基础上,增加not getattr(req, "session", None)条件,以识别请求是否属于会话。
  3. 更新注释说明:在代码中添加注释,解释仅释放在本批次中新分配的槽位(而非来自会话的预存槽位),因为会话持有的槽位有其独立的生命周期,在此处释放会导致双重释放。
  4. 测试验证:通过现有CI测试和手动测试流式会话工作负载,验证修复后不再出现mamba_leaked=-9异常。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py 调度器 modified 5.98

关键符号

_get_new_batch_prefill_raw

关键源码片段

python/sglang/srt/managers/scheduler.py core-logic

这是唯一的变更文件,包含了调度器核心逻辑中修复双重释放问题的关键修改。

# 在调度器的 _get_new_batch_prefill_raw 方法中,处理请求未成功加入批次时的回滚逻辑
added = len(adder.can_run_list) > 0 and req is adder.can_run_list[-1]
if (
    not added
    and req.mamba_pool_idx is not None
    and not getattr(req, "session", None) # 关键新增:仅当请求不属于会话时才执行释放
):
    # 释放 Mamba 池索引,避免内存泄漏
    self.tree_cache.req_to_token_pool.mamba_pool.free(
        req.mamba_pool_idx.unsqueeze(-1)
    )
    req.mamba_pool_idx = None

评论区精华

代码风格与 CI 验证 style

维护者 ispobock 要求作者修复 lint 问题,并触发 CI 测试以验证修复。

结论:作者提交修复后,CI 测试通过,确认变更符合代码规范且未破坏现有功能。 · 已解决

风险与影响

回归风险:修改位于调度器的核心批次构建路径,如果条件判断逻辑错误,可能导致非会话请求的Mamba池索引泄漏(未释放)或会话请求的意外释放。但变更仅增加了一个属性检查,且测试通过,风险较低。
性能影响:新增的getattr调用可能引入微小开销,但位于批次构建的非关键路径,影响可忽略。
兼容性:无破坏性变更,完全向后兼容。

对系统的影响:修复了特定场景下的内存泄漏问题,提升了系统在流式会话工作负载下的稳定性和资源管理正确性。
对用户的影响:终端用户可能不会直接感知,但避免了潜在的服务中断或性能下降。
对团队的影响:明确了会话槽位与调度器回滚逻辑的生命周期边界,为后续类似功能开发提供了参考。

核心路径变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论