Prhub

#45166 [CI][NIXL] Fix NIXL EP import canary for the nixl 1.3.0 wheel and pin nixl==1.3.0

原始 PR 作者 ovidiusm 合并时间 2026-06-26 10:33 文件变更 2 提交数 10 评论 8 代码增减 +4 / -24

执行摘要

升级 nixl 至 1.3.0,简化 EP 导入检查

nixl 1.3.0 重新组织了 wheel 包,将不同 CUDA 版本的扩展安装到独立命名空间(如 nixl_cu12/),旧版 canary 测试依赖查找 nixl_ep_cpp 子模块并运行 ldd 检查,在新版下失败。PR 旨在修复 canary 并锁定 1.3.0 版本。

该 PR 属于常规维护,但展示了如何适配上游库的打包变化。开发者在升级类似依赖时可参考“简化 canary 测试”的思路。

讨论亮点

review 中 depthfirst-app[bot] 提出两个安全问题:

1) install-kv-connectors.sh 中使用 unsafe-best-match 导致依赖混淆风险;
2) 全局设置 UV_PRERELEASE=allow 扩大攻击面。作者回应这些脚本已从最终 PR 中移除(文件未包含在合并补丁中)。

实现拆解

  1. 依赖版本升级:在 requirements/kv_connectors.txt 中将 nixl1.2.0 更新为 1.3.0
  2. 简化 canary 测试:在 tests/v1/kv_connector/nixl_integration/test_nixl_imports.py 中移除 subprocesssys 导入;不再调用 _import_nixl_ep_cppldd 动态库检查;改为断言 nixl_ep.__file__ 不为 None 以及 nixl_ep.Config 存在,降低测试对环境(如 ldd)的依赖。
文件 模块 状态 重要度
tests/v1/kv_connector/nixl_integration/test_nixl_imports.py KV 连接器测试 modified 5.15
requirements/kv_connectors.txt 依赖配置 modified 1.89

关键符号

test_nixl_and_nixl_ep_imports _print_distribution_version _import_nixl_ep_cpp

关键源码片段

tests/v1/kv_connector/nixl_integration/test_nixl_imports.py test-coverage

核心变更:简化 NIXL EP 导入 canary,移除 ldd 检查,适配 1.3.0 新布局

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
"""NIXL import canaries for CUDA wheel selection."""import importlib
import importlib.metadata as metadata
import typesimport pytest
import torch
​
​
def _print_distribution_version(package_name: str) -> None:
    try:
        version = metadata.version(package_name)
    except metadata.PackageNotFoundError:
        version = "not installed"
    print(f"{package_name}: {version}")
​
​
def _import_nixl_ep_cpp(nixl_ep: types.ModuleType) -> types.ModuleType:
    candidate_module_names = []
​
    config_module_name = getattr(getattr(nixl_ep, "Config", None), "__module__", None)
    if config_module_name and config_module_name.endswith("nixl_ep_cpp"):
        candidate_module_names.append(config_module_name)
​
    if torch.version.cuda is not None:
        cuda_major = torch.version.cuda.split(".", maxsplit=1)[0]
        candidate_module_names.append(f"nixl_ep_cu{cuda_major}.nixl_ep_cpp")
​
    # Keep compatibility with the pre-dispatcher wheel layout.
    candidate_module_names.append("nixl_ep.nixl_ep_cpp")
​
    for module_name in dict.fromkeys(candidate_module_names):
        try:
            return importlib.import_module(module_name)
        except ModuleNotFoundError as exc:
            missing_module = exc.name
            if missing_module not in (module_name, module_name.split(".", 1)[0]):
                raise
​
    raise AssertionError(
        "No nixl_ep_cpp extension module found; tried "
        f"{', '.join(dict.fromkeys(candidate_module_names))}"
    )
​
​
@pytest.mark.skipif(torch.version.cuda is None, reason="CUDA NIXL EP canary")
def test_nixl_and_nixl_ep_imports() -> None:
    """Verify both core NIXL and the NIXL EP extension import successfully."""
    print(f"torch cuda: {torch.version.cuda}")
    for package_name in ("nixl", "nixl-cu12", "nixl-cu13"):
        _print_distribution_version(package_name)
​
    nixl = importlib.import_module("nixl")
    print(f"nixl: {nixl.__file__}")
​
    # Exercise the core NIXL bindings used by NixlConnector.
    importlib.import_module("nixl._api")
    importlib.import_module("nixl._bindings")
​
    # Exercise the NIXL EP extension used by fused MoE expert parallelism.
    nixl_ep = importlib.import_module("nixl_ep")
    print(f"nixl_ep: {nixl_ep.__file__}")
    assert nixl_ep.__file__ is not None
​
    # Check that the NIXL EP extension is loaded.
    assert nixl_ep.Config is not None

评论区精华

依赖混淆与预发布安全风险 安全

depthfirst-app[bot] 指出 install-kv-connectors.sh 中 unsafe-best-match 和全局 UV_PRERELEASE=allow 带来依赖混淆和预发布风险。

结论:作者确认该脚本已从最终 PR 中移除,不再包含在合并补丁中。 · 已解决

风险与影响

低风险。依赖升级可能引入新的行为,但 nixl 1.3.0 在 CI 中已验证。测试简化减少了 ldd 环境依赖,但保留了对 nixl_ep.Config 的断言,基本覆盖导入正确性。

仅影响使用 NIXL KV Connector 的配置(disaggregated prefill 场景)。用户无需手动调整,升级后自动使用新版本。CI 的 canary 测试更简洁,易于维护。

依赖升级 测试逻辑简化

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论