Prhub

#48446 [Bugfix][ROCm] Keep TP all_gather on base-class collective

原始 PR 作者 Fangzhou-Ai 合并时间 2026-07-13 11:53 文件变更 1 提交数 1 评论 1 代码增减 +8 / -0

执行摘要

ROCm 上保留 base-class all_gather 路径修复 decode 回归

PR #40996 修改了 CudaCommunicator.all_gather,使其绕过基类 all_gather_into_tensor,改用内联 pynccl 路径。该路径在每次调用时分配新的输出张量并执行 movedim/reshape,在 ROCm 上引入可测量的每步开销。在 DeepSeek-V4 上 TP=8 时,decode 吞吐量下降约 22%。本 PR 将 ROCm 路由回基类 all_gather,同时保持 CUDA/NVLS 对称内存路径不变。

值得合并。这是一个经过充分性能测试的针对性修复,修复了重要回归,风险极低。

讨论亮点

无 review 讨论。维护者 AndreasKaratzas 直接批准。issue 评论者 Rohan138 独立证实了同样的问题:在 DeepSeek-R1-0528-MXFP4 上,相同的单文件二分定位到同一 hunk,仅还原 cuda_communicator.py 即可恢复基线性能。

实现拆解

  1. 修改文件vllm/distributed/device_communicators/cuda_communicator.py 中的 all_gather 方法。
  2. 添加 ROCm 守卫:在内联 pynccl 路径前插入 if current_platform.is_rocm(): return super().all_gather(input_, dim),使 ROCm 平台走基类 all_gather_into_tensor 实现。
  3. 原因:基类路径使用 all_gather_into_tensor,避免了每步的额外张量分配和重排,在 ROCm 上性能更优。CUDA 路径不受影响。
文件 模块 状态 重要度
vllm/distributed/device_communicators/cuda_communicator.py 分布式通信 modified 5.96

关键符号

all_gather

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

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

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

风险与影响

低风险。变更仅添加一个 ROCm 条件判断,CUDA 路径完全不变。基类 all_gather 是经过验证的稳定路径。潜在风险:如果未来基类实现发生变化或 ROCm 上基类与 pynccl 通信语义差异,但当前一致。

影响范围:仅 ROCm 平台上的 tensor-parallel all_gather 操作。恢复 DeepSeek-V4 和 DeepSeek-R1 等模型在 ROCm 上的 decode 性能至回归前水平(22% 提升)。对 CUDA 用户无影响。

单一平台条件分支

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论