Prhub

#22758 [sgl] provide an option to send control req to all dp ranks rank0

sgl-project/sglang · 作者 bixue2010 · 合并时间 2026-04-16 14:24

分析状态 已生成
文件变更 3提交数 1 · 评论 4
代码增减 +37 / -2
feature scheduling performance run-ci

执行摘要

新增选项优化 DP 注意力模式下的控制请求广播,避免全局 Gloo 同步开销。

根据PR body描述,当前在dp_attention模式下,控制请求仅发送给tp0,然后由调度器广播到所有其他rank。由于不同DP rank处理速度差异,这会导致CPU长尾延迟,并表现为非常长的Gloo广播操作。具体地,每次请求到达时,都会发生以下Gloo广播:1. 广播工作请求大小到所有attn_tp rank;2. 广播工作请求到所有attn_tp rank;3. 广播控制请求大小到所有TP rank(通常为0,但所有TP rank仍需在CPU上同步)。第3步在dp_attention模式下引入了重大问题,因此建议添加此选项,让数据并行控制器将控制请求发送给每个DP组的leader(attn_tp_rank=0),然后每个leader在其attn_tp_group内广播,这与工作请求的行为一致。

该PR值得精读,尤其是调度器中的广播逻辑调整,展示了如何通过细粒度通信优化解决分布式系统中的性能瓶颈。关注点包括:1. 配置选项的设计如何平衡兼容性与性能;2. 广播路径从tp_group切换到attn_tp_group/attn_cp_group的决策依据;3. 未来可扩展性,如是否支持其他并行模式。

讨论亮点

Review中仅有一条来自ch-wan的批准评论,内容为空,表明该PR在技术实现上未引发争议或深入讨论,可能因为改动较小且目标明确。

实现拆解

  1. 新增配置选项:在server_args.py中添加enable_dp_attention_local_control_broadcast布尔字段和对应的命令行参数--enable-dp-attention-local-control-broadcast,用于启用本地控制广播优化。
  2. 调整数据并行控制器逻辑:在data_parallel_controller.py__init__方法中,根据新配置选项动态设置control_message_step。若启用本地广播,则control_message_step设为1(发送给每个DP组leader),否则回退到原行为(tp_size,仅发送给第一个leader)。
  3. 修改调度器广播逻辑:在scheduler.pyrecv_requests方法中,当enable_dp_attention_local_control_broadcast启用时,控制请求在attn_tp_groupattn_cp_group内广播,而不是在完整的tp_group内广播,从而避免昂贵的全rank Gloo同步。
  4. 测试与文档配套:本次改动未包含直接对应的测试文件变更,但PR body中作者已确认遵循了单元测试、文档更新等贡献指南。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py 调度器 modified 6.68
python/sglang/srt/managers/data_parallel_controller.py 数据并行控制器 modified 5.84
python/sglang/srt/server_args.py 服务器参数 modified 5.27
python/sglang/srt/managers/scheduler.py core-logic

核心调度逻辑变更,控制请求广播路径从 tp_group 调整为 attn_tp_group/attn_cp_group,直接影响 DP 注意力模式下的通信开销。

# 当启用本地控制广播时,每个DP组leader已从DP控制器接收控制消息,
# 因此我们在attn_tp_group + attn_cp_group内广播,而不是完整的tp_group。
# 这避免了昂贵的全rank gloo同步。
_local_ctrl = self.server_args.enable_dp_attention_local_control_broadcast
if _local_ctrl:
    if self.attn_tp_size != 1:
        control_reqs = broadcast_pyobj(
            control_reqs,
            self.attn_tp_group.rank,
            self.attn_tp_cpu_group,
            src=self.attn_tp_group.ranks[0],
        )
    if self.attn_cp_size != 1:
        control_reqs = broadcast_pyobj(
            control_reqs,
            self.attn_cp_group.rank,
            self.attn_cp_cpu_group,
            src=self.attn_cp_group.ranks[0],
        )
elif self.tp_size != 1:
    control_reqs = broadcast_pyobj(
        control_reqs,
        self.tp_group.rank,
        self.tp_cpu_group,
        src=self.tp_group.ranks[0],
    )
python/sglang/srt/managers/data_parallel_controller.py entrypoint

数据并行控制器的入口点变更,根据新配置调整 control_message_step,决定控制消息发送给哪些 DP 组 leader。

if server_args.enable_dp_attention:
    self.launch_dp_attention_schedulers(server_args, port_args)
    # 当启用本地控制广播时,发送控制消息给每个DP组leader(attn_tp_rank=0),
    # 使每个leader在其自己的attn_tp_group内广播,而不是完整的tp_group。
    # 否则回退到原始行为:仅发送给第一个leader,然后通过完整tp_group广播。
    local_ctrl = server_args.enable_dp_attention_local_control_broadcast
    self.control_message_step = 1 if local_ctrl else server_args.tp_size
else:
    self.launch_dp_schedulers(server_args, port_args)
    self.control_message_step = 1

关键符号

recv_requests __init__

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 兼容性风险:新增配置选项默认为False,保持向后兼容,不影响现有部署。但若用户启用此选项,需确保DP注意力模式已正确配置,否则可能引入广播逻辑不一致。
  2. 正确性风险:修改了调度器中的控制请求广播路径,若attn_tp_groupattn_cp_group配置有误,可能导致控制消息丢失或重复处理。
  3. 性能风险:优化旨在减少Gloo同步开销,但若DP组内广播开销增加(例如在attn_tp_size较大时),可能抵消收益。需在实际负载下验证性能提升。
  4. 测试覆盖不足:未看到新增的单元测试文件,可能依赖现有测试套件,但针对新逻辑的边界情况测试可能不充分。
  1. 用户影响:对普通用户透明,仅当显式启用--enable-dp-attention-local-control-broadcast时才会生效,为DP注意力模式用户提供性能优化选项。
  2. 系统影响:减少全局Gloo同步操作,有望降低CPU长尾延迟,提升DP注意力模式下的调度效率和整体吞吐量。
  3. 团队影响:引入新的配置参数,需在文档和部署指南中更新,并可能影响后续相关功能开发(如DP注意力优化)。
核心路径变更 缺少测试覆盖 配置依赖风险

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

  • 一句话:新增选项优化DP注意力模式下的控制请求广播,避免全局Gloo同步开销。
  • 推荐动作:该PR值得精读,尤其是调度器中的广播逻辑调整,展示了如何通过细粒度通信优化解决分布式系统中的性能瓶颈。关注点包括:1. 配置选项的设计如何平衡兼容性与性能;2. 广播路径从tp_group切换到attn_tp_group/attn_cp_group的决策依据;3. 未来可扩展性,如是否支持其他并行模式。

功能与动机

根据PR body描述,当前在dp_attention模式下,控制请求仅发送给tp0,然后由调度器广播到所有其他rank。由于不同DP rank处理速度差异,这会导致CPU长尾延迟,并表现为非常长的Gloo广播操作。具体地,每次请求到达时,都会发生以下Gloo广播:1. 广播工作请求大小到所有attn_tp rank;2. 广播工作请求到所有attn_tp rank;3. 广播控制请求大小到所有TP rank(通常为0,但所有TP rank仍需在CPU上同步)。第3步在dp_attention模式下引入了重大问题,因此建议添加此选项,让数据并行控制器将控制请求发送给每个DP组的leader(attn_tp_rank=0),然后每个leader在其attn_tp_group内广播,这与工作请求的行为一致。

实现拆解

  1. 新增配置选项:在server_args.py中添加enable_dp_attention_local_control_broadcast布尔字段和对应的命令行参数--enable-dp-attention-local-control-broadcast,用于启用本地控制广播优化。
  2. 调整数据并行控制器逻辑:在data_parallel_controller.py__init__方法中,根据新配置选项动态设置control_message_step。若启用本地广播,则control_message_step设为1(发送给每个DP组leader),否则回退到原行为(tp_size,仅发送给第一个leader)。
  3. 修改调度器广播逻辑:在scheduler.pyrecv_requests方法中,当enable_dp_attention_local_control_broadcast启用时,控制请求在attn_tp_groupattn_cp_group内广播,而不是在完整的tp_group内广播,从而避免昂贵的全rank Gloo同步。
  4. 测试与文档配套:本次改动未包含直接对应的测试文件变更,但PR body中作者已确认遵循了单元测试、文档更新等贡献指南。

关键文件:

  • python/sglang/srt/managers/scheduler.py(模块 调度器;类别 source;类型 core-logic;符号 recv_requests): 核心调度逻辑变更,控制请求广播路径从tp_group调整为attn_tp_group/attn_cp_group,直接影响DP注意力模式下的通信开销。
  • python/sglang/srt/managers/data_parallel_controller.py(模块 数据并行控制器;类别 source;类型 entrypoint;符号 init): 数据并行控制器的入口点变更,根据新配置调整control_message_step,决定控制消息发送给哪些DP组leader。
  • python/sglang/srt/server_args.py(模块 服务器参数;类别 source;类型 configuration;符号 ServerArgs): 新增配置选项enable_dp_attention_local_control_broadcast,为用户提供启用本地广播的开关。

关键符号:recv_requests, init

关键源码片段

python/sglang/srt/managers/scheduler.py

核心调度逻辑变更,控制请求广播路径从tp_group调整为attn_tp_group/attn_cp_group,直接影响DP注意力模式下的通信开销。

# 当启用本地控制广播时,每个DP组leader已从DP控制器接收控制消息,
# 因此我们在attn_tp_group + attn_cp_group内广播,而不是完整的tp_group。
# 这避免了昂贵的全rank gloo同步。
_local_ctrl = self.server_args.enable_dp_attention_local_control_broadcast
if _local_ctrl:
    if self.attn_tp_size != 1:
        control_reqs = broadcast_pyobj(
            control_reqs,
            self.attn_tp_group.rank,
            self.attn_tp_cpu_group,
            src=self.attn_tp_group.ranks[0],
        )
    if self.attn_cp_size != 1:
        control_reqs = broadcast_pyobj(
            control_reqs,
            self.attn_cp_group.rank,
            self.attn_cp_cpu_group,
            src=self.attn_cp_group.ranks[0],
        )
elif self.tp_size != 1:
    control_reqs = broadcast_pyobj(
        control_reqs,
        self.tp_group.rank,
        self.tp_cpu_group,
        src=self.tp_group.ranks[0],
    )

python/sglang/srt/managers/data_parallel_controller.py

数据并行控制器的入口点变更,根据新配置调整control_message_step,决定控制消息发送给哪些DP组leader。

if server_args.enable_dp_attention:
    self.launch_dp_attention_schedulers(server_args, port_args)
    # 当启用本地控制广播时,发送控制消息给每个DP组leader(attn_tp_rank=0),
    # 使每个leader在其自己的attn_tp_group内广播,而不是完整的tp_group。
    # 否则回退到原始行为:仅发送给第一个leader,然后通过完整tp_group广播。
    local_ctrl = server_args.enable_dp_attention_local_control_broadcast
    self.control_message_step = 1 if local_ctrl else server_args.tp_size
else:
    self.launch_dp_schedulers(server_args, port_args)
    self.control_message_step = 1

评论区精华

Review中仅有一条来自ch-wan的批准评论,内容为空,表明该PR在技术实现上未引发争议或深入讨论,可能因为改动较小且目标明确。

  • 暂无高价值评论线程

风险与影响

  • 风险:1. 兼容性风险:新增配置选项默认为False,保持向后兼容,不影响现有部署。但若用户启用此选项,需确保DP注意力模式已正确配置,否则可能引入广播逻辑不一致。
    2. 正确性风险:修改了调度器中的控制请求广播路径,若attn_tp_groupattn_cp_group配置有误,可能导致控制消息丢失或重复处理。
    3. 性能风险:优化旨在减少Gloo同步开销,但若DP组内广播开销增加(例如在attn_tp_size较大时),可能抵消收益。需在实际负载下验证性能提升。
    4. 测试覆盖不足:未看到新增的单元测试文件,可能依赖现有测试套件,但针对新逻辑的边界情况测试可能不充分。
  • 影响:1. 用户影响:对普通用户透明,仅当显式启用--enable-dp-attention-local-control-broadcast时才会生效,为DP注意力模式用户提供性能优化选项。
    2. 系统影响:减少全局Gloo同步操作,有望降低CPU长尾延迟,提升DP注意力模式下的调度效率和整体吞吐量。
    3. 团队影响:引入新的配置参数,需在文档和部署指南中更新,并可能影响后续相关功能开发(如DP注意力优化)。
  • 风险标记:核心路径变更, 缺少测试覆盖, 配置依赖风险

关联脉络

  • PR #22920 Remove compatibility restriction between Pipeline Parallelism and Mixed Chunked Prefill: 同样涉及调度和并行配置优化,展示了仓库在性能调优方面的持续演进。
  • PR #21887 [Ray] Add data parallel (DP) and DP attention support to RayEngine: 早期添加DP注意力支持的PR,本PR在此基础上进行性能优化,关联性强。

参与讨论