Prhub

#6067 [BREAKING] [misc] refactor: deprecate workers, migrate to engines

原始 PR 作者 ETOgaosion 合并时间 2026-04-20 21:00 文件变更 91 提交数 4 评论 7 代码增减 +755 / -7751

执行摘要

废弃并删除整个 workers 模块,迁移至统一的模型引擎抽象。

根据 PR body 描述,本次变更的核心动机是“减少维护负担,并促进模型引擎抽象和 verl 的 RL 库转型”。这表明项目正在进行架构演进,旨在用更统一的模型引擎抽象(如 TrainingWorker 和 ActorRolloutRefWorker)替代分散且复杂的传统 worker 实现,以简化代码库并提升可维护性。

该 PR 是理解项目架构演进的关键材料,值得技术管理者和核心工程师精读。重点关注:

  1. 设计决策:从分散的 worker 实现到统一引擎抽象的迁移策略,反映了项目在简化复杂性和提升模块化方面的思考。
  2. 集成模式ray_trainer.py 中如何适配新引擎,特别是远程调用和错误处理模式,是分布式训练集成的典型案例。
  3. 破坏性变更管理:通过 @deprecated 装饰器和版本计划(v0.8.0)平滑过渡,展示了大型项目重构的最佳实践。
讨论亮点

review 讨论主要集中在 verl/trainer/ppo/ray_trainer.py 中与新的统一模型引擎集成的正确性问题上。

  • 关键问题gemini-code-assist[bot] 指出,在 _compute_ref_log_prob 方法中,当使用新引擎且参考策略与 ActorRolloutRefWorker 融合时,self.ref_policy_wg 可能为 None,导致逻辑错误。建议回退到 self.actor_rollout_wg
  • 远程调用处理:同一评论者多次强调,对 Ray worker 的远程调用结果(如 output)必须使用 .get() 收集后才能访问其内容,否则会在后续操作中引发错误。这涉及 _compute_values_compute_ref_log_prob_update_actor 方法。
  • 结论:这些评论旨在修复集成漏洞,确保新引擎路径下的功能正确性。从提交历史看,作者通过多个提交逐步清理和修复,最终 PR 被合并,表明问题已得到解决。

实现拆解

  1. 删除核心 worker 实现文件:移除了 verl/workers/ 目录下的所有核心源码文件,包括 fsdp_workers.pymegatron_workers.py 以及 Actor/Critic 的具体实现(如 dp_actor.pymegatron_actor.pydp_critic.pymegatron_critic.py)。这些文件包含了 DataParallelPPOActorMegatronPPOActorDataParallelPPOCriticMegatronPPOCritic 等关键类,它们负责 PPO 算法中策略和价值网络的前向计算、损失计算和参数更新。
  2. 更新训练器逻辑以适配新引擎:修改了 verl/trainer/ppo/ray_trainer.py 等训练器文件,移除对 use_legacy_worker_impl 标志的依赖,并调整了 _compute_values_compute_ref_log_prob_update_actor 等方法,使其直接调用新的统一模型引擎(如 ActorRolloutRefWorker)进行远程计算。
  3. 清理配置和依赖:移除了与 legacy worker 相关的配置项(如 use_legacy_worker_impl),并更新了导入路径,确保代码库不再引用已删除的模块。
  4. 同步更新测试和文档:删除了与 workers 模块相关的测试文件(如 tests/workers/test_fsdp_attn_implementation.py)和文档(如 docs/workers/ 下的内容),确保测试套件和文档与新的架构保持一致。
  5. 处理特殊模块的例外情况:根据 Issue 评论中的指示,保留了 verl/experimental/vla 模块,因为它计划迁移到独立仓库,避免了不必要的影响。
文件 模块 状态 重要度
verl/workers/fsdp_workers.py FSDP Worker removed 9.08
verl/workers/megatron_workers.py Megatron Worker removed 9.08
verl/trainer/ppo/ray_trainer.py PPO 训练器 modified 7.44
verl/workers/actor/dp_actor.py Actor 实现 removed 8.98
tests/workers/test_fsdp_attn_implementation.py Worker 测试 removed 7.49

关键符号

DataParallelPPOActor MegatronPPOActor DataParallelPPOCritic MegatronPPOCritic _compute_values _compute_ref_log_prob _update_actor

关键源码片段

verl/trainer/ppo/ray_trainer.py core-logic

这是 PPO 训练器的主入口文件,负责协调 worker 进行价值计算、参考策略概率计算和策略更新。本次变更移除了 legacy worker 实现路径,集成了新的统一模型引擎,是架构迁移的关键集成点。

def _compute_ref_log_prob(self, batch: DataProto) -> DataProto:
    """计算参考策略的对数概率,适配新的统一模型引擎。"""
    # 根据配置决定使用哪个 worker group
    if self.config.ref_in_actor:
        wg = self.actor_rollout_wg # 当参考策略与 Actor 融合时
    else:
        # 关键修复:当使用新引擎且参考策略在 ActorRolloutRefWorker 中时,ref_policy_wg 可能为 None
        wg = self.ref_policy_wg if self.ref_policy_wg is not None else self.actor_rollout_wg
​
    # 远程调用 worker group 进行计算
    output = wg.compute_ref_log_prob(batch)
    # 关键修复:必须使用 .get() 收集远程结果,否则后续访问会出错
    output = output.get() # 收集 RayDataProto 的实际内容
​
    # 从输出中提取对数概率数据
    log_prob = tu.get(output, "log_prob")
    batch.batch["ref_log_prob"] = log_prob
    return batch

评论区精华

新引擎集成中的 worker group 回退逻辑 正确性

gemini-code-assist[bot] 指出,在 _compute_ref_log_prob 方法中,当使用新引擎且参考策略与 ActorRolloutRefWorker 融合时,self.ref_policy_wg 可能为 None,导致逻辑错误。

结论:建议回退到 self.actor_rollout_wg,确保在新引擎路径下能正确选择 worker group。 · 已解决

远程调用结果收集缺失 正确性

gemini-code-assist[bot] 多次强调,对 Ray worker 的远程调用结果(如 output)必须使用 .get() 收集后才能访问其内容,否则会在后续操作中引发错误。

结论:在 _compute_values、_compute_ref_log_prob 和 _update_actor 方法中添加了 .get() 调用,确保数据正确收集。 · 已解决

风险与影响

  1. 回归风险:删除大量核心 worker 代码(如 DataParallelPPOActorMegatronPPOCritic)会直接影响所有依赖这些类的训练流程(特别是 FSDP 和 Megatron 后端)。如果新的统一引擎存在未覆盖的边缘情况或性能差异,可能导致训练失败或结果不一致。
  2. 集成风险:训练器(ray_trainer.py)中的逻辑调整,特别是远程调用结果未正确收集(如缺少 .get())和 worker group 回退逻辑,可能引发运行时错误或数据丢失。
  3. 兼容性风险:这是一个 BREAKING CHANGE,彻底移除了旧的 worker API,任何直接调用 verl.workers 模块的第三方代码或脚本将无法工作,需要迁移到新的引擎抽象。
  4. 测试覆盖风险:虽然删除了旧的测试文件,但新引擎的测试覆盖是否充分尚不确定,可能隐藏未发现的缺陷。
  1. 对用户的影响:所有使用传统 worker 实现进行 PPO 训练的用户必须迁移到新的模型引擎抽象(如 TrainingWorkerActorRolloutRefWorker)。这涉及更新配置、脚本和可能的自定义代码,迁移成本较高。
  2. 对系统的影响:简化了代码库结构,减少了维护负担,但短期内可能因新引擎的成熟度问题引入稳定性风险。统一抽象有望提升长期的可扩展性和一致性。
  3. 对团队的影响:标志着架构方向的重大转变,团队需要熟悉新的引擎 API 并更新相关文档和培训材料。
核心路径变更 破坏性 API 变更 集成风险 测试覆盖调整

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论