Prhub

#6886 [fully_async] feat: Adapt vLLM 0.19+ for Ascend NPU

原始 PR 作者 fh188 合并时间 2026-07-01 16:09 文件变更 2 提交数 4 评论 2 代码增减 +72 / -19

执行摘要

适配 vLLM 0.19+ 在 Ascend NPU 上的兼容性

vLLM 0.19.0 及以上版本在 Ascend NPU 场景下存在兼容性问题,需要调整分布式进程组创建和模型层补丁逻辑以确保正常运行。

该 PR 值得阅读,尤其是 create_tcp_store 的异常处理和 StatelessProcessGroup 版本分支的设计,可作为跨版本兼容性的参考模式。

讨论亮点

Review 中 gemini-code-assist[bot] 指出 create_tcp_store 中调用 socket.close(listen_fd) 会引发 AttributeError,因为 socket 模块没有 close 函数,建议使用 os.close(listen_fd)。该问题已通过后续 commit 修正。

实现拆解

  1. 新增 create_tcp_store 辅助函数verl/utils/distributed.py):统一创建 TCPStore,支持传入已有的 listen_socket,通过 detach() 转移文件描述符给 TCPStore,并在异常时关闭 fd 防止泄漏。
  2. 基于 vLLM 版本分支 StatelessProcessGroup 创建逻辑verl/utils/distributed.py):当 vLLM >= 0.19.0 时使用新的 create_tcp_store 创建 store,并传递 listen_socket;否则保持原有逻辑直接创建 TCPStore 并传递 master_listen_fd
  3. 扩展 NPU 补丁代码verl/utils/vllm/npu_vllm_patch.py):在原有 vLLM 0.13-0.14 的补丁基础上,增加对 vLLM >= 0.19.0 的判断分支,同样禁用 RotaryEmbedding 的 flash attention 并包装 MoE weight_loader。
文件 模块 状态 重要度
verl/utils/distributed.py 分布式工具 modified 7.6
verl/utils/vllm/npu_vllm_patch.py NPU 补丁 modified 5.92

关键符号

create_tcp_store

关键源码片段

verl/utils/distributed.py core-logic

核心改动文件,新增 `create_tcp_store` 函数并基于 vLLM 版本分支修改 `StatelessProcessGroup` 创建逻辑。

def create_tcp_store(
    host: str,
    port: int,
    listen_socket: socket.socket | None = None,
    **kwargs: Any,
) -> TCPStore:
    """Create a TCPStore, optionally taking ownership of ``listen_socket``."""
    if listen_socket is None:
        # 没有 socket 时直接创建 TCPStore
        return TCPStore(host_name=host, port=port, **kwargs)
​
    # 通过 detach() 将 socket 文件描述符的所有权转移给 TCPStore
    listen_fd = listen_socket.detach()
    try:
        return TCPStore(
            host_name=host,
            port=port,
            master_listen_fd=listen_fd,
            **kwargs,
        )
    except Exception:
        # 创建失败时关闭 fd,避免泄漏
        os.close(listen_fd) # 注意:必须使用 os.close,而不是 socket.close
        raise
verl/utils/vllm/npu_vllm_patch.py dependency-wiring

扩展 NPU 补丁以支持 vLLM 0.19+,确保 RotaryEmbedding 和 MoE 权重加载在新版本上正常工作。

if _VLLM_VERSION >= version.parse("0.13.0") and _VLLM_VERSION <= version.parse("0.14.0"):
    # 原有 vLLM 0.13-0.14 的补丁
    from vllm.model_executor.layers.fused_moe import FusedMoE
    patch_vllm013_rotary_emb()
    FusedMoE.weight_loader = vllm_v013_weight_loader_method_wrapper(FusedMoE.weight_loader)
elif _VLLM_VERSION >= version.parse("0.19.0"):
    # 新增 vLLM 0.19+ 补丁,禁用 flash attn 并封装 MoE weight_loader
    from vllm.model_executor.layers.fused_moe import FusedMoE
    patch_vllm013_rotary_emb()
    FusedMoE.weight_loader = vllm_v013_weight_loader_method_wrapper(FusedMoE.weight_loader)

评论区精华

`socket.close` 错误应改为 `os.close` 正确性

gemini-code-assist[bot] 指出 `socket.close(listen_fd)` 会引发 `AttributeError`,应使用 `os.close(listen_fd)`。

结论:开发者已接受建议并修正。 · 已解决

风险与影响

  1. 文件描述符泄漏(已修复):原 socket.close 调用错误会导致异常掩盖和 fd 泄漏。
  2. 版本兼容性:新增的 vLLM 版本分支逻辑依赖 vllm.__version__,若未来 vLLM 0.19+ 版本 API 再次变化,可能需要再次适配。
  3. NPU 补丁覆盖:当前补丁仅针对特定 vLLM 版本区间,若使用不在覆盖范围内的版本可能导致未定义行为。

影响范围集中在 Ascend NPU 用户,使其能够使用 vLLM 0.19+ 进行推理和训练;对 GPU 用户无影响。改动仅涉及两个源文件,无配置或接口变更。

文件描述符泄漏(已修复) 版本兼容性依赖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论