Prhub

#6135 [megatron] fix: the NPU error that occurs after migrating from megatron worker to engine worker.

原始 PR 作者 xiazhahe 合并时间 2026-05-11 15:46 文件变更 4 提交数 5 评论 10 代码增减 +41 / -15

执行摘要

为 NPU MindSpeed 引擎添加 value_model 支持以修复设备识别错误

PR 描述指出:从 megatron worker 迁移到 engine worker 后,不再有 Critic worker,导致 NPU 上出现错误:AssertionError: Unknown device: npu for model_type: value_model and backend: megatron。需要为 value_model 注册对应的 MindSpeed 引擎实现。

此 PR 值得精读,尤其是 EngineRegistry 的注册机制和通过共享函数消除重复代码的手法。对于在 Ascend NPU 上使用价值模型的用户,这是必要的修复。建议合入后补充相关测试。

讨论亮点
  • 冗余导入问题:gemini-code-assist[bot] 指出在 engine_workers.py 中尝试导入 repatch 是多余的,因为具体引擎实现中已包含。作者确认已删除。
  • 代码重复建议:gemini-code-assist[bot] 建议将重复的 _init_device_mesh 逻辑提取为共享函数,最终被采纳,创建了 _mindspeed_repatch。
  • 兼容性担忧:ji-huazhong 担心 MindSpeed 补丁可能影响 VeOmni 等其他 NPU 后端。wucong25 回应称通过 EngineRegistry 的注册机制,类会根据设备名称自动选择,不会产生冲突。

实现拆解

  1. 提取公共补丁函数:在 verl/workers/engine/mindspeed/transformer_impl.py 中创建独立函数 _mindspeed_repatch,包含原有的 MindSpeed repatch 配置和调用逻辑,供后续复用。
  2. 新增 ValueModel 引擎:在同一文件中添加 MindspeedEngineWithValueHead 类,继承自 MegatronEngineWithValueHead,通过 @EngineRegistry.register(model_type="value_model", backend="megatron", device="npu") 注册。其 _init_device_mesh 复用 _mindspeed_repatch 函数。
  3. 更新模块导出:修改 verl/workers/engine/__init__.py、verl/workers/engine/megatron/__init__.py 和 verl/workers/engine/mindspeed/__init__.py,在导入列表和 __all__ 中增加 MindspeedEngineWithValueHead 和 MegatronEngineWithValueHead,确保引擎工厂能够加载它们。
文件 模块 状态 重要度
verl/workers/engine/mindspeed/transformer_impl.py 引擎层 modified 8.37
verl/workers/engine/__init__.py 引擎注册 modified 6.13
verl/workers/engine/megatron/__init__.py 引擎注册 modified 5.74
verl/workers/engine/mindspeed/__init__.py 引擎注册 modified 5.74

关键符号

_mindspeed_repatch MindspeedEngineWithValueHead.__init__ MindspeedEngineWithValueHead._init_device_mesh

关键源码片段

verl/workers/engine/mindspeed/transformer_impl.py core-logic

核心变更文件:提取 `_mindspeed_repatch` 函数,新增 `MindspeedEngineWithValueHead` 类并注册为 value_model,修复了设备识别错误。

# 统一的 MindSpeed 补丁函数,在设备网格初始化前执行
def _mindspeed_repatch(engine_config):
    if repatch is not None:
        repatch_config = dict(engine_config.get("override_transformer_config", {}))
        repatch_config.setdefault("use_flash_attn", True)
        if engine_config.context_parallel_size > 1:
            repatch_config["context_parallel_size"] = engine_config.context_parallel_size
        repatch(repatch_config)
​
​
@EngineRegistry.register(model_type="language_model", backend="megatron", device="npu")
class MindspeedEngineWithLMHead(MegatronEngineWithLMHead):
    # 继承自 LM head 引擎,仅覆写 _init_device_mesh 以调用统一的补丁
    def _init_device_mesh(self):
        _mindspeed_repatch(self.engine_config)
        super()._init_device_mesh()
​
​
@EngineRegistry.register(model_type="value_model", backend="megatron", device="npu")
class MindspeedEngineWithValueHead(MegatronEngineWithValueHead):
    # 新增:为价值模型(Critic)提供 MindSpeed 引擎支持
    def __init__(self, model_config, engine_config, optimizer_config, checkpoint_config):
        super().__init__(model_config, engine_config, optimizer_config, checkpoint_config)
​
    def _init_device_mesh(self):
        # 复用统一的 MindSpeed 补丁逻辑
        _mindspeed_repatch(self.engine_config)
        super()._init_device_mesh()

评论区精华

engine_workers.py 中的冗余 repatch 导入 other

gemini-code-assist[bot] 指出在 engine_workers.py 中导入 repatch 是多余的,因为具体引擎实现已包含。作者 xiazhahe 回复 "Already deleted"。

结论:该导入被删除,最终版本未包含。 · 已解决

_init_device_mesh 逻辑重复与重构建议 设计

gemini-code-assist[bot] 建议将相同的 patching 逻辑提取为共享函数,避免在两个类中重复。

结论:被采纳,创建了 _mindspeed_repatch 函数,两个子类均调用它。 · 已解决

MindSpeed 补丁对 VeOmni 兼容性的影响 设计

ji-huazhong 担心全局补丁可能破坏 VeOmni 功能。wucong25 解释通过 EngineRegistry 的设备标签选择,不会冲突。

结论:认为无兼容性问题,未采取额外措施。 · 已解决

风险与影响

  • 缺少测试覆盖:未包含针对新 value_model 引擎的单元或集成测试,可能遗漏初始化或推理路径中的错误。
  • 依赖 MindSpeed 包:新增的 MindspeedEngineWithValueHead 依赖 mindspeed.megatron_adaptor,若环境未安装该包,价值模型训练将回退失败。但已有 try-except 保护导入,不会崩溃。
  • 回归风险低:提取的函数逻辑与原代码一致,且原有 MindspeedEngineWithLMHead 行为不变。
  • 用户影响:修复了 Ascend NPU 上使用 Megatron 后端训练 GRPO/PPO 时价值模型不可用的问题,用户无需额外配置即可正常启动训练。
  • 系统影响:仅影响 NPU 设备上 model_type=value_model 的引擎选择,对其他设备(CUDA、VeOmni)和模型类型无影响。
  • 团队影响:为后续引擎迁移(如:支持更多模型类型)提供了可参考的扩展模式。
缺少测试覆盖 依赖 MindSpeed 包

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论