Prhub

#6494 [cfg] fix: align dataclass defaults with yaml

原始 PR 作者 anzhsoft 合并时间 2026-05-28 13:24 文件变更 4 提交数 1 评论 2 代码增减 +5 / -5

执行摘要

对齐 Python dataclass 默认值与 YAML 配置

Issue #6479 指出多处 Python dataclass 默认值与 YAML 配置不一致,导致直接实例化 config 时行为与 Hydra 加载不同,尤其 RewardModelConfig.n_gpus_per_node=0 会引发奖励模型资源池分配失败。PR body 明确表示:'This keeps direct config instantiation consistent with the normal training entrypoint and avoids zero-sized reward model resource pools.'

推荐阅读:变更直白,但 Issue 中对配置不一致的系统性分析值得关注,可作为后续配置治理的参考。建议合并。

讨论亮点

核心讨论围绕测试文件必要性:reviewer wuxibin89 认为该测试太琐碎('This test is too trivial and not necessary'),作者 anzhsoft 接受建议移除了测试文件。无其他设计争议。

实现拆解

  1. rollout.py: 将 enforce_eager 默认值从 True 改为 Falseskip_tokenizer_initFalse 改为 True,对应 YAML 中的设置。
  2. actor.py: 将 data_loader_seed 默认值从 1 改为 42
  3. critic.py: 将 data_loader_seed 默认值从 1 改为 42
  4. reward.py: 将 n_gpus_per_node 默认值从 0 改为 8,修复资源池大小为 0 的严重 bug。
  5. 测试文件(初始版本):添加 tests/workers/config/test_config_defaults_on_cpu.py 验证默认值,但后续被 reviewer 认为过于简单而移除。
文件 模块 状态 重要度
verl/workers/config/rollout.py 配置 modified 5.07
verl/workers/config/actor.py 配置 modified 4.89
verl/workers/config/critic.py 配置 modified 4.89
verl/workers/config/reward.py 配置 modified 5.29

关键源码片段

verl/workers/config/rollout.py core-logic

对齐 enforce_eager 和 skip_tokenizer_init 的默认值

@dataclass
class RolloutConfig(BaseConfig):
    # ... (other fields)
​
    # Align with YAML default: enforce_eager = False
    # 之前为 True,与 verl/trainer/config/rollout/rollout.yaml 不一致
    enforce_eager: bool = False
​
    # ...
​
    # Align with YAML default: skip_tokenizer_init = True
    # 之前为 False,与 YAML 不一致
    skip_tokenizer_init: bool = True
​
    # 其余字段不变
verl/workers/config/actor.py core-logic

对齐 data_loader_seed 默认值

@dataclass
class ActorConfig(BaseConfig):
    # ... (other fields)
​
    # Align with YAML default: data_loader_seed = 42
    # 之前为 1,与 YAML 不一致
    data_loader_seed: int = 42
​
    # 其余字段不变
verl/workers/config/reward.py core-logic

对齐 n_gpus_per_node 默认值,修复零资源池 bug

@dataclass
class RewardModelConfig(BaseConfig):
    _mutable_fields = BaseConfig._mutable_fields
​
    enable: bool = False
    enable_resource_pool: bool = False
    # Align with YAML default: n_gpus_per_node = 8
    # 之前为 0,导致奖励模型资源池大小为 0,无法正常工作(严重 bug)
    n_gpus_per_node: int = 8
    nnodes: int = 0
    model_path: Optional[str] = None
    rollout: RolloutConfig = field(default_factory=RolloutConfig)

评论区精华

测试文件必要性 测试

reviewer wuxibin89 认为新增的测试文件 test_config_defaults_on_cpu.py 太琐碎,不必要。

结论:作者接受建议,移除了测试文件。 · 已解决

风险与影响

风险极低:

  • 仅修改了 5 个整型/布尔型默认值,且与已有 YAML 保持一致。
  • 这些默认值在 Hydra 加载路径下已经生效,仅影响直接 dataclass 实例化的场景。
  • 没有引用这些字段的代码需要修改,不存在回归风险。

用户影响:任何直接使用 ActorConfig()CriticConfig()RolloutConfig()RewardModelConfig() 而非通过 Hydra YAML 加载的代码现在会获得与 YAML 相同的默认值。对普通用户透明。
系统影响:修复了 RewardModelConfig.n_gpus_per_node=0 导致奖励模型 worker pool 为 0 的 bug(Issue 中描述为 'particularly severe')。
团队影响:减少配置不一致导致的测试和集成问题。

关联 Issue

#6479 [Bug] Multiple config default value mismatches between YAML and Python dataclasses (`enforce_eager`, `data_loader_seed`, `n_gpus_per_node`)

完整报告

参与讨论