Prhub

#6502 [fsdp] fix: add sp and use_remove_padding validation for SFT and RL in fsdp engine

原始 PR 作者 fisherxu 合并时间 2026-05-27 20:05 文件变更 3 提交数 1 评论 1 代码增减 +6 / -13

执行摘要

集中 SP 与 use_remove_padding 校验至 FSDP 引擎

在 FSDP 引擎中,当启用 Ulysses 序列并行(ulysses_sequence_parallel_size > 1)时必须同时启用 use_remove_padding。此前该限制校验只在 FSDPActorConfig.validate() 和 FSDPCriticConfig.post_init() 中存在,而这两个类属于 RL 专用配置包装器;SFT 训练器直接使用 FSDPEngineConfig,完全绕过了这些包装器,导致 SFT 场景完全缺失校验,错误配置下会静默失败或出现难以定位的运行时异常。

值得快速合并。这是一个低风险、高收益的 bugfix,消除了 SFT 场景的校验盲区。关注点:需确认 SFT 相关文档和示例配置中是否已默认设置 use_remove_padding=True 以配合序列并行。

讨论亮点

无实质性讨论。仅包含 gemini-code-assist[bot] 的自动摘要评论,wuxibin89 直接批准。

实现拆解

  1. verl/workers/engine/fsdp/transformer_impl.py 的 FSDPEngine.init() 中,设置了 self.use_remove_padding 之后立即检查:若 ulysses_sequence_parallel_size > 1use_remove_padding 未开启,则抛出 ValueError。
  2. verl/workers/config/actor.py 的 FSDPActorConfig.validate() 中删除了之前相同的校验逻辑。
  3. verl/workers/config/critic.py 的 FSDPCriticConfig.post_init() 中删除了之前相同的校验逻辑。
  4. 所有改动仅涉及校验逻辑的迁移,无新增依赖或功能变化。
文件 模块 状态 重要度
verl/workers/engine/fsdp/transformer_impl.py FSDP 引擎 modified 6.25
verl/workers/config/actor.py 配置 modified 5.35
verl/workers/config/critic.py 配置 modified 5.4

关键符号

FSDPEngine.__init__ FSDPActorConfig.validate FSDPCriticConfig.__post_init__

关键源码片段

verl/workers/engine/fsdp/transformer_impl.py core-logic

添加核心校验逻辑,确保 SFT 和 RL 路径均被覆盖。

# verl/workers/engine/fsdp/transformer_impl.py (FSDPEngine.__init__)self.use_remove_padding = self.model_config.use_remove_padding# 校验:使用 Ulysses 序列并行时必须启用 use_remove_padding
# 该校验之前仅在 RL 配置类中存在,SFT 路径缺失,导致静默失败
if self.engine_config.ulysses_sequence_parallel_size > 1 and not self.use_remove_padding:
    raise ValueError(
        "When using sequence parallelism (ulysses_sequence_parallel_size > 1), "
        "you must enable `use_remove_padding`."
    )

评论区精华

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

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

风险与影响

风险较低。校验逻辑从配置层迁移至引擎层,对 RL 路径无影响(之前已覆盖),对 SFT 路径新增了必要校验。潜在风险:若存在某些合法场景需要 ulysses_sequence_parallel_size > 1 但 use_remove_padding=False(理论上不兼容),现在会被拦截;但根据设计文档,该组合不应存在。

影响范围:所有使用 FSDP 引擎的 SFT 训练任务。若之前 SFT 配置中意外设置 ulysses_sequence_parallel_size > 1 但未设置 use_remove_padding=True,训练将不再静默失败,而是抛出明确的 ValueError。RL 训练行为不变。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论