Prhub

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

原始 PR 作者 bixue2010 合并时间 2026-04-16 14:24 文件变更 3 提交数 1 评论 6 代码增减 +37 / -2

执行摘要

DP attention 控制消息广播优化

在 DP attention 模式下,每个请求到来时都会触发 gloo broadcast ops(广播 req size、work req、control req),其中 control req 广播到所有 TP rank,在 DP 组处理速度差异下产生 CPU straggler,成为性能瓶颈。PR 作者提出将 control req 广播范围缩小到 attn_tp_group + attn_cp_group。

值得精读,展示了分布式系统中通过缩小同步范围减少 straggler 的典型优化思路。评审者在 PR 讨论中确认了不设为默认的权衡,可供参考。

讨论亮点

reviewer ch-wan 询问是否应将该选项设为默认,PR 作者 bixue2010 解释:pause 操作需要 control req 发送到 TP0 再广播到所有 rank 以保证同步步调,因此默认行为维持原状;但对于实时流量、sync RL 等不需要 pause 的场景,开启此选项有性能收益。

实现拆解

  1. 新增配置项 (server_args.py):添加 enable_dp_attention_local_control_broadcast: bool = False 字段和 CLI 参数 --enable-dp-attention-local-control-broadcast

  2. DP controller 分发策略调整 (data_parallel_controller.py):在 __init__ 中,根据新配置决定 control_message_step:如果开启,则 step=1(发送给每个 DP group leader);否则沿用原值 tp_size(只发送给第一个 leader)。

  3. 调度器接收侧修改 (scheduler.py):在 recv_requests 函数中,当新配置开启时,control_reqs 改为在 attn_tp_groupattn_cp_group 内分别广播,而非原来的 tp_group 全量广播。这意味着每个 DP 副本内部独立完成广播,避免跨 DP 组的 gloo 同步。

文件 模块 状态 重要度
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

关键符号

recv_requests

关键源码片段

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

核心变更:新增 control_reqs 局部广播逻辑,避免全量 gloo 同步

# python/sglang/srt/managers/scheduler.py (recv_requests 方法片段 )if self.server_args.enable_dp_attention:
    # ... work_reqs 广播逻辑不变 ...
​
    # 新增:当开启局部控制广播时,每个 DP group leader 已从 DP controller
    # 收到 control req,因此只在 attn_tp_group + attn_cp_group 内广播
    _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:
        # 原逻辑:通过全量 tp_group 广播
        control_reqs = broadcast_pyobj(
            control_reqs,
            self.tp_group.rank,
            self.tp_cpu_group,
            src=self.tp_group.ranks[0],
        )
    recv_reqs = work_reqs + control_reqs
python/sglang/srt/managers/data_parallel_controller.py entrypoint

DP controller 发送 control req 的步长选择

# python/sglang/srt/managers/data_parallel_controller.py (__init__ 片段 )if server_args.enable_dp_attention:
    self.launch_dp_attention_schedulers(server_args, port_args)
    # 当开启局部控制广播时,向每个 DP group leader 发送 control req
    # 这样每个 leader 可以在自己的 attn_tp_group 内广播,
    # 而不是在全部 TP rank 上广播
    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
python/sglang/srt/server_args.py configuration

新增命令行选项,控制新功能开关

# python/sglang/srt/server_args.py ( 部分字段和 CLI 参数 )class ServerArgs:
    # ...
    enable_dp_attention: bool = False
    enable_dp_attention_local_control_broadcast: bool = False # 新增
    enable_dp_lm_head: bool = False
    # ...# 在 add_cli_args 函数中
parser.add_argument(
    "--enable-dp-attention-local-control-broadcast",
    action="store_true",
    help="With DP-attention, send control messages to every DP group leader "
    "and broadcast within attn_tp_group instead of the full tp_group. "
    "Eliminates a costly all-ranks gloo sync on every scheduler iteration.",
)

评论区精华

是否应设为默认 设计

ch-wan 询问是否应将新选项设为默认,bixue2010 解释 pause 操作需要原逻辑以保证同步,因此不设为默认,仅用于不需要 pause 的场景。

结论:保持默认关闭,用户按需开启。 · 已解决

风险与影响

  1. 需要确保所有使用 control req 的操作(如 pause)在新模式下行为正确,否则可能导致 rank 状态不一致(hang)。
  2. 新配置默认关闭,不影响现有用户。
  3. 测试覆盖不足:PR 无配套测试文件,需人工验证。

影响范围限于 --enable-dp-attention 模式下的用户。开启后控制消息广播由 O(num_tp_ranks) 降为 O(num_attn_tp_ranks),减少 CPU 同步开销,尤其在高 TP 规模下收益显著。

配置选项需文档说明 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论