Prhub

#7049 [trainer, perf] fix: include standalone rollout GPUs in throughput denominator for separate async

原始 PR 作者 mikequan0425 合并时间 2026-07-20 11:33 文件变更 2 提交数 2 评论 1 代码增减 +23 / -1

执行摘要

修正分离异步模式吞吐量 GPU 计数

PR body 指出:In separate-async mode, the standalone rollout runs on dedicated GPUs that are not part of the trainer resource pool. However, compute_throughout_metrics used resource_pool_manager.get_n_gpus() as the denominator, which only counts trainer-side GPUs. This caused perf/throughput to be inflated in separate-async mode, making it incomparable with sync and colocate-async modes.

建议合入。逻辑清晰,修改量小,且修复了明确的数据错误。值得关注的是通过模板方法模式(基类默认 + 子类重写)分离关注点,是平滑扩展的良好实践。未来其他异步模式如有类似需求,也应遵循此模式。

讨论亮点

无人工审核评论。审核者 wuxibin89 已批准。仅 gemini-code-assist[bot] 自动评论总结代码变更,未提出具体问题。

实现拆解

  1. 基类 trainer_base.py 新增 _get_n_gpus_for_throughput 方法:该方法返回 resource_pool_manager.get_n_gpus()(即 trainer 端 GPU 数),作为默认实现;同时将 _compute_metrics 中原本直接调用 self.resource_pool_manager.get_n_gpus() 的位置替换为调用 self._get_n_gpus_for_throughput(),使后续子类重写生效。
  2. 分离异步 trainer trainer_separate_async.py 重写 _get_n_gpus_for_throughput 方法:重写后返回 trainer_gpus + rollout_gpus,其中 rollout GPU 数通过配置项 actor_rollout_ref.rollout.n_gpus_per_node * actor_rollout_ref.rollout.nnodes 计算得到。
  3. 测试配套:本次改动未新增直接对应的测试文件。由于变更集中在指标计算逻辑,属于内部重构,对功能无影响,可能依赖现有 CI 覆盖。
文件 模块 状态 重要度
verl/trainer/ppo/v1/trainer_base.py 训练器 modified 6.17
verl/trainer/ppo/v1/trainer_separate_async.py 训练器 modified 6.51

关键符号

_get_n_gpus_for_throughput

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

低风险。变更范围有限,仅新增一个方法并修改一处调用点。需要确保所有子类中,如果存在其他使用 resource_pool_manager.get_n_gpus() 的吞吐量计算路径,也已通过此方法统一;经检查,_compute_metrics 中已有唯一入口。风险点在于:若将来有其他子类未及时重写 _get_n_gpus_for_throughput,其吞吐量分母可能不准确(但默认行为与之前一致,无回归)。

直接影响分离异步模式下吞吐量(throughput)指标的计算结果,使其更准确,并与同步/同址异步模式可比。对同步和同址异步模式无影响。用户无需修改配置,变更透明。

低风险 无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论