Prhub

#22083 dp: add profile req hook

原始 PR 作者 happierpig 合并时间 2026-04-04 11:47 文件变更 1 提交数 1 评论 5 代码增减 +2 / -0

执行摘要

修复 DP 注意力模式下 ProfileReq 分发缺失导致的死锁问题。

PR body明确指出:当启用enable_dp_attention时,ProfileReq没有明确的分发器条目,会回退到send_control_message()方法。在tp_size=8、dp_size=2的配置下,该方法仅将请求发送给workers[::8](即仅worker[0]),而tokenizer的_Communicator期望dp_size=2个响应。由于只有一个调度器响应,通信器会永远阻塞等待第二个响应,导致/start_profile HTTP处理程序死锁。

该PR值得快速浏览,以了解DP注意力模式下控制消息分发的设计模式。关注点:

1) 分发器如何映射消息类型到处理方法。
2) send_to_all_workers与send_control_message的差异。
3) 通信器扇出预期与分发策略的匹配。

讨论亮点

由于review评论为空,没有公开的技术讨论。但从关联Issue的评论中可见,维护者hnyls2002通过/rerun-test命令验证了修复效果:首先运行registered/profiling/test_start_profile.py测试,然后运行registered/distributed/test_dp_attention.py测试,两者均通过,表明修复解决了死锁问题。

实现拆解

在data_parallel_controller.py的init_dispatcher方法中,向dispatcher列表添加(ProfileReq, self.send_to_all_workers)条目。这确保ProfileReq消息通过send_to_all_workers方法发送给所有工作进程,而不是仅发送给部分进程。

文件 模块 状态 重要度
python/sglang/srt/managers/data_parallel_controller.py srt/managers modified 8.0

关键符号

init_dispatcher send_to_all_workers

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

评论区精华

ProfileReq 分发缺失导致死锁 正确性

PR body 详细描述了死锁场景:ProfileReq 仅发送给部分工作进程,而 tokenizer 的 profile_communicator 等待所有 DP 调度器响应。

结论:通过添加分发器条目,确保 ProfileReq 发送给所有工作进程。 · 已解决

风险与影响

风险较低:

1) 变更仅涉及消息分发逻辑,不修改核心算法或数据结构。
2) 单文件改动,仅添加两行代码,影响范围有限。
3) 潜在风险是send_to_all_workers可能增加网络开销,但ProfileReq本身是低频控制消息,影响可忽略。
4) 缺少单元测试直接验证此分发逻辑,但已有集成测试覆盖。

影响范围:

1) 用户:修复了启用DP注意力时的死锁问题,确保/profile端点正常工作,提升系统可靠性。
2) 系统:解决了分布式配置下的调度阻塞,避免资源泄漏。
3) 团队:代码变更极小,易于理解和维护,但揭示了DP注意力模式下的消息分发机制需保持一致性。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论