Verl 项目周报:2026 年第 17 周(04/20 - 04/26)
执行摘要
本周(04/20-04/26)Verl 项目迎来重大架构调整,两个 Breaking PR 正式废弃了 workers 和 interactions 模块,全面向统一的模型引擎抽象迁移。同时,多教师在线策略蒸馏(OPD)功能落地,VeOmni 和 ROCm/NPU 平台兼容性显著提升。模型支持方面新增 Qwen3.5 MTP 与 VeOmni Qwen3.5 SP。异步训练的多项性能与正确性修复合入,工程质量持续改善,但测试覆盖和部分边缘风险仍需关注。
本周重点变化
-
架构重构:废弃 workers 与 interactions 模块
- PR #6067 删除了整个 verl/workers 目录(FSDP/Megatron Actor/Critic 等),并迁移至 verl/workers/engine 下的统一引擎抽象;PR #6074 同时废弃了 verl/interactions 模块,将环境主动控制交互的能力交给智能体自主决策。这两项破坏性变更标志着 Verl 从分散的 worker 实现向引擎驱动架构的关键转折,简化了维护路径,但需要所有上层代码适配新接口。
-
多教师蒸馏(Multi-Teacher OPD)上线
- PR #6051 新增 MultiTeacherModelManager,支持基于路由键的样本分发和多教师资源池管理。配置层扩展为字典结构,允许指定多个教师模型及其副本数。该功能在 GSM8K 和 Geo3K 数据集上完成验证,为蒸馏场景提供了更灵活的配置能力。
-
跨平台兼容性进展
- AMD ROCm(#6062):修复 ZMQ IPC 句柄不匹配、JSON 序列化错误和套接字残留问题,完全异步训练可在 MI300X 上运行。
- Ascend NPU(#5967, #6102):通过延迟加载策略处理器修复 MindSpeed 补丁应用顺序问题;升级 Docker 构建流水线支持 CANN 8.5.0 环境变量,并切换 CI 机器至 A3 系列。
-
模型支持扩展
- 新增 Qwen3.5 MTP(多令牌预测)模型在 Megatron 引擎的 SFT/RL 训练(#5898)。
- VeOmni 引擎新增 Qwen3.5 系列支持,包括 MoE 变体,并提供了 GRPO 训练示例(#6061)。
-
异步训练性能与正确性修复
- 修复 drain loop 因 Condition 阻塞导致样本分发延迟的问题(#6090),通过 Event 信号机制允许提前中断。
- 修复参数卸载场景下 Megatron 模型保存/恢复的空指针问题(#6095)。
- 将完全异步训练器中同步 Ray 调用替换为异步版本,消除事件循环阻塞(#6052)。
-
工程质量改进
- 工具调用错误信息拆分(#6055):从统一 except 改为分阶段细粒度反馈,提升 LLM agent 自校正能力。
- 修复 KL 惩罚函数中带 '+' 后缀估计器的调度 bug(#6058)。
- 修复等长序列嵌套张量布局损坏问题(#6127)。
模块与主题趋势
- 模型引擎统一化:本周的两大 Breaking PR 是架构长期演进的结果,未来新功能将直接基于
engine 抽象开发,避免 worker 和 engine 双轨维护。训练器(如 ray_trainer.py)已开始适配新引擎,但仍有 _compute_ref_log_prob 等方法中的 worker group 回退逻辑需要完善。
- 异步训练成熟化:完全异步训练(fully_async)是本周最活跃的标签之一(8 个 PR),既有性能优化(drain loop、Ray 调用异步化),也有平台适配(ROCm、NPU)和正确性修复(offload 保存、profiler 初始化)。表明该项目正在加速推进异步训练的生产化。
- 在线蒸馏探索:多教师 OPD 和 VeOmni 蒸馏支持(#6072)的出现,表明蒸馏场景正在从单一教师向多教师、多引擎方向扩展。配置复杂度和节点对齐是主要挑战。
- 平台生态扩展:ROCm 和 NPU 的兼容性修复频繁,表明 Verl 正积极适配非 NVIDIA 硬件,构建更广泛的训练生态。NPU 的 CI 流水线升级(矩阵构建、CANN 版本更新)进一步巩固了持续集成能力。
- 测试覆盖仍需加强:虽然新增了 TRT-LLM 跨节点测试和 KL 惩罚回归测试,但多个高风险修复(如 drain loop、ROCm 兼容)仍缺少独立的单元测试,存在
top_risks 中“缺少测试覆盖”的高频出现。
风险观察
- 核心路径变更风险:废弃 workers/interactions 模块及 drain loop 重构涉及多处核心逻辑,可能引发旧代码兼容性或新集成路径的回归。建议在合并后加速推进内部依赖迁移,并增加集成测试。
- 测试覆盖不足的修复:ROCm 兼容性(#6062)、drain loop(#6090)和 offload 保存(#6095)等修复均被标记为“缺少测试覆盖”,一旦触发边缘场景(如多用户环境残留套接字、CPU 存储天然为空),可能导致难以诊断的训练失败。
- finally 块异常掩盖风险:PR #6055 中
_call_tool 的 finally 块内 tool.release() 可能抛出异常,掩盖原始错误。虽当前 release 方法简单,但未来扩展时需警惕。
- 硬断言可能生产崩溃:蒸馏 logprob 提取函数(#6120)中的断言假设 SGLang 返回 logprob 数量与 token 数一致,但若不一致则 worker 直接崩溃。建议改为防御性填充。
- 配置兼容性风险:Qwen3.5 MTP(#5898)中配置转换逻辑可能忽略用户覆盖参数,需关注混合配置场景的正确性。
重点 PR 速览
- #6067 [BREAKING] 废弃 workers 模块:删除 FSDP/Megatron Actor、Critic 等关键类,训练器适配新引擎。是本周最重要的架构变更,影响所有下游。
- #6051 多教师 OPD:引入路由键和资源池管理,配置层重构为字典,支持灵活的蒸馏拓扑。合并前移除了冗余路由进程,提升了资源利用率。
- #6062 ROCm 兼容性修复:通过添加 HSA 环境变量、修复 JSON 序列化(
default=str)和 ZMQ IPC 句柄重构,使完全异步训练在 AMD MI300X 上可用。采纳了 IPC 清理的 OSError 捕获建议。
- #5898 Qwen3.5 MTP 支持:新增 MTP 层数查询/设置函数和示例脚本,为后续多令牌预测训练铺路。review 建议将辅助函数公开化但未采纳,需注意代码复用。
- #6090 drain loop 性能优化:将 Condition 替换为 Event,允许参数同步中断 drain 循环,避免空闲副本等待。但因锁粒度问题可能带来新的并发风险。
- #6055 工具调用错误信息改进:将异常处理拆分为三个阶段(名称、JSON 解析、执行),为 LLM 提供 actionable 的错误消息。重要 UX 改进。
- #6058 KL 惩罚 bug 修复:修复了长期存在的
k3+/low_var_kl+ 等带 '+'后缀估计器无法使用的 bug,新增回归测试。涉及直通梯度技巧的正确性。
后续建议
- 加速引擎迁移:废弃 workers 后,应尽快更新所有上层训练器、配置和文档,确保 downstream 不再依赖旧 worker API。建议在下一周启动全量适配。
- 加强测试覆盖:对本周高风险修复(尤其异步训练和平台兼容性)增补单元测试和集成测试,减少生产回归风险。
- 关注配置安全性:多教师 OPD 和 MTP 的配置逻辑较复杂,应补充配置验证文档,并考虑在 CI 中添加配置兼容性检查。
- 持续监控异步训练性能:drain loop 重构可能影响并发行为,建议在长稳测试中重点观察吞吐和延迟指标。
- 推进平台兼容性:ROCm 和 NPU 的修复虽已合入,但建议在相应硬件上补充 nightly CI 测试,防止后续改动引入回归。
参与讨论