Prhub

#29543 Fix DP-attention SHM feature finalization race

原始 PR 作者 merrymercy 合并时间 2026-06-28 12:36 文件变更 1 提交数 1 评论 2 代码增减 +12 / -21

执行摘要

修复 DP-attention 下 SHM 内存的竞态条件

在 DP-attention 模式下,广播源 rank 返回原始对象时,其他 rank 可能仍在反序列化 ShmPointerMMData(调用 shm_open)。之前仅对非 DP-attention 路径做了同步,导致 DP-attention 下 source rank 提前调用 materialize()/shm_unlink,而其他 rank 还没完成 shm_open,产生竞态条件。

该 PR 修复了一个明确的并发竞态条件,逻辑清晰,改动量小,可以审阅后合并。值得关注的是其对 DP-attention 路径的同步策略:使用 attn_tp 和 attn_cp 分组 barrier 而非全 tp 组 barrier,避免了不必要的同步开销,是一个好的设计选择。

讨论亮点

PR 没有 review 评论或审核记录,仅由作者 merrymercy 直接合并。

实现拆解

  1. _finalize_shm_features 方法中,移除外层条件中对 enable_dp_attention 的排除判断,改为统一的 self.model_config.is_multimodal and has_shm_features(recv_reqs) 入口。
  2. 在内部分支中根据 enable_dp_attention 分别处理:若启用 DP-attention,则根据 attn_tp_sizeattn_cp_size 在对应的 CPU 组上执行 barrier;否则回退到原 tp_cpu_group barrier。
  3. 清理了过时的注释和冗余的逻辑判断,使同步屏障覆盖所有 SHM 承载的通信路径。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler_components/request_receiver.py 调度器 modified 6.52

关键符号

_finalize_shm_features

关键源码片段

python/sglang/srt/managers/scheduler_components/request_receiver.py core-logic

唯一变更文件,修改了 _finalize_shm_features 方法,调整了同步屏障的覆盖范围,将 DP-attention 路径纳入同步保护。

def _finalize_shm_features(self, recv_reqs: Optional[List]) -> None:
    # Unwrap shared memory features AFTER all broadcasts complete,
    # so that ShmPointerMMData metadata (not full tensor data) is what
    # gets serialized during broadcast_pyobj.
    if recv_reqs:
        if self.model_config.is_multimodal and has_shm_features(recv_reqs):
            # 广播源 rank 返回原始对象时,其他 rank 可能仍在反序列化
            # ShmPointerMMData(调用 shm_open)。在 materialize() 解除
            # 映射之前,需要在承载 SHM 工作请求的同一 CPU 组上同步。
            if self.server_args.enable_dp_attention:
                # DP-attention 路径:在 attn_tp 和 attn_cp 组上分别同步,
                # 这些组是实际传递 SHM 指针的通信组。
                if self.ps.attn_tp_size > 1:
                    barrier(group=self.attn_tp_cpu_group)
                if self.ps.attn_cp_size > 1:
                    barrier(group=self.attn_cp_cpu_group)
            elif self.ps.tp_size > 1:
                # 非 DP-attention 路径:原有 tp_cpu_group 同步保持不变。
                barrier(group=self.tp_cpu_group)
        for req in recv_reqs:
            unwrap_shm_features(req)

评论区精华

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

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

风险与影响

变更仅涉及同一个方法内的控制流调整,范围很小。风险较低,但需要确认 DP-attention 路径下 attn_tp 和 attn_cp CPU 组的正确初始化,以及 barrier 调用不会引入死锁。由于没有新增测试文件,回归风险依赖现有 CI。

仅影响启用 DP-attention 且使用 SHM 特征的 multimodal 模型路径。修复了潜在的竞态崩溃,提升了 DP-attention 在共享内存场景下的稳定性。非 DP-attention 路径无行为变化。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论