执行摘要
- 一句话:DP attention 控制消息广播优化
- 推荐动作:值得精读,展示了分布式系统中通过缩小同步范围减少 straggler 的典型优化思路。评审者在 PR 讨论中确认了不设为默认的权衡,可供参考。
功能与动机
在 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。
实现拆解
-
新增配置项 (server_args.py):添加 enable_dp_attention_local_control_broadcast: bool = False 字段和 CLI 参数 --enable-dp-attention-local-control-broadcast。
-
DP controller 分发策略调整 (data_parallel_controller.py):在 __init__ 中,根据新配置决定 control_message_step:如果开启,则 step=1(发送给每个 DP group leader);否则沿用原值 tp_size(只发送给第一个 leader)。
-
调度器接收侧修改 (scheduler.py):在 recv_requests 函数中,当新配置开启时,control_reqs 改为在 attn_tp_group 和 attn_cp_group 内分别广播,而非原来的 tp_group 全量广播。这意味着每个 DP 副本内部独立完成广播,避免跨 DP 组的 gloo 同步。
关键文件:
python/sglang/srt/managers/scheduler.py(模块 调度器;类别 source;类型 core-logic;符号 recv_requests): 核心变更:新增 control_reqs 局部广播逻辑,避免全量 gloo 同步
python/sglang/srt/managers/data_parallel_controller.py(模块 控制器;类别 source;类型 entrypoint;符号 init): DP controller 发送 control req 的步长选择
python/sglang/srt/server_args.py(模块 配置;类别 source;类型 configuration;符号 ServerArgs, add_cli_args): 新增命令行选项,控制新功能开关
关键符号:recv_requests
关键源码片段
python/sglang/srt/managers/scheduler.py
核心变更:新增 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
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
新增命令行选项,控制新功能开关
# 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.",
)
评论区精华
reviewer ch-wan 询问是否应将该选项设为默认,PR 作者 bixue2010 解释:pause 操作需要 control req 发送到 TP0 再广播到所有 rank 以保证同步步调,因此默认行为维持原状;但对于实时流量、sync RL 等不需要 pause 的场景,开启此选项有性能收益。
- 是否应设为默认 (design): 保持默认关闭,用户按需开启。
风险与影响
- 风险:
- 需要确保所有使用 control req 的操作(如 pause)在新模式下行为正确,否则可能导致 rank 状态不一致(hang)。
- 新配置默认关闭,不影响现有用户。
- 测试覆盖不足:PR 无配套测试文件,需人工验证。
- 影响:影响范围限于 --enable-dp-attention 模式下的用户。开启后控制消息广播由 O(num_tp_ranks) 降为 O(num_attn_tp_ranks),减少 CPU 同步开销,尤其在高 TP 规模下收益显著。
- 风险标记:配置选项需文档说明, 缺少测试覆盖
关联脉络
- PR #20114 fix: support HybridLinearAttnBackend in TboAttnBackend: 同涉及 DP attention 相关调度逻辑
参与讨论