模型引擎
作者:Chi Zhang
最后更新:2025年9月25日。
当前支持矩阵
我们通过 Monkey patch attention 函数来支持 ulysses
我们通过 Monkey patch VLM 模型来支持 FSDP,无论是混合数据还是不含图像的数据
类继承关系
请注意,所有 worker 和 trainer 都在 SPMD 模式下运行。SFT/DPO/RM
trainer 直接由 torchrun 调用。Actor/Critic worker 也可以由 RayWorkerGroup 调用,并提供给单个控制器。
Base Engine 层:实现模型初始化、优化器初始化、学习率调度器初始化、分片、检查点管理器。
Full Engine 层:继承 base engine 并实现
forward_step。Worker/SPMD trainer 层:与引擎无关,通过抽象引擎 API 实现训练逻辑
RL trainer 利用 worker 来构建 HybridFlow 程序。这超出了模型引擎的范围。
现有模型类型
目前,我们有两种模型类型:语言模型和价值模型。我们计划将类别扩展到包含 Qwen-Omni 系列(同时输出文本和音频)以及 VLA 模型。
数据格式
目前,verl 在 RL trainer 中采用左右填充的数据格式。 当响应长度差异很大时,这会产生大量的填充。我们将开始在整个系统中实现无填充格式。
这是迁移计划: - 在引擎中实现无填充格式 - 在 Actor/Critic worker 中添加转换层 - 替换 RL trainer 中的 Actor/Critic Worker - 实现无填充吞吐量系统
检查点系统
引擎使用 huggingface config 构建模型,然后从 huggingface 检查点加载权重。如果引擎直接使用 huggingface 模型定义,则可以使用 transformers 提供的函数。否则,每个引擎都必须编写自己的检查点加载逻辑(例如,
mbridge)。在模型训练期间,每个引擎都必须实现 save_checkpoint 和
load_checkpoint,以保存/加载中间分片检查点,包括模型、优化器和学习率调度器状态。每个引擎都必须实现一个检查点合并脚本,将中间分片检查点合并回 huggingface 格式。
API
临时的模型引擎 API 可以在以下位置找到: https://github.com/volcengine/verl/blob/main/verl/workers/engine/base.py#L24
扩展
添加新的后端
在
verl/workers/engine下创建一个新文件夹。然后,实现transformer_impl.py。如果您想实现非 transformer 模型,请提前联系我们。将引擎配置添加到 GSM8k SFT trainer 脚本中: https://github.com/volcengine/verl/blob/main/tests/special_e2e/sft/run_sft_engine_gsm8k.sh
使用您的后端调用测试: https://github.com/volcengine/verl/blob/main/tests/special_e2e/sft/test_sft_engine_all.sh。 此测试脚本将运行各种后端和各种配置,并比较第一步的损失和梯度范数,以确保它们接近。
添加新的模型类型
这主要保留给输出不仅仅是文本的模型(例如,Qwen3-Omni)。在继续之前,请与我们讨论。