Prhub

#47000 [ROCm][Ray][CI] Keep assigned GPU visible for weight transfer

原始 PR 作者 AndreasKaratzas 合并时间 2026-06-30 14:59 文件变更 1 提交数 3 评论 2 代码增减 +59 / -14

执行摘要

修复 ROCm Ray 权重传输 GPU 可见性问题

在 ROCm 平台上,Ray 权重传输测试使用 NCCL/RCCL 进行跨进程通信。Ray 会设置 HI_VISIBLE_DEVICES/ROCR_VISIBLE_DEVICES,而 vLLM 通过 CUDA 兼容的 API 推理设备信息,导致 RCCL 在错误逻辑设备上初始化,引发未处理的 CUDA/HIP 错误。PR body 明确描述了此问题机制。

该 PR 属于 ROCm 平台特定 bugfix,值得相关平台开发者阅读,特别是 _weight_transfer_ray_env_vars 函数的设计可作为处理 ROCm+Ray GPU 可见性问题的通用模式。

讨论亮点

审核人 tjtanaa 在 _weight_transfer_ray_env_vars 函数处留下评论,建议将来将该函数移至公共工具文件,供其他 ROCm Ray 测试复用。开发者回应表示同意,但暂未在本 PR 中抽取为公共模块,仅作为测试内部辅助。

实现拆解

  1. 新增环境变量设置函数 (_weight_transfer_ray_env_vars):仅在 ROCm 平台返回三个 RAY_EXPERIMENTAL_NOSET_* 环境变量,阻止 Ray 修改 GPU 可见性;非 ROCm 平台返回空字典。
  2. 初始化 Ray 辅助函数 (_init_ray_for_weight_transfer):封装 ray.init 调用,传入 runtime_env 包含上述环境变量,避免重复初始化。
  3. 设备发现与设置函数_get_ray_assigned_device 通过 ray.get_gpu_ids() 获取实际分配的 GPU ID,兜底为 cuda:0_set_ray_assigned_device 调用 torch.accelerator.set_device 确保 PyTorch 使用正确的设备。
  4. 修改集成测试用例:在 trainer_broadcast_tensorinference_receive_tensortrainer_broadcast_sparse_tensor 等 Ray remote 函数中,使用 _set_ray_assigned_device() 获取设备,并替换所有硬编码 device=0"cuda:0" 为动态值。同时将测试入口的 ray.init 替换为 _init_ray_for_weight_transfer
  5. 仅有测试文件变更,未触及任何生产代码或配置。
文件 模块 状态 重要度
tests/distributed/test_weight_transfer.py 权重传输 modified 7.1

关键符号

_weight_transfer_ray_env_vars _init_ray_for_weight_transfer _get_ray_assigned_device _set_ray_assigned_device

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

评论区精华

辅助函数抽取为公共工具 设计

tjtanaa 评论建议将 `_weight_transfer_ray_env_vars` 移入公共工具文件,用于其他 ROCm Ray 测试。

结论:开发者同意但暂未抽取,保持当前测试文件内私有。 · acknowledged

风险与影响

本 PR 仅修改测试文件,不涉及生产代码,回归风险低。但需注意:torch.accelerator.set_device 在不同 PyTorch 版本上行为可能不一致,将来若 Ray 更新改变 RAY_EXPERIMENTAL_NOSET_* 行为,可能需要适配。

仅影响 ROCm 平台上 Ray 权重传输集成测试的稳定性和正确性。对其他平台(NVIDIA、CPU、Intel GPU 等)无影响;对生产运行时无影响。

仅测试文件变更 平台特定逻辑(ROCm) 依赖 Ray 实验性环境变量

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论