模型引擎

作者: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

扩展

添加新的后端

添加新的模型类型

  • 这主要保留给输出不仅仅是文本的模型(例如,Qwen3-Omni)。在继续之前,请与我们讨论。