Prhub

#49251 [ROCm] Upgrade NIXL and UCX

原始 PR 作者 AndreasKaratzas 合并时间 2026-07-22 11:30 文件变更 10 提交数 7 评论 3 代码增减 +127 / -102

执行摘要

ROCm 平台 NIXL/UCX 升级及 RIXL 迁移

PR body 指出要将 ROCm 镜像升级到 pinned upstream NIXL/UCX 版本,构建 ROCm NIXL wheel 并启用 UCX_RMA_PPLN_ENABLE=y,同时优选 nixl_rocm 并保留 RIXL 兼容性。

该 PR 是 ROCm 平台基础设施的关键升级,建议阅读 docker/Dockerfile.rocmvllm/distributed/nixl_utils.py 的变更,理解 NIXL 的集成方式和包名统一策略;测试覆盖完整,值得信赖,可安全合入。

讨论亮点

Review 中关于 manylinux 版本的讨论

  • tlrmchlsmthdocker/Dockerfile.rocm 评论中指出:_GLIBCXX_USE_CXX11_ABI 设置可能导致 manylinux 版本过高,排除 Ubuntu 22.04 及更早系统。
  • AndreasKaratzas 回复已修正此问题,后续 commit 调整了相关配置。
    结论:争议已解决,Dockerfile 最终版本降低了 manylinux 版本要求。

实现拆解

  1. Docker 构建升级:修改 docker/Dockerfile.rocm,将 RIXL 构建阶段替换为 NIXL,更新 UCX 分支,添加 meson-python、pybind11 等依赖,配置 -Dwheel_variant=rocm 构建选项,生成 ROCm 专属 wheel,并通过 ldconfig 注册库路径;同步更新 docker/ci-rocm.hcldocker/docker-bake-rocm.hcl 中的镜像标签。
  2. 核心包名逻辑重构:在 vllm/distributed/nixl_utils.py 中新增 _get_nixl_package_name() 方法,统一返回 'nixl_rocm'(ROCm)或 'nixl'(其他平台);修改 _get_nixl_module_name_maybe_set_ucx_rcache_limitis_nixl_available 中的包名判断,移除对 'rixl' 的直接引用;is_nixl_available 增加 sys.modules 检查以支持已加载场景。
  3. EPLB 通信器和配置清理:在 vllm/distributed/eplb/eplb_communicator.py 中更新 has_nixl() 文档字符串和 RuntimeError 信息,去除 RIXL 字样;在 vllm/config/parallel.py 中更新 EPLB 后端注释。
  4. 测试和文档配套:重命名测试文件 test_rixl_gpu_mem_diag.pytest_nixl_rocm_gpu_mem_diag.py,内部函数和打印信息统一为 NIXL;更新 test_nixl_connector.py 中的 fake package 创建列表,加入 nixl_rocm,并添加 @patch 装饰器简化测试;修改 docs/features/nixl_connector_usage.md 删除 RIXL 说明。
  5. CI 脚本同步:修改 .buildkite/scripts/ci-bake-rocm.sh 中的 RIXL 变量为 NIXL,适配新构建流程。
文件 模块 状态 重要度
docker/Dockerfile.rocm 部署脚本 modified 4.87
vllm/distributed/nixl_utils.py 分布式层 modified 6.61
tests/v1/kv_connector/unit/test_nixl_rocm_gpu_mem_diag.py KV 连接器测试 renamed 6.74
vllm/distributed/eplb/eplb_communicator.py 分布式层 modified 5.39
tests/v1/kv_connector/unit/test_nixl_connector.py KV 连接器测试 modified 4.74

关键符号

_get_nixl_package_name _get_nixl_module_name is_nixl_available _maybe_set_ucx_rcache_limit has_nixl

关键源码片段

vllm/distributed/nixl_utils.py core-logic

代码中核心逻辑变更,引入 `_get_nixl_package_name` 方法统一包名,修改模块导入和可用性检查,移除 RIXL 引用。

# vllm/distributed/nixl_utils.py (after PR)def _get_nixl_package_name() -> str:
    # 返回当前平台对应的 NIXL 包名
    # - ROCm 平台使用 "nixl_rocm"
    # - 其他平台(如 CUDA)使用 "nixl"
    return "nixl_rocm" if current_platform.is_rocm() else "nixl"def _get_nixl_module_name(name: str) -> str:
    # 根据包名和符号名确定导入模块路径
    package_name = _get_nixl_package_name()
    if name == "nixlXferTelemetry":
        return f"{package_name}._bindings"
    return f"{package_name}._api"def is_nixl_available() -> bool:
    # 检查 NIXL 包是否已加载或可通过 import 找到
    pkg = _get_nixl_package_name()
    # 同时检查 sys.modules 以避免重复导入
    return pkg in sys.modules or importlib.util.find_spec(pkg) is not None
tests/v1/kv_connector/unit/test_nixl_rocm_gpu_mem_diag.py rename-or-move

测试配套文件,重命名并调整测试函数名称和打印信息,确保 GPU 内存泄露检测测试与 NIXL 命名一致。

# tests/v1/kv_connector/unit/test_nixl_rocm_gpu_mem_diag.py (after PR)
# 原测试文件名为 test_rixl_gpu_mem_diag.py,随包名变更同步重命名@pytest.mark.parametrize("model_name, sw_size", [("google/gemma-3-1b-it", 512)])
def test_gpu_memory_nixl_hma(model_name, sw_size):
    # 验证 NixlConnector 使用 NIXL 时的 GPU 内存泄露情况
    # 对应原 test_gpu_memory_rixl_hma,连接器类型不变
    ...@pytest.mark.parametrize("model_name", ["google/gemma-3-1b-it"])
def test_gpu_memory_no_nixl_baseline(model_name):
    # 对照组,不使用 NixlConnector,用于隔离 UCX/NIXL 的内存影响
    # 对应原 test_gpu_memory_no_rixl_baseline
    ...

评论区精华

manylinux 版本兼容性 other

tlrmchlsmth 评论指出 Dockerfile 中可能设置了过高的 manylinux 版本,会排除 Ubuntu 22.04。

结论:作者已修正,降低了 manylinux 版本要求。 · 已解决

风险与影响

  • 兼容性风险:旧版 RIXL 调用可能失效,但代码中通过 _get_nixl_package_name 的返回值保留了老逻辑的 fallback(仅当 nixl_rocmnixl 都不可用时才会退化为 None),但未明确保留 'rixl' 作为包名,若外部依赖直接引用 'rixl' 会失败。
  • 构建环境风险:新 NIXL 依赖 meson-python、pybind11 等,可能在企业受限网络下构建失败;UCX 版本升级可能引入不兼容的 API 变更。
  • 测试覆盖风险:仅 ROCm 平台的 GPU memory 诊断测试被更新,其他平台(如 Intel GPU)的相关测试未调整,可能遗漏回归。
  • 用户影响:ROCm 用户将自动受益于 NIXL 和 UCX 的升级,可能获得更好的性能和稳定性,但升级后需确保 nixl_rocm 包可用;非 ROCm 用户不受影响。
  • 系统影响:CI 镜像构建流程变更,Docker 构建阶段名称和缓存键修改,可能影响构建缓存复用。
  • 团队影响:维护成本降低,因为 NIXL 是上游统一库,不再需要维护 RIXL 分支;但迁移后需同步跟进 NIXL 的更新。
兼容性风险 构建环境变更 测试仅覆盖 ROCm

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论