viable/strict/1790720927: [symm_mem]: Add per-PG stream serialization for ops (#195947)
PyTorch 合并 PR #195947,为对称内存(symmetric memory)操作加入按进程组(per-PG)的流串行化。该改动以 RAII 的 GroupStreamGuard 替换原有的 warn_if_multi_stream 诊断,在跨 CUDA 流执行同一 PG 的信号垫操作时,通过 per-(group_name, device) 互斥锁与事件等待避免 CAS 协议死锁。覆盖 barrier、put_signal、wait_signal、CUDASymmetricMemoryOps.cu 中六个集合操作及两个信号操作。仅适用于 CUDA 与 NCCL 后端,NVSHMEM 后端由 #196337 处理。
发展脉络
- 首次出现viable/strict/1790720927: [symm_mem]: Add per-PG stream serialization for ops (#195947)PyTorch Core
- 当前判断该改动属于 PyTorch 核心运行时对对称内存并发的加固,影响使用 CUDA/NCCL 多流通信的分布式训练栈;NVSHMEM 后端尚未覆盖,说明生态内不同通信后端的一致性仍在补齐。Agent Pulse · 分析
PyTorch 发布 viable/strict/1790720927 版本,包含 PR #195947:为对称内存操作加入按进程组的流串行化。证据显示,信号垫操作在共享槽位上使用 CAS 协议,当同一 PG 的两个操作运行在不同 CUDA 流上时,第二个 CAS 可能发现槽位仍被第一个占用,从而死锁。新引入的 GroupStreamGuard 在受保护作用域内持有 per-(group_name, device) 互斥锁,流切换时在旧流记录事件并让当前流等待;同流快路径仅一次加锁与一次指针比较。状态用 weak_intrusive_ptr 校验 PG 销毁/重名,用 shared_ptr 存活并发 map 替换,CUDA graph capture 期间为空操作。该 PR 是 #188005 的部分修复,也是实现 per-PG signal pads(#192581)的一步。
从证据看,这是对多流并发下共享信号槽位竞态的工程性收敛:用互斥锁加事件同步替代仅告警的诊断,并保留同流快路径以控制开销。可验证的下一信号是 #196337 是否落地 NVSHMEM 后端,以及 per-PG signal pads(#192581)是否合并。
该改动属于 PyTorch 核心运行时对对称内存并发的加固,影响使用 CUDA/NCCL 多流通信的分布式训练栈;NVSHMEM 后端尚未覆盖,说明生态内不同通信后端的一致性仍在补齐。
对依赖 PyTorch 对称内存做多流通信的团队,该修复降低死锁风险与调试成本;但仅覆盖 CUDA/NCCL,NVSHMEM 用户需等待 #196337,短期不宜假设全后端一致。
若 per-PG signal pads 按计划实现,对称内存的流序问题可能从运行时守卫转为结构性隔离;观察点是相关 PR 的合并状态与是否出现新的死锁报告。