Prhub

#7042 [ci] chore: remove vllm_ascend patch and fix ci

原始 PR 作者 wucong25 合并时间 2026-07-15 23:09 文件变更 7 提交数 6 评论 1 代码增减 +4 / -194

执行摘要

移除 vLLM Ascend 旧补丁并修复 CI

随着 vLLM 和 vllm_ascend 的版本演进,原有针对 v0.11/v0.13 的 MoE 通信方法包装器等补丁已不再需要,移除这些过时代码可减少维护负担并修复因依赖过期导致的 CI 失败。

建议团队成员了解此变更,特别是涉及 Ascend 平台开发和测试的成员。此 PR 展示了如何跟踪上游依赖变化并及时清理过期补丁,是良好的工程实践。审查时应重点确认所有依赖旧补丁的代码路径已完全移除,并运行 Ascend CI 测试以验证兼容性。

讨论亮点

Gemini Code Assist 机器人指出,在删除 check_vllm_ascend_before_server_launch 时,vllm_async_server.py 中仍然存在导入和调用,将导致 ImportError,建议同步清理。该评论被采纳,在后续提交中已移除对应代码。

实现拆解

  1. 删除旧补丁函数:在 npu_vllm_patch.py 中删除 vllm_ascend_v011_select_moe_comm_method_wrapper、vllm_ascend_v011_matmul_and_reduce_wrapper、vllm_ascend_v013_select_moe_comm_method_wrapper、vllm_ascend_v013_matmul_and_reduce_wrapper、check_vllm_ascend_before_server_launch 及辅助检测函数,仅保留面向 v0.13+ 的权重加载包装器和旋转嵌入补丁。
  2. 清理调用点:在 vllm_async_server.py 的 _apply_quantization 方法中移除对 check_vllm_ascend_before_server_launch 的条件导入和调用。
  3. 更新导出入口:在 verl/utils/vllm/__init__.py 中删除 check_vllm_ascend_before_server_launch 的导入和 __all__ 条目。
  4. 同步 Docker 构建:在 Dockerfile.ascend.sglang_8.5.0_a2、Dockerfile.ascend.sglang_8.5.0_a3、Dockerfile.ascend_9.0.0_a2、Dockerfile.ascend_9.0.0_a3 中移除 Megatron-Bridge 仓库克隆步骤和对应的 PYTHONPATH 环境变量设置。
文件 模块 状态 重要度
verl/utils/vllm/npu_vllm_patch.py NPU 补丁 modified 8.51
verl/workers/rollout/vllm_rollout/vllm_async_server.py Rollout modified 4.9
verl/utils/vllm/__init__.py VLLM 工具 modified 4.19
docker/ascend/Dockerfile.ascend.sglang_8.5.0_a2 Docker 构建 modified 3.13
docker/ascend/Dockerfile.ascend.sglang_8.5.0_a3 Docker 构建 modified 3.13
docker/ascend/Dockerfile.ascend_9.0.0_a2 Docker 构建 modified 3.08
docker/ascend/Dockerfile.ascend_9.0.0_a3 Docker 构建 modified 2.62

关键符号

vllm_ascend_v011_select_moe_comm_method_wrapper vllm_ascend_v011_matmul_and_reduce_wrapper check_vllm_ascend_before_server_launch _is_ascend_soc_version_A2_v011_local _is_ascend_soc_version_A2_v013_local vllm_ascend_v013_select_moe_comm_method_wrapper vllm_ascend_v013_matmul_and_reduce_wrapper vllm_v013_weight_loader_method_wrapper patch_vllm013_rotary_emb

关键源码片段

verl/utils/vllm/npu_vllm_patch.py dependency-wiring

核心变更文件:删除了 165 行旧补丁代码,引入了新的 v0.13+ 权重加载包装器和旋转嵌入补丁,是本次清理的主体。

# 变更后的 npu_vllm_patch.py 保留内容(移除旧补丁后)
from functools import wraps
​
from verl.utils.device import is_torch_npu_available
​
​
def vllm_v013_weight_loader_method_wrapper(fn):
    '''针对 v0.13+ 的 FusedMoE 权重加载包装器,
    在加载前对权重矩阵进行转置以匹配 Ascend NPU 内存布局。'''
    @wraps(fn)
    def wrapper(self, param, loaded_weight, weight_name, shard_id, expert_id, return_success=False):
        # 判断是否需要对权重进行转置:expert 权重形状与 hidden_size 相关
        if (shard_id in ('w1', 'w3') and param.shape[1] == self.hidden_size) or (
            shard_id == 'w2' and param.shape[2] == self.hidden_size
        ):
            param.data = param.data.transpose(1, 2)
        return fn(self, param, loaded_weight, weight_name, shard_id, expert_id, return_success)
    return wrapper
​
​
def patch_vllm013_rotary_emb():
    '''对 v0.13+ 的打补丁:禁用 ApplyRotaryEmb 中的 flash_attn,
    因为 Ascend NPU 目前不支持该模式。'''
    from vllm.model_executor.layers.rotary_embedding.common import ApplyRotaryEmb
​
    def vllm013_npu_rotary_embedding_init_impl(
        self,
        enforce_enable: bool = False,
        is_neox_style: bool = True,
        enable_fp32_compute: bool = False,
    ) -> None:
        super(ApplyRotaryEmb, self).__init__()
        self.is_neox_style = is_neox_style
        self.enable_fp32_compute = enable_fp32_compute
        self.apply_rotary_emb_flash_attn = None # 禁用 flash_attn
​
    ApplyRotaryEmb.__init__ = vllm013_npu_rotary_embedding_init_impl
​
​
if is_torch_npu_available(check_device=False):
    import vllm
    from packaging import version
​
    _VLLM_VERSION = version.parse(vllm.__version__)
    # 对 v0.13 ~ v0.14 和 v0.18+ 分别打补丁
    if (_VLLM_VERSION >= version.parse('0.13.0') and _VLLM_VERSION <= version.parse('0.14.0')) or \
       (_VLLM_VERSION >= version.parse('0.18.0')):
        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)

评论区精华

删除 check_vllm_ascend_before_server_launch 导致 ImportError 正确性

Gemini Code Assist 机器人指出直接删除 check_vllm_ascend_before_server_launch 函数而未清理调用方会导致 vllm_async_server.py 在 NPU 环境下出现 ImportError,建议同步移除导入和调用。

结论:作者接受了反馈,在后续提交(fix import、fix ci)中移除了 vllm_async_server.py 中的相关代码,确保了无遗漏。 · 已解决

风险与影响

  • Ascend 兼容性风险:如果某些 Ascend 环境仍依赖旧版 vllm_ascend(<0.13),移除补丁可能导致 MoE 通信选择错误或显存优化失效。但 PR 上下文暗示团队已验证新版本不再需要。
  • Docker 一致性风险:移除 Megatron-Bridge 可能影响依赖该桥接库的 Megatron 训练流程;但 Dockerfile 中保留了 MindSpeed 和 Megatron-LM,推测已迁移到其他方案。
  • 遗漏引用风险:尽管已清理 vllm_async_server.py,仍需确认其他潜在引用(如 npu_vllm_patch.py 是否被其他地方直接导入)。
  • 用户影响:不再需要手动应用 Ascend 特定 MoE 补丁,代码更整洁;但需确保使用兼容的 vLLM 版本(≥0.13)。
  • 系统影响:Docker 镜像体积略有减小(移除一次 git clone),构建速度可能提升。
  • 团队影响:减少维护点,但需要确保所有 Ascend 训练场景(如单卡多进程 MC2)已在新版本中得到支持。
  • 影响程度:中等,主要影响 Ascend NPU 用户,其他不受影响。
Ascend 兼容性 依赖清理遗漏 Docker 一致性

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论