模型引擎 ============ .. _vermouth: https://github.com/vermouth1992 作者:`Chi Zhang `_ 最后更新:2025年9月25日。 当前支持矩阵 ---------------------- +----------+-----------+--------------+-------------+--------------------------+ | 后端 | 模型 | 可扩展性 | 模型 | 痛点 | | | 支持 | | 定义 | | | | | | | | +==========+===========+==============+=============+==========================+ | FSDP | Day 1 | - 密集模型 OK | Huggingface | Monkey patch 易受 | | + | 支持 | | + monkey | transformers 版本影响 | | ulysses | HF 模型 | - MoE 模型不佳 | patch | | +----------+-----------+--------------+-------------+--------------------------+ | MCore | 有限 | 最佳 | GPTModel | 支持新模型困难 | | | | | (统一模型) | | +----------+-----------+--------------+-------------+--------------------------+ - 我们通过 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 程序。这超出了模型引擎的范围。 现有模型类型 -------------------- ========== ====================== ====================== 模型类型 语言模型 价值模型 ========== ====================== ====================== 输入 text/image/video/audio text/image/video/audio 输出 下一个 token 的 logits 作为价值的 logits ========== ====================== ====================== 目前,我们有两种模型类型:语言模型和价值模型。我们计划将类别扩展到包含 Qwen-Omni 系列(同时输出文本和音频)以及 VLA 模型。 数据格式 ----------- 目前,verl 在 RL trainer 中采用左右填充的数据格式。 当响应长度差异很大时,这会产生大量的填充。我们将开始在整个系统中实现无填充格式。 .. image:: https://github.com/vermouth1992/verl-data/blob/master/images/data_format.png?raw=true :alt: 数据格式 这是迁移计划: - 在引擎中实现无填充格式 - 在 Actor/Critic worker 中添加转换层 - 替换 RL trainer 中的 Actor/Critic Worker - 实现无填充吞吐量系统 检查点系统 ----------------- .. image:: https://github.com/vermouth1992/verl-data/blob/master/images/verl-ckpt.png?raw=true :alt: 模型引擎检查点系统 引擎使用 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)。在继续之前,请与我们讨论。