# PR #6550 完整报告

- 仓库：`verl-project/verl`
- 标题：[ci] fix: FSDP actor/critic ci fail
- 合并时间：2026-06-01 11:02
- 原文链接：http://prhub.com.cn/verl-project/verl/pull/6550

---

# 执行摘要

- 一句话：FSDP actor/critic CI 配置校验修复
- 推荐动作：该 PR 改动极小且直接，可快速合入以修复 CI。但 review 中提出的 `model_config` 类型兼容性问题值得在后续迭代中修复，以增强鲁棒性。

# 功能与动机

CI 中 FSDP actor/critic 的测试用例因缺少 use_remove_padding 校验而失败，需要提前捕获无效配置，避免运行时出现预期之外的错误。

# 实现拆解

1. 在 `verl/workers/config/actor.py` 的 `ActorConfig.validate()` 方法末尾插入一段条件判断：当 `ulysses_sequence_parallel_size > 1` 且 `model_config` 不为空且 `model_config.get("use_remove_padding", False)` 为 `False` 时，抛出 `ValueError`。
2. 该校验逻辑位于 `super().validate()` 调用之后，确保父类校验先执行。
3. 无其他文件修改。

关键文件：
- `verl/workers/config/actor.py`（模块 配置层；类别 source；类型 core-logic；符号 ActorConfig.validate）: 唯一修改的文件，在 ActorConfig.validate() 方法中新增了针对 ulysses_sequence_parallel_size 与 use_remove_padding 一致性的校验逻辑，直接修复 CI 失败原因。

关键符号：ActorConfig.validate

## 关键源码片段

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

唯一修改的文件，在 ActorConfig.validate() 方法中新增了针对 ulysses_sequence_parallel_size 与 use_remove_padding 一致性的校验逻辑，直接修复 CI 失败原因。

```python
# verl/workers/config/actor.py
# ActorConfig 的 validate 方法末尾新增校验：
# 当使用序列并行 (ulysses_sequence_parallel_size > 1) 时，
# 必须启用 use_remove_padding，否则抛出 ValueError
class ActorConfig(FSDPActorConfig, Role):
    # ...
    def validate(self, n_gpus: int, train_batch_size: int, model_config: dict = None):
        """Validate FSDP actor configuration with runtime parameters."""
        super().validate(n_gpus, train_batch_size, model_config)
        # 注意：此处直接调用 .get() 假设 model_config 是 dict-like 对象；
        # 若 model_config 是 dataclass 实例（如 HFModelConfig），
        # 则 .get() 会引发 AttributeError，可考虑使用 getattr 增强健壮性。
        if (
            self.ulysses_sequence_parallel_size > 1
            and model_config
            and not model_config.get("use_remove_padding", False)
        ):
            raise ValueError(
                "When using sequence parallelism for actor/ref policy, "
                "you must enable `use_remove_padding`."
            )
# 此校验旨在避免 FSDP CI 因配置不匹配而失败，提前暴露问题。

```

# 评论区精华

讨论中 `gemini-code-assist[bot]` 指出：`model_config` 可能是 `HFModelConfig` 等 dataclass 实例而非字典，直接调用 `.get()` 会引发 `AttributeError`。建议改用 `getattr()` 或先检查 `hasattr(model_config, "get")` 进行安全访问。但最终合并的代码未采纳该建议，保留了原始的 `.get()` 调用。

- model_config 类型兼容性 (correctness): 未采纳建议，合并代码保留了 .get() 调用。可能因为实际使用场景中 model_config 均为字典或 DictConfig。

# 风险与影响

- 风险：低风险。新增校验仅在配置不合法时抛出异常，不会影响正常运行路径。但存在一个未修复的潜在风险：若 `model_config` 是 dataclass 对象（如 `HFModelConfig`），当前代码会因 `AttributeError` 崩溃而非正确提示用户。不过实际调用中 `model_config` 通常为字典或 DictConfig，此风险较低。
- 影响：直接影响：仅影响使用 FSDP 策略且开启序列并行（ulysses_sequence_parallel_size > 1）的 actor 配置。此类用户若未设置 `use_remove_padding=True`，训练将在启动前抛出明确的 ValueError，从而避免运行时难以定位的问题。对其他策略（如 VeOmni）无影响。
- 风险标记：未修复的 model_config 类型兼容性问题

# 关联脉络

- PR #6502 [fsdp] fix: add sp and use_remove_padding validation for SFT and RL in fsdp engine: 该 PR 在 FSDPEngine 中添加了 SP 与 use_remove_padding 的校验，本 PR 在 ActorConfig 层面补充了类似校验，两者构成互补。
- PR #6494 [cfg] fix: align dataclass defaults with yaml: 该 PR 对齐了配置项默认值，本 PR 的校验依赖这些配置项的正确性，可视为配置健壮性改进的延续。