新手必看!verl多节点训练一键启动实战

新手必看!verl多节点训练一键启动实战

1. 引言:为什么选择 verl 进行多节点强化学习训练?

你是否正在为大型语言模型(LLM)的后训练效率低下而烦恼?手动搭建分布式环境、调试通信问题、管理 GPU 资源……这些繁琐的工作不仅耗时,还容易出错。今天,我们来介绍一个真正能“开箱即用”的解决方案——verl

verl 是由字节跳动火山引擎团队开源的一个专为 LLM 后训练设计的强化学习(RL)框架,也是其HybridFlow 论文的官方实现。它不是另一个玩具级项目,而是面向生产环境打造的高效工具,具备以下核心优势:

  • 高吞吐量:无缝集成 vLLM、FSDP 等 SOTA 推理与训练框架,最大化生成和训练速度。
  • 灵活并行:支持将 Actor、Critic、Reference 模型灵活分布到不同 GPU 组,资源利用率更高。
  • 模块化 API:轻松对接 HuggingFace 模型,无需修改底层代码即可快速迁移。
  • 3D-HybridEngine:创新的重分片机制,显著降低训练/推理切换时的通信开销。

本文将带你从零开始,手把手完成 verl 的多节点训练部署,并提供一份可直接运行的slurm_script.sh脚本,真正做到“一键启动”。


2. 环境准备与基础验证

在进入多节点之前,先确保你的单机环境已经正确安装 verl。

2.1 安装与版本检查

打开 Python 环境,执行以下命令:

python

导入 verl 并查看版本号:

import verl print(verl.__version__)

如果输出类似0.1.0或更高版本,则说明安装成功。若报错,请确认已正确安装依赖包,并建议使用 Ray 最新版(≥2.40),旧版本可能存在兼容性问题。

提示:推荐使用 Conda 创建独立环境,避免依赖冲突。


3. 多节点训练的核心挑战与解决方案

多节点训练最大的难点不在于算法本身,而在于集群管理、任务调度和资源协调。传统方式需要手动启动 Ray 集群、配置网络、提交作业,步骤繁琐且易出错。

verl 提供了两种主流方案:

  • 手动 Ray 集群:适合小规模测试或教学场景
  • Slurm + Docker/Podman:适合生产级大规模训练

本文重点讲解后者,因为它更贴近真实科研与工业环境。


4. 基于 Slurm 的 verl 多节点训练实战

我们将通过一个完整的slurm_script.sh脚本,实现从容器构建、Ray 集群初始化到数据预处理、模型加载再到正式训练的全流程自动化。

4.1 脚本结构概览

该脚本包含以下关键阶段:

  1. SLURM 作业配置
  2. 环境变量设置
  3. Docker 容器构建与启动
  4. Ray 多节点集群初始化
  5. 数据预处理
  6. 模型加载验证
  7. PPO 训练任务启动

4.2 SLURM 作业配置详解

#!/bin/bash #SBATCH --job-name=verl-ray-on-slurm #SBATCH --nodes=2 #SBATCH --ntasks-per-node=2 #SBATCH --mem=200G #SBATCH --time=30-00:00:00 #SBATCH --gpus-per-node=8 #SBATCH --cpus-per-task=28 #SBATCH --output=../verl_log/slurm-%j.out #SBATCH --error=../verl_log/slurm-%j.err #SBATCH --nodelist=gpu-[0,1]
  • --nodes=2:使用两个计算节点
  • --gpus-per-node=8:每节点 8 块 GPU,适用于 A100/H100 或 MI300 等高端卡
  • --output--error:日志输出路径,便于后续排查问题

4.3 关键环境变量设置

为了确保 AMD ROCm 或 NVIDIA CUDA 环境正常工作,必须设置一系列 NCCL/RCCL 相关参数:

export NCCL_DEBUG=TRACE export GPU_MAX_HW_QUEUES=2 export TORCH_NCCL_HIGH_PRIORITY=1 export NCCL_CHECKS_DISABLE=1 export NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_8,mlx5_9 export NCCL_IB_GID_INDEX=3 export NCCL_CROSS_NIC=0 export CUDA_DEVICE_MAX_CONNECTIONS=1 export NCCL_PROTO=Simple export RCCL_MSCCL_ENABLE=0 export TOKENIZERS_PARALLELISM=false export HSA_NO_SCRATCH_RECLAIM=1

注意NCCL_IB_HCA需根据实际 InfiniBand 设备名称调整,可通过ibdev2netdev命令查看。

同时,统一 GPU 可见性设置:

export HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 export ROCR_VISIBLE_DEVICES=$HIP_VISIBLE_DEVICES export CUDA_VISIBLE_DEVICES=$HIP_VISIBLE_DEVICES

这保证了容器内外 GPU 编号一致,避免设备不可见问题。


4.4 构建并启动 Docker 容器

脚本中使用srun bash -c在每个节点上并行执行容器操作:

srun bash -c " set -e docker image prune -f docker pull docker.io/rocm/vllm:rocm6.2_mi300_ubuntu20.04_py3.9_vllm_0.6.4 if ! docker images --format '{{.Repository}}:{{.Tag}}' | grep -q '${IMG}'; then echo 'Building ${IMG} image...' docker build -f '${DOCKERFILE}' -t '${IMG}' . else echo '${IMG} image already exists, skipping build' fi docker rm '${CONTAINER_NAME}' 2>/dev/null || true docker run --rm -d \ -e HYDRA_FULL_ERROR=1 \ --network host \ --device /dev/dri \ --device /dev/kfd \ --device /dev/infiniband \ --group-add video \ --cap-add SYS_PTRACE \ --security-opt seccomp=unconfined \ --privileged \ -v \${HOME}:\${HOME} \ -v \${HOME}/.ssh:/root/.ssh \ -w '${verl_workdir}' \ --shm-size 128G \ --name '${CONTAINER_NAME}' \ '${IMG}' \ tail -f /dev/null "
  • --network host:共享主机网络,简化 Ray 通信
  • --device:挂载 GPU 和 InfiniBand 设备
  • --shm-size 128G:增大共享内存,防止 Ray 对象存储溢出
  • tail -f /dev/null:保持容器常驻运行

4.5 初始化 Ray 多节点集群

这是整个流程中最关键的部分。我们需要在一个节点上启动 Ray Head,其余节点作为 Worker 加入。

获取主节点 IP 地址
nodes_array=($(scontrol show hostnames "$SLURM_JOB_NODELIST" | tr '\n' ' ')) head_node=${nodes_array[0]} head_node_ip=$(srun --nodes=1 --ntasks=1 -w "$head_node" hostname --ip-address)
启动 Head 节点
srun --nodes=1 --ntasks=1 -w "$head_node" \ docker exec "${CONTAINER_NAME}" \ ray start --head --node-ip-address="$head_node_ip" --port=6379 \ --dashboard-port=8266 \ --num-cpus "${SLURM_CPUS_PER_TASK}" --num-gpus "${SLURM_GPUS_PER_NODE}" --block & sleep 10
启动 Worker 节点
worker_num=$((SLURM_JOB_NUM_NODES - 1)) for ((i = 1; i <= worker_num; i++)); do node_i=${nodes_array[$i]} srun --nodes=1 --ntasks=1 -w "$node_i" \ docker exec "${CONTAINER_NAME}" \ ray start --address "$ip_head" --num-cpus "${SLURM_CPUS_PER_TASK}" --num-gpus "${SLURM_GPUS_PER_NODE}" --block & sleep 5 done

重要--block参数确保进程不退出,维持 Ray 守护状态。


4.6 验证 Ray 集群状态

在提交训练任务前,务必验证集群是否正常:

docker exec "${CONTAINER_NAME}" python3 -c ' import ray try: ray.init(address="auto") print("\n=== Ray Cluster Status ===") print(f"Number of nodes: {len(ray.nodes())}") for node in ray.nodes(): print("Node: {}, Status: {}".format(node["NodeManagerHostname"], node["Alive"])) ray.shutdown() print("Ray initialization successful!") except Exception as e: print(f"Ray initialization failed: {str(e)}") '

如果输出显示两个节点均处于Alive=True状态,则集群搭建成功。


4.7 数据预处理与模型加载

接下来进行数据准备:

echo "Starting data preprocessing..." docker exec "${CONTAINER_NAME}" \ python3 "examples/data_preprocess/gsm8k.py" "--local_dir" "../data/gsm8k" docker exec "${CONTAINER_NAME}" \ python3 "examples/data_preprocess/math_dataset.py" "--local_dir" "../data/math"

然后验证模型能否正常加载(以 Qwen2 系列为例):

echo "Loading model..." docker exec "${CONTAINER_NAME}" \ python3 -c "import transformers; transformers.pipeline('text-generation', model='Qwen/Qwen2-7B-Instruct')"

这一步可以提前发现模型下载失败、权限不足等问题。


4.8 启动 PPO 训练任务

最后,使用srun在 Head 节点上启动正式训练:

PYTHONUNBUFFERED=1 srun --overlap --nodes=${SLURM_NNODES} --ntasks=1 -w "$head_node" \ docker exec "${CONTAINER_NAME}" \ python3 -m verl.trainer.main_ppo \ data.train_files=$train_files \ data.val_files=$val_files \ data.train_batch_size=1024 \ data.max_prompt_length=1024 \ data.max_response_length=1024 \ actor_rollout_ref.model.path=$MODEL_PATH \ actor_rollout_ref.actor.optim.lr=1e-6 \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.gpu_memory_utilization=0.9 \ critic.optim.lr=1e-5 \ critic.model.path=$MODEL_PATH \ algorithm.kl_ctrl.kl_coef=0.0001 \ trainer.logger=['console','wandb'] \ trainer.project_name='verl_example' \ trainer.experiment_name='Qwen2.5-32B-Instruct_function_rm' \ trainer.n_gpus_per_node=${SLURM_GPUS_PER_NODE} \ trainer.nnodes=${SLURM_NNODES} \ trainer.total_epochs=15

关键参数说明:

  • rollout.name=vllm:使用 vLLM 作为推理后端,提升生成速度
  • gpu_memory_utilization=0.9:充分利用显存
  • logger=['console','wandb']:同时输出到控制台和 WandB,便于监控

5. 如何运行这个脚本?

只需将上述完整脚本保存为slurm_script.sh,然后执行:

sbatch slurm_script.sh

系统会自动分配资源、启动容器、初始化集群并开始训练。你可以通过以下命令查看日志:

tail -f ../verl_log/slurm-*.out

或者访问 Ray Dashboard(默认端口 8266)查看任务详情。


6. 常见问题与调试建议

6.1 Ray 初始化失败

  • 检查防火墙是否开放63798266端口
  • 确保所有节点时间同步(NTP)
  • 查看/tmp/ray/session_latest/logs/下的日志文件

6.2 GPU 不可见或 ROCm 报错

  • 确认--device /dev/kfd/dev/dri已正确挂载
  • 检查 ROCm 驱动版本与容器镜像是否匹配
  • 使用rocminfo命令验证设备识别情况

6.3 训练过程中 OOM(内存溢出)

  • 减小train_batch_sizeppo_micro_batch_size_per_gpu
  • 开启 FSDP 参数卸载:param_offload=True
  • 增加--shm-size到 256G 以上

7. 总结:让多节点训练变得简单可靠

通过本文提供的slurm_script.sh脚本,你现在可以:

✅ 一键启动 verl 多节点训练
✅ 自动构建容器环境
✅ 无缝集成 Ray 分布式框架
✅ 支持 AMD ROCm 与 NVIDIA CUDA 双平台
✅ 实现高吞吐、低延迟的 RLHF 训练

verl 的设计理念是“让研究人员专注于算法,而不是运维”。借助这套脚本,即使是刚接触分布式训练的新手,也能快速跑通完整的 PPO 流程。

下一步你可以尝试:

  • 替换不同的基础模型(如 Llama3、DeepSeek)
  • 调整 RL 超参(KL 系数、学习率等)
  • 接入自定义数据集进行微调

记住,强大的工具只是起点,真正的价值在于你如何用它创造出更好的 AI。


获取更多AI镜像

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1192474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Emotion2Vec+ Large最佳音频时长?1-30秒范围内最优选择

Emotion2Vec Large最佳音频时长&#xff1f;1-30秒范围内最优选择 1. 引言&#xff1a;为什么音频时长如此关键&#xff1f; 你有没有遇到过这种情况&#xff1a;上传一段语音&#xff0c;系统识别出的情感结果模棱两可&#xff0c;甚至完全不对&#xff1f; 可能问题并不在模…

FreeCAD完全指南:免费3D建模从入门到精通

FreeCAD完全指南&#xff1a;免费3D建模从入门到精通 【免费下载链接】FreeCAD This is the official source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler. 项目地址: https://gitcode.com/GitHub_Trending/fr/freecad 还在为昂贵的专…

Kronos时序认知引擎:重塑量化投研的AI决策新范式

Kronos时序认知引擎&#xff1a;重塑量化投研的AI决策新范式 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 当传统量化模型在K线语义化理解上频频碰壁&am…

老旧Mac焕新秘籍:用OpenCore Legacy Patcher重获青春活力

老旧Mac焕新秘籍&#xff1a;用OpenCore Legacy Patcher重获青春活力 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还记得那个曾经陪伴你度过无数个日夜的Mac吗&#xf…

Czkawka完全教程:掌握专业存储清理的终极方法

Czkawka完全教程&#xff1a;掌握专业存储清理的终极方法 【免费下载链接】czkawka 一款跨平台的重复文件查找工具&#xff0c;可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点&#xff0c;帮助用户释放存储空间。 项目地址: https://gitcode.com…

手把手教你部署Open-AutoGLM,轻松打造专属手机AI助理

手把手教你部署Open-AutoGLM&#xff0c;轻松打造专属手机AI助理 1. 引言&#xff1a;让AI接管你的手机操作 你有没有想过&#xff0c;有一天只需要对手机说一句“打开小红书&#xff0c;搜索附近的美食推荐”&#xff0c;手机就能自动完成打开App、输入关键词、浏览结果的全…

Mermaid Live Editor:零基础创建专业图表的最佳实践

Mermaid Live Editor&#xff1a;零基础创建专业图表的最佳实践 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …

Mermaid Live Editor:高效图表制作的智能解决方案

Mermaid Live Editor&#xff1a;高效图表制作的智能解决方案 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …

时延算路(网络转发路径的计算技术)

文章目录为什么需要时延算路时延算路的工作过程时延算路的应用案例算力和行业应用中的一些关键业务对时延非常敏感&#xff0c;提供满足时延需求的转发路径&#xff0c;确保业务体验和安全&#xff0c;就是时延算路的技术价值。华为SPN的1588精准时延算路技术具备纳秒级精度、智…

foobox-cn CD抓轨:从光盘到数字音乐的完美转换

foobox-cn CD抓轨&#xff1a;从光盘到数字音乐的完美转换 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还记得那些尘封在抽屉里的CD光盘吗&#xff1f;那些承载着青春记忆的音乐&#xff0c;如今可…

OpenCore Legacy Patcher完整指南:免费让老Mac焕发新生

OpenCore Legacy Patcher完整指南&#xff1a;免费让老Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为2012年之前的Mac无法安装最新macOS系统而苦恼吗&…

当透明遇上“自身错乱”:Babylon.js 深度预渲染与顺序无关透明(OIT)实战指南

一、问题现象&#xff1a;为什么“透明<1”就乱&#xff1f;如果使用PBRMetallicRoughnessMaterial&#xff0c;当alpha<1时&#xff0c;如果mesh本身比较复杂&#xff0c;往往看上去一团糟的&#xff0c;透明片叠加得乱七八糟得&#xff0c;这是因为透明队列不再写深度&…

Mermaid在线编辑器完全指南:10分钟掌握专业图表制作

Mermaid在线编辑器完全指南&#xff1a;10分钟掌握专业图表制作 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …

YOLOv12官版镜像一键部署指南,Jetson设备也能跑

YOLOv12官版镜像一键部署指南&#xff0c;Jetson设备也能跑 在智能工厂的质检线上&#xff0c;每分钟有上千个产品飞速流转&#xff0c;传统检测系统还在为是否漏检一个微小划痕而反复确认时&#xff0c;YOLOv12已经完成了整条产线的实时视觉分析——这不是未来构想&#xff0…

FSMN VAD依赖库管理:requirements.txt文件解析

FSMN VAD依赖库管理&#xff1a;requirements.txt文件解析 1. 为什么requirements.txt是FSMN VAD稳定运行的“隐形地基” 你可能已经成功跑通了科哥开发的FSMN VAD WebUI&#xff0c;上传音频、点击处理、秒出结果——整个过程丝滑得像喝一杯温水。但有没有想过&#xff0c;当…

AtlasOS终极性能优化指南:3步释放显卡隐藏性能

AtlasOS终极性能优化指南&#xff1a;3步释放显卡隐藏性能 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atlas…

Mermaid在线编辑器完全攻略:零基础到图表制作高手

Mermaid在线编辑器完全攻略&#xff1a;零基础到图表制作高手 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …

SGLang如何对接外部API?任务规划部署实战详解

SGLang如何对接外部API&#xff1f;任务规划部署实战详解 1. SGLang 简介与核心能力 SGLang全称Structured Generation Language&#xff08;结构化生成语言&#xff09;&#xff0c;是一个专为大模型推理优化而设计的高性能框架。它主要解决在实际部署中常见的高延迟、低吞吐…

5步轻松搞定:Czkawka重复文件清理全攻略

5步轻松搞定&#xff1a;Czkawka重复文件清理全攻略 【免费下载链接】czkawka 一款跨平台的重复文件查找工具&#xff0c;可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点&#xff0c;帮助用户释放存储空间。 项目地址: https://gitcode.com/GitH…

5分钟掌握专业CD抓轨:foobox-cn让光盘音乐完美数字化

5分钟掌握专业CD抓轨&#xff1a;foobox-cn让光盘音乐完美数字化 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还在为老旧CD光盘的音乐提取而烦恼&#xff1f;foobox-cn结合foobar2000的强大音频处…