verlai/verl
verl – 大模型强化学习训练与推理工具集
前言
verl 是一款聚焦大模型”训练+推理”全流程的工具集,核心定位是降低大模型强化学习(RL)训练与高效推理的门槛,尤其适配企业级大模型落地场景。其本质是通过封装主流深度学习框架(如 PyTorch、Megatron-LM)和推理引擎(如 vLLM、SGLang),让开发者无需手动解决复杂的环境依赖、分布式配置问题,专注于模型优化与业务逻辑。
verl 的核心功能
verl 的能力覆盖”训练”和”推理”两大核心场景,且支持灵活扩展:
大模型训练:主打强化学习与分布式能力
- 支持多训练后端:适配 FSDP(PyTorch 原生分布式框架,适合快速验证原型)、Megatron-LM(NVIDIA 高性能分布式框架,支持万卡级大模型训练,适合大规模落地)
- 强化学习(RL)优化:内置 RL 训练流程封装,可直接用于大模型 RLHF(基于人类反馈的强化学习)、RLHF 变种任务,无需从零搭建训练 pipeline
- 依赖自动兼容:自动适配 PyTorch、CUDA、FlashAttention 等核心依赖版本,避免”版本冲突导致训练崩溃”
大模型推理:高效生成 rollout 结果
- 支持多推理引擎:集成 vLLM(业界领先的高吞吐推理框架,支持动态批处理)、SGLang(高性能推理引擎,提供丰富的优化特性)、TGI(Hugging Face Text Generation Inference,适合标准 Hugging Face 模型)
- 聚焦”rollout 生成”:专为强化学习场景设计——快速生成模型输出样本(如 RLHF 中的”模型回答候选”),推理访问表现比原生 Hugging Face pipeline 提升 5-10 倍
高扩展性与定制化
- 支持自定义训练配置:可通过 YAML 配置文件修改训练参数(如学习率、batch size、分布式策略)
- 源码级可定制:若使用挂载目录部署,可直接修改 verl 源码(如适配新的 RL 算法、自定义数据集),无需重新构建镜像
verl 的适用场景
| 用户类型 | 适用场景 |
|---|---|
| 算法工程师 | 快速验证大模型 RL 算法、搭建 RLHF 训练流程、测试不同推理引擎的 rollout 效率 |
| 企业运维/DevOps | 为团队快速部署统一的大模型训练/推理环境,避免”一人一环境”的运维混乱 |
| 初学者 | 零门槛体验大模型分布式训练与高效推理,无需手动配置 CUDA、PyTorch 等复杂环境 |
| 大型团队 | 基于 Megatron-LM 后端搭建大规模分布式训练集群,支撑百亿/千亿参数模型训练 |
系统要求
- Python: 版本 >= 3.10
- CUDA: 版本 >= 12.8
- cuDNN: 版本 >= 9.10.0(推荐)
快速开始
使用 Docker 镜像(推荐)
verl 提供了预构建的 Docker 镜像,支持 vLLM 和 SGLang 两种基础镜像。您可以从 Docker Hub 拉取最新镜像:
bash# 使用 vLLM 基础镜像
docker pull verlai/verl:vllm011.latest
# 或使用 SGLang 基础镜像
docker pull verlai/verl:sgl055.latest
运行容器
bashdocker create --runtime=nvidia --gpus all --net=host --shm-size="10g" --cap-add=SYS_ADMIN -v .:/workspace/verl --name verl verlai/verl:vllm011.latest sleep infinity
docker start verl
docker exec -it verl bash
安装 verl
在容器内安装 verl:
bash# 安装 nightly 版本(推荐)
git clone https://github.com/volcengine/verl && cd verl
pip3 install --no-deps -e .
# 或安装特定框架支持
pip3 install -e .[vllm]
pip3 install -e .[sglang]
支持的算法
verl 内置了多种强化学习算法,包括:
- PPO (Proximal Policy Optimization)
- GRPO (Group Relative Policy Optimization)
- DAPO (Decoupled Clip and Dynamic Sampling Policy Optimization)
- SPIN (Self-Play Fine-Tuning)
- SPPO (Self-Play Preference Optimization)
- OPO (On-Policy RL with Optimal Reward Baseline)
硬件支持
- NVIDIA GPU: 完整支持 CUDA 12.8+,推荐使用 A100、H100 等高性能 GPU
- AMD GPU: 支持 ROCm 6.2+,适用于 MI300 系列 GPU(使用 FSDP 训练后端)
- Ascend: 支持华为昇腾设备
相关资源
- 官方文档: [***]
- GitHub 仓库: https://github.com/volcengine/verl
- Docker Hub: https://hub.docker.com/r/verlai/verl
许可证
verl 采用开源许可证,详情请参阅项目仓库。
更多相关 Docker 镜像与资源
以下是 verlai/verl 相关的常用 Docker 镜像,适用于 不同场景 等不同场景:
- hiyouga/verl Docker 镜像说明
- infiniflow/ragflow Docker 镜像说明(RAG 知识库系统)
- langgenius/dify-api Docker 镜像说明(AI 应用开发框架)
- elestio/lobe-chat Docker 镜像说明
- lobehub/lobe-chat Docker 镜像说明(AI 聊天应用,支持多种模型)
部署与使用文档
verl Docker 容器化部署手册
镜像拉取方式
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
轩辕镜像加速拉取命令点我查看更多 verl 镜像标签
docker pull docker.xuanyuan.run/verlai/verl:<标签>
Megatron-LM 后端
最后更新:2025 年 06 月 24 日。
我们通过实现 actor、critic、reference、rollout 和 reward 模型的各种 worker 来支持 Megatron 后端。我们还在 megatron_vllm.py 和 megatron_sglang.py 中使用 Megatron-LM 和 vLLM/SGLang 实现 3DHybridEngine。
优点
- 支持 5D 并行(TP、EP、CP、DP、PP)和序列并行,以获得最佳的可扩展性和吞吐量。
- 3D HybridEngine 可以显著降低峰值内存使用量,并减少 actor 和 rollout 之间的权重同步开销。
缺点
- Huggingface 模型和 Megatron 检查点需要转换工具。
开发进度
请注意,[Deprecated] 表示该功能在 verl 的最新版本中不受支持。 [To-Optimize] 表示该功能已实现但尚未优化。 [WIP] 表示该功能正在开发中。 [In-Release] 表示该功能已准备就绪并处于审查过程中,随时可能发布。
Megatron Worker 工具
MegatronWorker
MegatronWorker 是不同 megatron worker 类的基类。在此类中,get_megatron_global_info 和 get_megatron_rank_info 函数用于检索运行在特定 GPU 上的每个 Worker 的 3D 并行世界大小和 rank。这些信息将用于 Megatron 后端的传输协议。
以下用于不同模型的 Worker 类将用于构建 WorkerGroup。
我们为每个 Worker 类实现了由 @register(dispatch_mode=) 装饰的各种 API。这些 API 可以被 ray driver 进程调用。数据可以根据每个函数上的 dispatch_mode 被正确地收集和分发。支持的 “dispatch_model“(即传输协议)可以在 decorator.py 中找到。
ActorRolloutRefWorker
此类是为 Actor/Rollout 混合引擎或引用模型实现其模型初始化和执行计算而实现的。
Actor/Rollout 混合引擎
- 混合引擎、Actor 和 Rollout 初始化 API。
@register(dispatch_mode=Dispatch.ONE_TO_ALL) def init_model(self):
ONE_TO_ALL:当从 driver 进程调用 init_model 函数时,每个 worker(在 GPU 上)将执行以下模型初始化过程。
混合引擎、Actor 和 Rollout 的初始化细节如下:
MegatronPPOActor在使用 Megatron 构建模型时,实现了简单的 PPO 计算逻辑,包括计算 log prob 和模型更新。vLLMRollout支持使用 vLLM 进行生成。我们修改了 vLLM Engine,使其在 SPMD 下运行,以适应我们的WorkerGroup设计。MegatronVLLMShardingManager是一个上下文管理器,用于在 actor 和 rollout 之间执行实际的权重重分片。
有关更多信息,请参阅 源代码。
# 构建 actor 模型
self.actor = MegatronPPOActor(config=self.config.actor,
model_config=self.actor_model_config,
megatron_config=megatron_config,
actor_module=self.actor_module,
actor_optimizer=self.actor_optimizer,
actor_optimizer_config=self.actor_optim_config)
# 构建 rollout
# rollout 初始化
rollout = vLLMRollout(actor_module=params,
config=self.config.rollout,
tokenizer=self.tokenizer,
model_hf_config=self.actor_model_config,
train_tp=mpu.get_tensor_model_parallel_world_size())
# 在 actor 和 rollout 之间执行权重重分片
sharding_manager = MegatronVLLMShardingManager(module=self.hybrid_engine,
inference_engine=rollout.inference_engine,
model_config=self.actor_model_config,
layer_name_mapping=layer_name_mapping)
...
- 生成序列并重新计算 log prob
@register(dispatch_mode=Dispatch.MEGATRON_PP_AS_DP_PROTO) def generate_sequences(self, prompts: DataProto):
Dispatch.MEGATRON_PP_AS_DP_PROTO:actor 模型的 PP 维度将被视为 DP 维度。然后,driver 进程将根据此重组来分发和收集数据。这是因为,在混合引擎中,通常应用较大 3D 并行尺寸的 actor 权重将沿着 PP 维度和 TP 维度进行聚合。因此,相应的数据应该通过 rollout 模型的 3D 并行组而不是 actor 模型进行分发和收集。但是,world_size 和 rank 信息只能从get_megatron_global_info和get_megatron_rank_info中检索,它们记录了 actor 模型的 3D 信息。此外,TP 维度内的重分片将在混合引擎中处理。- 在此函数中,rollout 模型将执行自回归生成,actor 模型将重新计算旧 log prob 以用于生成的响应。
- 更新 actor 模型
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def update_actor(self, data: DataProto):
Dispatch.MEGATRON_COMPUTE_PROTO:用户传入按 DP 维度分区的数据。数据将被分发到同一 dp 组内的所有 tp/pp rank,最终只收集 tp=0 和最后一个 pp 的输出数据。- 使用 PPO 和熵损失更新 actor 模型权重。
..note:
目前,训练 Tensor Parallel Size 可以不同于推理 Tensor Parallel Size。
ReferenceModel
- 引用模型初始化
引用模型使用与 actor 模型相同的函数进行初始化,但不初始化混合引擎和优化器。然后 actor 模型也由 MegatronPPOActor 包装。
- 计算引用 log prob
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def compute_ref_log_prob(self, data: DataProto):
- 在此函数中,引用模型将调用
MegatronPPOActor中的计算 log prob 函数来计算引用 log prob。
CriticWorker 和 RewardWorker
- 模型初始化
与引用模型非常相似。CriticWorker 将为优化器执行额外的初始化。
- 计算 CriticWorker 的值
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def compute_values(self, data: DataProto):
- 更新 Critic
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def update_critic(self, data: DataProto):
- 计算 Reward
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def compute_rm_score(self, data: DataProto):
训练优化工具
Offload (卸载)
当资源紧张时,卸载方法可以降低 GPU 内存使用量,帮助训练和推理框架在 verl 下良好运行。它将参数、梯度和优化器移至 CPU 内存,仅在需要时将其加载回 GPU。
如果要使用卸载,可以分别为 actor 和 ref 添加以下参数。
# 对于 actor actor_rollout_ref.actor.megatron.param_offload=True \ actor_rollout_ref.actor.megatron.grad_offload=True \ actor_rollout_ref.actor.megatron.optimizer_offload=True \ # 对于 ref(不带梯度和优化器) actor_rollout_ref.ref.megatron.param_offload=True \
对于 critic,可以包含这些参数。
# 对于 critic critic.megatron.param_offload=True \ critic.megatron.grad_offload=True \ critic.megatron.optimizer_offload=True \
相关的 MCore 文档
此外,还有一份关于使用 MCore 训练不同类型模型的详细文档,请参考 MCore 文档。
Megatron-LM 后端
最后更新:2025年12月01日。
我们通过为 actor、critic、reference、rollout 和 reward 模型实现各种 worker 来支持 Megatron 后端。我们还在 megatron_vllm.py 和 megatron_sglang.py 中使用 Megatron-LM 和 vLLM/SGLang 实现了 3DHybridEngine。
优点
- 支持 5D 并行(TP、EP、CP、DP、PP)和序列并行,以实现最佳的可扩展性和吞吐量。
- 3D 混合引擎可以显著降低峰值内存使用,并减少 actor 和 rollout 之间的权重同步开销。
缺点
- Huggingface 模型和 Megatron 检查点需要转换工具。
开发进展
请注意,[Deprecated] 表示该功能在 verl 的最新版本中不受支持。[To-Optimize] 表示该功能已实现但尚未优化。[WIP] 表示该功能正在开发中。[In-Release] 表示该功能已准备就绪并正在审核中,随时可能发布。
| [Deprecated] | Megatron 3D 并行与自定义模型 |
| [Done] | Megatron 0.11.0 GPTModel 支持 |
| [Done] | Megatron GRPO 支持 |
| [Done] | Megatron 与 vLLM 0.8.2,支持逐张量权重加载 |
| [Done] | Megatron 与上下文并行 |
| [Done] | Qwen2MoE 模型支持 |
| [To-Optimize] | Megatron 分布式检查点 |
| [To-Optimize] | Huggingface 和 Megatron 检查点转换器 |
| [To-Optimize] | 高效融合的线性、熵和交叉熵 |
| [Done] | Megatron 卸载(参数、梯度、优化器) |
| [Done] | Megatron 性能分析器 |
| [In-Release] | Megatron 0.12.0, TE 2.2 与 vLLM 0.8.3 和 Fused Attn |
| [WIP] | Moonlight/DeepSeek-V3 模型支持 |
| [WIP] | 专家并行支持 |
| [WIP] | Megatron 支持动态批次大小 |
| [To-Do] | 性能调优 |
| [MileStone] | DeepSeek-V3 671B 训练后可运行 |
Megatron Worker 工具
MegatronWorker
MegatronWorker 是不同 Megatron worker 类的基类。在此类中,get_megatron_global_info 和 get_megatron_rank_info 函数用于检索运行在特定 GPU 上的每个 Worker 的 3D 并行全局大小和排名。这些信息将用于 Megatron 后端的传输协议。
以下用于不同模型的 Worker 类将用于构建 WorkerGroup。
我们为每个由 @register(dispatch_mode=) 装饰的 Worker 类实现了各种 API。这些 API 可以由 Ray 驱动进程调用。数据可以根据每个函数上的 dispatch_mode 正确收集和分发。支持的 dispatch_model(即传输协议)可在 decorator.py 中找到。
ActorRolloutRefWorker
该类用于 Actor/Rollout 混合引擎或参考模型初始化其模型并执行计算。
Actor/Rollout 混合引擎
- HybridEngine、Actor 和 Rollout 初始化 API。
@register(dispatch_mode=Dispatch.ONE_TO_ALL) def init_model(self):
ONE_TO_ALL:当从驱动进程调用 init_model 函数时,每个 worker(在 GPU 上)将执行以下模型初始化过程。
HybridEngine、Actor 和 Rollout 的初始化细节如下所示
MegatronPPOActor实现了当模型使用 Megatron 构建时的简单 PPO 计算逻辑,包括计算 log prob、模型更新。vLLMRollout支持使用 vLLM 进行生成。我们修改了 vLLM 引擎,使其在 SPMD 下执行,以适应我们的WorkerGroup设计。
有关更多信息,请参阅 源代码。
# build actor model
self.actor = MegatronPPOActor(config=self.config.actor,
model_config=self.actor_model_config,
megatron_config=megatron_config,
actor_module=self.actor_module,
actor_optimizer=self.actor_optimizer,
actor_optimizer_config=self.actor_optim_config)
# build rollout
# rollout initialization
rollout = vLLMRollout(actor_module=params,
config=self.config.rollout,
tokenizer=self.tokenizer,
model_hf_config=self.actor_model_config,
train_tp=mpu.get_tensor_model_parallel_world_size())
...
- 生成序列并重新计算 log prob
@register(dispatch_mode=Dispatch.MEGATRON_PP_AS_DP_PROTO) def generate_sequences(self, prompts: DataProto):
Dispatch.MEGATRON_PP_AS_DP_PROTO:actor 模型的 PP 维度将被视为 DP 维度。然后驱动进程将根据此重组分发和收集数据。这是因为,在 HybridEngine 中,actor 权重(通常应用较大的 3D 并行尺寸)将沿 PP 维度和 TP 维度聚合。因此,相应的数据应通过 rollout 模型的 3D 并行组进行分发和收集,而不是 actor 模型。然而,world_size 和 rank 信息只能从get_megatron_global_info和get_megatron_rank_info中检索,这些信息记录了 actor 模型的 3D 信息。此外,TP 维度内部的数据重新分片将在 HybridEngine 内部处理。- 在此函数中,rollout 模型将执行自回归生成,actor 模型将重新计算生成响应的旧 log prob。
- 更新 actor 模型
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def update_actor(self, data: DataProto):
Dispatch.MEGATRON_COMPUTE_PROTO:用户传入按 DP 维度划分的数据。数据被分发到同一 DP 组内的所有 TP/PP 排名,并最终仅从 TP=0 和最后一个 PP 收集输出数据。- 使用 PPO 和熵损失更新 actor 模型权重。
..note
Currently, training Tensor Parallel Size can be different from inference Tensor Parallel Size.
ReferenceModel
- 参考模型初始化
参考模型使用与 actor 模型相同的函数进行初始化,而不初始化 HybridEngine 和优化器。然后 actor 模型也被 MegatronPPOActor 封装。
- 计算参考 log prob
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def compute_ref_log_prob(self, data: DataProto):
- 在此函数中,参考模型将调用
MegatronPPOActor中的计算 log prob 函数来计算参考 log prob。
CriticWorker 和 RewardWorker
- 模型初始化
与参考模型非常相似。CriticWorker 将为优化器执行额外的初始化。
- 为 CriticWorker 计算值
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def compute_values(self, data: DataProto):
- 更新 Critic
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def update_critic(self, data: DataProto):
- 计算奖励
@register(dispatch_mode=Dispatch.MEGATRON_COMPUTE_PROTO) def compute_rm_score(self, data: DataProto):
训练优化工具
卸载
当资源紧张时,卸载方法可以降低 GPU 内存使用,帮助训练和推理框架在 verl 下良好运行。它将参数、梯度和优化器移动到 CPU 内存,并仅在需要时将其加载回 GPU。
如果您想使用卸载功能,您可以为 actor 和 ref 分别添加以下参数。
# For the actor actor_rollout_ref.actor.megatron.param_offload=True \ actor_rollout_ref.actor.megatron.grad_offload=True \ actor_rollout_ref.actor.megatron.optimizer_offload=True \ # For the ref w/o grad and optimizer actor_rollout_ref.ref.megatron.param_offload=True \
对于 critic,您可以包含这些参数。
# For the critic critic.megatron.param_offload=True \ critic.megatron.grad_offload=True \ critic.megatron.optimizer_offload=True \