执行摘要
- 一句话:新增选项优化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内广播,这与工作请求的行为一致。
实现拆解
- 新增配置选项:在
server_args.py中添加enable_dp_attention_local_control_broadcast布尔字段和对应的命令行参数--enable-dp-attention-local-control-broadcast,用于启用本地控制广播优化。
- 调整数据并行控制器逻辑:在
data_parallel_controller.py的__init__方法中,根据新配置选项动态设置control_message_step。若启用本地广播,则control_message_step设为1(发送给每个DP组leader),否则回退到原行为(tp_size,仅发送给第一个leader)。
- 修改调度器广播逻辑:在
scheduler.py的recv_requests方法中,当enable_dp_attention_local_control_broadcast启用时,控制请求在attn_tp_group和attn_cp_group内广播,而不是在完整的tp_group内广播,从而避免昂贵的全rank Gloo同步。
- 测试与文档配套:本次改动未包含直接对应的测试文件变更,但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_group或attn_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在此基础上进行性能优化,关联性强。
参与讨论