news 2026/1/26 5:52:52

verl + Ray组合实战:分布式训练轻松上手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
verl + Ray组合实战:分布式训练轻松上手

verl + Ray组合实战:分布式训练轻松上手

1. 引言

随着大语言模型(LLMs)在自然语言处理领域的广泛应用,如何高效地进行模型后训练成为工程实践中的关键挑战。强化学习人类反馈(RLHF)作为主流的对齐技术之一,其训练流程复杂、资源消耗高,尤其在大规模场景下对系统架构和分布式能力提出了更高要求。

在此背景下,verl应运而生——一个由字节跳动火山引擎团队开源的、专为 LLM 后训练设计的高性能强化学习框架。它是 HybridFlow 论文的官方实现,具备模块化、高吞吐、易扩展等特性,能够无缝集成主流 LLM 框架如 PyTorch FSDP、Megatron-LM 和 vLLM,并支持灵活的设备映射与并行策略。

与此同时,Ray作为一个成熟的分布式计算框架,提供了强大的任务调度、资源管理和弹性伸缩能力。将 verl 与 Ray 结合,不仅能充分发挥 verl 在 RL 训练上的性能优势,还能借助 Ray 实现跨节点的任务协调与资源隔离,显著降低分布式训练的部署门槛。

本文将以“verl + Ray” 组合为核心,详细介绍如何基于该技术栈快速搭建一套可扩展的分布式 PPO 训练系统,涵盖环境准备、核心组件解析、代码实现及最佳实践建议,帮助开发者从零开始落地高效的 RLHF 训练流程。

2. verl 核心架构与 Ray 集成机制

2.1 verl 的模块化设计思想

verl 的核心设计理念是解耦计算逻辑与数据流控制,通过模块化的 API 将训练过程划分为多个独立角色(role),包括:

  • actor_rollout:负责生成响应序列
  • critic:估计状态价值函数
  • reference_policy:计算旧策略下的 log-prob,用于 KL 散度惩罚
  • reward_model (rm):打分模型,输出奖励信号

每个角色均可运行在独立的 GPU 资源池中,彼此之间通过定义良好的通信协议(DataProto)交换中间结果,形成清晰的数据流水线。

这种设计使得 verl 具备极强的灵活性:不同角色可以使用不同的并行策略(如 TP/PP/DP)、部署在不同规模的设备组上,甚至接入异构推理后端(如 vLLM 加速生成)。

2.2 Ray 在 verl 中的角色:分布式执行引擎

Ray 为 verl 提供了底层的分布式执行能力。具体来说,verl 使用Ray Actor 模型来封装各个训练角色,利用 Ray 的远程调用机制实现跨进程/跨节点的函数执行和数据传递。

关键抽象如下:

resource_pool = RayResourcePool( process_on_nodes=[config.trainer.n_gpus_per_node] * config.trainer.nnodes, use_gpu=True, max_colocate_count=1 )

上述RayResourcePool定义了一组可用于部署 WorkerGroup 的物理资源。通过配置max_colocate_count参数,用户可控制在同一台机器上共置多少个进程:

  • 设置为1:适合 FSDP 场景,所有角色合并到单个进程中,减少上下文开销
  • 大于1:适合 Megatron-LM 等需要独立进程组的场景,允许更细粒度的并行控制

2.3 WorkerGroup:分布式工作的基本单元

在 verl 中,WorkerGroup是执行分布式任务的核心抽象。它代表一组运行相同类实例(如ActorRolloutWorker)的 Ray Actors,通常对应一个训练角色。

创建方式示例如下:

actor_rollout_cls = RayClassWithInitArgs(cls=ActorRolloutWorker) actor_rollout_worker_group = MegatronRayWorkerGroup( resource_pool=resource_pool, ray_cls_with_init=actor_rollout_cls, default_megatron_kwargs=config.actor_rollout.megatron )

一旦初始化完成,即可通过.generate_sequences().compute_values()等方法发起远程调用,驱动底层模型执行相应操作。

核心优势:驱动进程(driver)仅负责编排数据流和轻量级计算(如优势估计),真正的模型前向/反向计算全部分布到各 WorkerGroup 执行,极大提升了系统的可扩展性。

3. 实战演练:构建基于 Ray 的 PPO 训练流程

3.1 环境准备与依赖安装

首先确保已准备好 Python 运行环境(推荐 3.9+),并安装 verl 及相关依赖:

# 进入 Python 环境 python -m venv verl_env source verl_env/bin/activate # 安装 verl(假设已发布至 PyPI 或本地安装) pip install verl ray[default]

验证安装是否成功:

import verl print(verl.__version__) # 输出版本号表示安装成功

同时启动 Ray 集群(单机模式):

import ray ray.init()

若在多节点集群中运行,请提前配置好 Ray Head 节点并连接:

ray start --address='<head-node-ip>:6379'

3.2 数据准备:加载与预处理

PPO 训练的第一步是从数据集中加载提示(prompt)。verl 提供了RLHFDataset类,支持从 parquet 文件读取、应用聊天模板、分词、填充与截断等操作。

from verl.data import RLHFDataset self.train_dataset = RLHFDataset( data_files=self.config.data.train_files, tokenizer=self.tokenizer, config=self.config.data ) # 构建 DataLoader self.train_dataloader = torch.utils.data.DataLoader( self.train_dataset, batch_size=self.config.data.ppo_minibatch_size, shuffle=True, collate_fn=self.train_dataset.collate_fn )

该数据集会自动处理以下任务:

  • 应用 HuggingFace 模型对应的 chat template(如 llama-3-instruct)
  • 对 input_ids 进行 padding/truncation 至最大长度
  • 返回结构化字典,便于后续转换为DataProto

3.3 初始化各角色 WorkerGroup

接下来,我们需要为每个训练角色初始化对应的WorkerGroup。为了优化资源利用率,verl 支持将多个角色共置在同一进程内,避免重复创建 CUDA 上下文。

from verl.ray import create_colocated_worker_cls, RayResourcePool # 定义资源池与角色映射 resource_pool = RayResourcePool( process_on_nodes=[8] * 2, # 两台机器,每台8卡 use_gpu=True, max_colocate_count=1 ) # 定义各角色初始化类 class_dict = { 'actor_rollout': ActorRolloutWorker, 'critic': CriticWorker, 'ref': ReferencePolicyWorker, 'rm': RewardModelWorker } # 创建共置 Worker 类 worker_dict_cls = create_colocated_worker_cls(class_dict=class_dict) wg_dict = MegatronRayWorkerGroup(resource_pool=resource_pool, ray_cls_with_init=worker_dict_cls) # 启动所有 WorkerGroup all_wg = wg_dict.spawn(prefix_set=class_dict.keys()) # 分别获取引用 self.actor_rollout_wg = all_wg['actor_rollout'] self.critic_wg = all_wg['critic'] self.ref_policy_wg = all_wg['ref'] self.rm_wg = all_wg['rm'] # 初始化模型 self.actor_rollout_wg.init_model() self.critic_wg.init_model() self.ref_policy_wg.init_model() self.rm_wg.init_model()

注意:vLLM 推理后端建议最后初始化actor_rollout,以便其更准确估算 KV Cache 内存占用。

3.4 PPO 训练主循环详解

完整的 PPO 训练流程由驱动进程协调,依次调用各WorkerGroup的远程方法,构建端到端的数据流。

以下是简化版的fit()函数实现:

def fit(self): global_steps = 0 logger = Tracking(...) # 初始化日志记录器 for epoch in range(self.config.trainer.total_epochs): for batch_dict in self.train_dataloader: metrics = {} batch: DataProto = DataProto.from_single_dict(batch_dict) # Step 1: 生成响应序列 gen_batch = batch.pop(['input_ids', 'attention_mask', 'position_ids']) with Timer(name='gen') as timer: gen_output = self.actor_rollout_wg.generate_sequences(gen_batch) batch = batch.union(gen_output) metrics['timing/gen'] = timer.last # Step 2: 计算参考策略 log_prob(用于 KL 惩罚) if self.use_reference_policy: with Timer(name='ref') as timer: ref_log_prob = self.ref_policy_wg.compute_ref_log_prob(batch) batch = batch.union(ref_log_prob) metrics['timing/ref'] = timer.last # Step 3: 估计 critic 值 with Timer(name='values') as timer: values = self.critic_wg.compute_values(batch) batch = batch.union(values) metrics['timing/values'] = timer.last # Step 4: 计算奖励得分 with Timer(name='adv') as timer: if self.use_rm: rm_score = self.rm_wg.compute_rm_score(batch) batch = batch.union(rm_score) # 自定义奖励函数(规则+模型混合) reward_tensor = self.reward_fn(batch) batch.batch['token_level_scores'] = reward_tensor # 添加 KL 惩罚 batch, kl_metrics = apply_kl_penalty( batch, kl_ctrl=self.kl_ctrl_in_reward, kl_penalty=self.config.algorithm.kl_penalty ) metrics.update(kl_metrics) # 计算优势函数(在 driver 上执行) batch = compute_advantage( batch, gamma=self.config.algorithm.gamma, lam=self.config.algorithm.lam, adv_estimator=self.config.algorithm.adv_estimator ) metrics['timing/adv'] = timer.last # Step 5: 更新 critic 网络 if self.use_critic: with Timer(name='update_critic') as timer: critic_out = self.critic_wg.update_critic(batch) metrics['timing/update_critic'] = timer.last metrics.update(reduce_metrics(critic_out.meta_info['metrics'])) # Step 6: 更新 actor 网络(PPO 主更新) with Timer(name='update_actor') as timer: actor_out = self.actor_rollout_wg.update_actor(batch) metrics['timing/update_actor'] = timer.last metrics.update(reduce_metrics(actor_out.meta_info['metrics'])) # Step 7: 日志记录与检查点保存 logger.log(data=metrics, step=global_steps) if (global_steps + 1) % self.config.trainer.save_freq == 0: self.actor_rollout_wg.save_checkpoint( local_path=f"./checkpoints/actor/global_step_{global_steps}", remote_path=None ) global_steps += 1

整个流程体现了典型的“指挥-执行” 模式:driver 负责流程控制和轻量计算,重负载的模型推理与训练任务全部交由 Ray 分布式执行。

4. 性能优化与工程实践建议

4.1 并行策略选择指南

后端框架推荐设置说明
PyTorch FSDPmax_colocate_count=1单进程管理所有角色,简化通信
Megatron-LMmax_colocate_count>1支持不同角色使用不同并行配置
vLLMactor_rollout 单独部署利用 PagedAttention 提升生成效率

建议根据实际硬件资源和模型大小调整并行粒度。

4.2 内存与通信优化技巧

  • 启用 3D-HybridEngine:verl 内置的重分片机制可在训练/生成阶段间高效切换模型切片,减少冗余内存占用。
  • 批量处理请求:尽量以较大 batch size 进行生成和训练,提升 GPU 利用率。
  • 异步保存检查点:使用 Ray 的异步任务机制执行 checkpoint 上传,避免阻塞主训练流。

4.3 常见问题排查清单

问题现象可能原因解决方案
Ray Worker 启动失败CUDA 版本不匹配或显存不足检查 NCCL、PyTorch 与 CUDA 兼容性
生成速度慢tokenizer 序列过长启用 truncation,限制 prompt 长度
OOM 错误KV Cache 占用过高调整 max_sequence_length 或使用 vLLM
数据传输延迟高DataProto 序列化开销大启用 Arrow 或共享内存优化

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/26 3:45:46

Steamless终极指南:5步轻松解除Steam游戏DRM限制

Steamless终极指南&#xff1a;5步轻松解除Steam游戏DRM限制 【免费下载链接】Steamless Steamless is a DRM remover of the SteamStub variants. The goal of Steamless is to make a single solution for unpacking all Steam DRM-packed files. Steamless aims to support …

作者头像 李华
网站建设 2026/1/23 10:14:36

打破传统!这款3D球体抽奖系统让你的年会秒变科技大片

打破传统&#xff01;这款3D球体抽奖系统让你的年会秒变科技大片 【免费下载链接】log-lottery &#x1f388;&#x1f388;&#x1f388;&#x1f388;年会抽奖程序&#xff0c;threejsvue3 3D球体动态抽奖应用。 项目地址: https://gitcode.com/gh_mirrors/lo/log-lottery …

作者头像 李华
网站建设 2026/1/25 11:56:14

如何将普通3D打印机升级为5轴系统:创客的完整实践指南

如何将普通3D打印机升级为5轴系统&#xff1a;创客的完整实践指南 【免费下载链接】Open5x This is a Github repository for 5-axis 3D printing 项目地址: https://gitcode.com/gh_mirrors/op/Open5x 在当今快速演进的数字制造领域&#xff0c;5轴3D打印技术正从专业工…

作者头像 李华
网站建设 2026/1/23 7:52:00

智慧教育平台电子课本高效获取终极指南

智慧教育平台电子课本高效获取终极指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为电子教材下载的繁琐流程而困扰&#xff1f;传统方式需要经过多个页面…

作者头像 李华
网站建设 2026/1/24 17:58:56

如何免费解锁123云盘VIP权限:5大功能全面解析与3步配置指南

如何免费解锁123云盘VIP权限&#xff1a;5大功能全面解析与3步配置指南 【免费下载链接】123pan_unlock 基于油猴的123云盘解锁脚本&#xff0c;支持解锁123云盘下载功能 项目地址: https://gitcode.com/gh_mirrors/12/123pan_unlock 还在为123云盘的文件下载限制而烦恼…

作者头像 李华
网站建设 2026/1/21 19:16:48

免费OpenAI密钥宝库:开启AI技术零门槛体验

免费OpenAI密钥宝库&#xff1a;开启AI技术零门槛体验 【免费下载链接】FREE-openai-api-keys collection for free openai keys to use in your projects 项目地址: https://gitcode.com/gh_mirrors/fr/FREE-openai-api-keys 还在为接入AI服务的高成本而却步吗&#xf…

作者头像 李华