Skip to content

ActorRolloutRefWorker

整体概述

ActorRolloutRefWorker 是一个多功能的Worker类,可以根据配置扮演不同角色:单独的演员(actor)、推理引擎(rollout)、参考策略(ref),或者它们的组合(如 actor_rollout、actor_rollout_ref)。 fsdp_workers.py:106-110 这种设计实现了最大化的代码复用,同时支持高效的权重传输和内存管理。

类初始化和配置

构造函数参数解析 fsdp_workers.py:112-128

构造函数接收配置对象和角色参数,首先初始化分布式环境。如果 PyTorch 分布式未初始化,会自动设置进程组,使用混合后端(CPU 用 gloo,GPU 用 NCCL)。

设备网格构建 fsdp_workers.py:129-143

代码构建了两种设备网格:

  • FSDP 设备网格:用于参数分片的基础网格
  • Ulysses 设备网格:用于序列并行的专用网格,支持长序列处理

角色判断逻辑 fsdp_workers.py:147-153

通过布尔标志确定当前实例需要承担的角色:

  • _is_actor:是否需要执行策略更新
  • _is_rollout:是否需要执行序列生成
  • _is_ref:是否需要作为参考策略

配置标准化 fsdp_workers.py:174-208

这段代码对批次大小进行标准化处理,根据设备数量和序列并行大小调整:

  • PPO mini batch size:按设备数量缩放
  • Micro batch size:确保能被 mini batch size 整除
  • 日志概率批次大小:为推理和Reference单独配置

模型构建核心方法

_build_model_optimizer 方法 fsdp_workers.py:254-330

这是模型构建的核心方法:

  1. 模型配置加载:从预训练路径加载 AutoConfig,设置 flash attention

  2. 特殊模型适配:为 kimi-vl 等特殊模型设置专用配置

  3. 权重初始化上下文:使用 meta tensor 优化内存使用

  4. 模型类型判断:自动选择 AutoModelForCausalLM 或 AutoModelForVision2Seq

  5. 优化内核应用

    • Liger 内核优化(如果启用)
    • Monkey patch 应用(支持 remove padding 和序列并行)
    • 梯度检查点(如果启用)
  6. LoRA 支持:如果配置了 LoRA,会应用 PEFT 模型包装

模型初始化流程

init_model 方法 fsdp_workers.py:563-668

这个方法是模型初始化的入口点,使用 @register(dispatch_mode=Dispatch.ONE_TO_ALL) 装饰器,确保所有Worker都执行相同的初始化:

  1. 外部库导入:导入用户指定的外部库
  2. 演员/推理模型构建:如果角色包含 actor 或 rollout,构建主模型
  3. 演员包装:将 FSDP 模型包装为 DataParallelPPOActor
  4. 推理引擎构建:构建 vLLM 推理引擎和分片管理器
  5. Reference构建:如果需要参考策略,构建独立的Reference
  6. 检查点管理器:设置 FSDP 检查点管理器

核心训练方法

update_actor 方法 fsdp_workers.py:669-713

这是演员模型更新的核心方法:

  1. 数据预处理:将数据移动到 GPU,处理 CPU 卸载

  2. Ulysses 分片管理:使用上下文管理器处理序列并行

  3. 策略更新:调用 DataParallelPPOActor.update_policy 执行 PPO 更新

  4. 性能指标计算

    • 计算 MFU(模型 FLOPS 利用率)
    • 记录内存使用情况
    • 更新学习率调度器
  5. 数据后处理:处理输出数据并移回 CPU

检查点管理

load_checkpoint 方法 fsdp_workers.py:884-903

支持从本地或 HDFS 加载检查点,处理参数和优化器的 CPU 卸载逻辑。

异步扩展

AsyncActorRolloutRefWorker 类 fsdp_workers.py:1644-1700

这是 ActorRolloutRefWorker 的异步版本,专门用于与 vLLM 和 SGLang 等异步推理引擎集成:

  • 异步方法支持:提供 async def 方法用于非阻塞推理
  • 外部引擎集成:支持 vLLM 的 collective RPC 和 SGLang 的聊天完成接口
  • 资源管理:支持推理引擎的睡眠/唤醒机制

技术要点

1. HybridFlow 架构集成

所有方法都使用 @register 装饰器,支持不同的分发模式:

  • Dispatch.ONE_TO_ALL:广播到所有Worker
  • Dispatch.DP_COMPUTE_PROTO:数据并行计算和收集

2. 内存优化策略

  • 参数卸载:支持将 FSDP 参数卸载到 CPU
  • 优化器卸载:支持将优化器状态卸载到 CPU
  • 激活检查点:减少前向传播的内存占用

3. 分布式训练支持

  • FSDP 集成:使用 PyTorch FSDP 进行参数分片
  • 序列并行:通过 Ulysses 支持长序列处理
  • 混合精度:演员模型使用 fp32,Reference使用 bfloat16

潜在改进建议

  1. 错误处理增强:可以添加更详细的异常处理和恢复机制
  2. 配置验证:在初始化时验证配置参数的一致性和合理性
  3. 内存监控:添加更精细的内存使用监控和报告
  4. 性能优化:考虑使用更高效的数据传输和同步策略

Notes

ActorRolloutRefWorker 是 verl 框架 FSDP 后端的核心实现,与 Megatron 后端形成互补。它通过角色组合设计实现了灵活的资源配置,支持从单机训练到大规模分布式训练的各种场景。该类在 HybridFlow 架构中作为计算流的具体执行者,通过 Ray 远程调用与控制流进行交互。

Maintained by Robin