# PR #6494 完整报告

- 仓库：`verl-project/verl`
- 标题：[cfg] fix: align dataclass defaults with yaml
- 合并时间：2026-05-28 13:24
- 原文链接：http://prhub.com.cn/verl-project/verl/pull/6494

---

# 执行摘要

- 一句话：对齐 Python dataclass 默认值与 YAML 配置
- 推荐动作：推荐阅读：变更直白，但 Issue 中对配置不一致的系统性分析值得关注，可作为后续配置治理的参考。建议合并。

# 功能与动机

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.'

# 实现拆解

1. **rollout.py**: 将 `enforce_eager` 默认值从 `True` 改为 `False`，`skip_tokenizer_init` 从 `False` 改为 `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`（模块 配置；类别 source；类型 core-logic；符号 RolloutConfig）: 对齐 enforce_eager 和 skip_tokenizer_init 的默认值
- `verl/workers/config/actor.py`（模块 配置；类别 source；类型 core-logic；符号 ActorConfig）: 对齐 data_loader_seed 默认值
- `verl/workers/config/critic.py`（模块 配置；类别 source；类型 core-logic；符号 CriticConfig）: 对齐 data_loader_seed 默认值
- `verl/workers/config/reward.py`（模块 配置；类别 source；类型 core-logic；符号 RewardModelConfig）: 对齐 n_gpus_per_node 默认值，修复零资源池 bug

关键符号：未识别

## 关键源码片段

### `verl/workers/config/rollout.py`

对齐 enforce_eager 和 skip_tokenizer_init 的默认值

```python
@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`

对齐 data_loader_seed 默认值

```python
@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`

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

```python
@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 认为该测试太琐碎（'This test is too trivial and not necessary'），作者 anzhsoft 接受建议移除了测试文件。无其他设计争议。

- 测试文件必要性 (testing): 作者接受建议，移除了测试文件。

# 风险与影响

- 风险：风险极低：
 - 仅修改了 5 个整型 / 布尔型默认值，且与已有 YAML 保持一致。
 - 这些默认值在 Hydra 加载路径下已经生效，仅影响直接 dataclass 实例化的场景。
 - 没有引用这些字段的代码需要修改，不存在回归风险。
 - 影响：**用户影响**：任何直接使用 `ActorConfig()`、`CriticConfig()`、`RolloutConfig()`、`RewardModelConfig()` 而非通过 Hydra YAML 加载的代码现在会获得与 YAML 相同的默认值。对普通用户透明。
**系统影响**：修复了 `RewardModelConfig.n_gpus_per_node=0` 导致奖励模型 worker pool 为 0 的 bug（Issue 中描述为 'particularly severe'）。
**团队影响**：减少配置不一致导致的测试和集成问题。

- 风险标记：暂无

# 关联脉络

- 暂无明显关联 PR