news 2026/1/22 4:10:35

新手友好!verl配合Slurm脚本轻松上手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
新手友好!verl配合Slurm脚本轻松上手

新手友好!verl配合Slurm脚本轻松上手

1. 引言:为什么选择 verl + Slurm 进行多节点训练?

在大型语言模型(LLM)的后训练阶段,强化学习(Reinforcement Learning, RL)已成为提升模型推理能力、对齐人类偏好和优化任务表现的关键技术。然而,RL 训练流程复杂、资源消耗大,尤其在多节点分布式环境下,如何高效管理计算资源、协调进程通信并确保稳定运行,是工程落地中的核心挑战。

verl是由字节跳动火山引擎团队开源的一个专为 LLM 后训练设计的强化学习框架,基于其论文HybridFlow实现。它具备模块化 API、高吞吐性能、灵活并行策略以及与 HuggingFace 模型无缝集成等优势,特别适合生产级大规模训练场景。

与此同时,在高性能计算(HPC)集群中,Slurm作为主流的作业调度系统,能够有效管理 GPU 资源、支持多节点协同,并提供稳定的任务监控机制。将 verl 与 Slurm 结合使用,既能发挥 verl 在 RL 流程上的效率优势,又能借助 Slurm 实现资源的统一调度与运维简化。

本文面向初学者,详细介绍如何通过一个完整的slurm_script.sh脚本,在 AMD ROCm 架构的多节点集群上部署 verl 的 PPO 训练任务。我们将从环境准备到训练启动,逐步解析关键配置项与执行逻辑,帮助你快速上手这一组合方案。


2. verl 核心特性与架构优势

2.1 模块化设计与易扩展性

verl 采用模块化解耦的设计思想,将Actor 模型、Critic 模型、Rollout 推理、PPO 更新等组件独立封装,允许用户灵活替换不同实现。例如:

  • Rollout 可选用 vLLM 或 Megatron-LM;
  • 训练后端可对接 FSDP、DeepSpeed 等分布式策略;
  • 数据流可通过 Hybrid 编程模型自定义控制逻辑。

这种解耦结构使得开发者可以在不修改整体框架的前提下,快速实验新的算法变体或集成已有基础设施。

2.2 高效的 3D-HybridEngine 与重分片机制

verl 内置3D-HybridEngine,结合了数据并行、张量并行和流水线并行的优势,同时引入“重分片”(resharding)机制,在生成阶段与训练阶段之间动态调整模型参数分布,避免冗余内存占用和跨设备通信开销。

这意味着: - 生成时使用低显存模式(如 vLLM 的 PagedAttention); - 训练时自动切换至 FSDP 分布式训练结构; - 中间无需保存中间状态文件,显著提升端到端吞吐。

2.3 与主流生态无缝集成

verl 支持直接加载 HuggingFace Transformers 模型,兼容transformers.pipeline接口,便于快速验证模型可用性。此外,它原生支持 PyTorch FSDP、vLLM、Megatron-LM 等主流框架,极大降低了迁移成本。


3. 多节点训练环境搭建详解

3.1 前置条件与依赖说明

要成功运行 verl 的多节点训练任务,需满足以下条件:

条件说明
集群环境支持 Slurm 调度系统的多节点 GPU 集群
GPU 类型AMD MI300 或 NVIDIA A100/H100(本文以 MI300 为例)
容器支持Docker 或 Podman(推荐使用 Docker)
网络配置IB/RoCE 网络支持,NCCL/RCCL 正确配置
存储路径所有节点共享$HOME目录或 NFS 挂载点

注意:当前 verl 对 Ray 版本敏感,建议使用Ray ≥ 2.40,旧版本可能存在兼容问题。


3.2 Slurm 脚本结构总览

提供的slurm_script.sh是一个完整的多节点训练入口脚本,包含以下主要阶段:

  1. Slurm 作业声明
  2. 环境变量设置
  3. Docker 容器构建与启动
  4. Ray 集群初始化(Head + Worker)
  5. 数据预处理
  6. 模型加载测试
  7. 正式训练启动

我们逐段解析其关键部分。


4. 关键脚本段落解析

4.1 Slurm 作业头配置

#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,适用于单机八卡配置。
  • --nodelist=gpu-[0,1]:明确指定使用的主机名列表。
  • --output--error:日志输出路径,%j表示作业 ID,便于追踪。

⚠️ 若你的集群命名规则不同,请根据实际情况修改nodelist


4.2 环境变量设置(AMD ROCm 专用)

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 CUDA_DEVICE_MAX_CONNECTIONS=1 export NCCL_PROTO=Simple export RCCL_MSCCL_ENABLE=0 export TOKENIZERS_PARALLELISM=false export HSA_NO_SCRATCH_RECLAIM=1

这些是针对AMD MI300 + InfiniBand 网络的关键通信调优参数:

  • NCCL_IB_HCA:指定 RDMA 设备名称(需根据ibdev2netdev输出确认);
  • RCCL_MSCCL_ENABLE=0:关闭 MSCCL(Multi-Stream CCCL),防止某些版本冲突;
  • HSA_NO_SCRATCH_RECLAIM=1:避免 ROCm 内存回收导致性能下降。

✅ 建议在实际部署前运行ibdev2netdev查看 IB 设备映射关系。


4.3 Docker 容器管理逻辑

该脚本通过srun bash -c "..."在所有节点上并行执行容器操作:

构建镜像(若不存在)
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
  • 使用本地Dockerfile.rocm构建支持 ROCm 的镜像;
  • 镜像标签为verl.rocm,可提前构建好以节省时间。
启动容器(privileged 模式)
docker run --rm -d \ -e HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ --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} \ -w "${verl_workdir}" \ --shm-size 128G \ --name "${CONTAINER_NAME}" \ "${IMG}" tail -f /dev/null

关键选项说明:

参数作用
--network host共享主机网络栈,便于 Ray 节点通信
--device /dev/infiniband挂载 IB 设备,支持高速通信
--privileged提供足够权限运行 ROCm 和调试工具
--shm-size 128G增大共享内存,防止 PyTorch DataLoader 死锁
tail -f /dev/null容器保持运行状态,等待后续命令注入

4.4 Ray 集群初始化流程

获取 Head 节点 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)

利用scontrolhostname --ip-address动态获取 head 节点 IP,确保跨节点通信可达。

启动 Ray 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 &
  • --head:标识为主节点;
  • --block:保持前台运行,防止进程退出;
  • --dashboard-port=8266:避免与默认 8265 冲突(Slurm 可能复用端口);
启动 Worker 节点
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 ... --block & sleep 5 done

每个 worker 节点连接到 head 节点的地址(ip_head=xxx:6379),形成完整 Ray 集群。


4.5 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() except Exception as e: print(f"Ray initialization failed: {str(e)}") '

此段代码用于检测 Ray 集群是否正常建立。输出应显示两个活跃节点,否则需检查网络或防火墙设置。


4.6 数据预处理与模型加载

docker exec "${CONTAINER_NAME}" \ python3 "examples/data_preprocess/gsm8k.py" "--local_dir" "../data/gsm8k" docker exec "${CONTAINER_NAME}" \ python3 -c "import transformers; transformers.pipeline('text-generation', model='Qwen/Qwen2-7B-Instruct')"
  • 预处理 GSM8K 数学推理数据集;
  • 测试模型能否成功加载(避免训练时才发现下载失败);

💡 建议提前缓存模型至$TRANSFORMERS_CACHE,避免重复下载。


4.7 启动 PPO 训练主程序

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 \ ... trainer.nnodes=${SLURM_NNODES}
  • --overlap:允许标准输出实时打印;
  • main_ppo:PPO 主训练入口;
  • 所有超参通过命令行传入,符合 Hydra 配置风格;
  • trainer.nnodestrainer.n_gpus_per_node自动继承 Slurm 变量。

5. 如何运行该脚本?

只需将上述slurm_script.sh保存为文件,并提交作业:

sbatch slurm_script.sh

随后可通过以下方式监控任务:

  • 查看日志:tail -f ../verl_log/slurm-*.out
  • 查看 Ray Dashboard:访问http://<head_node>:8266
  • 检查作业状态:squeue -u $USER

6. 常见问题与调试建议

6.1 容器无法启动:设备未挂载

现象docker: Error response from daemon: device not found
解决方法:确认/dev/dri,/dev/kfd,/dev/infiniband在宿主机存在,并正确挂载。

6.2 Ray 连接超时

现象:Worker 报错ConnectionRefusedError
原因:防火墙阻止 6379 端口,或 head 节点 IP 获取错误
建议: - 使用hostname --ip-address确认真实 IP; - 开放 6379~6383 端口; - 设置NCCL_SOCKET_IFNAME=ib0明确通信接口。

6.3 训练卡住或显存不足

建议调整参数: - 降低ppo_micro_batch_size_per_gpu- 启用fsdp_config.param_offload=True- 设置gpu_memory_utilization=0.8控制 vLLM 显存使用


7. 总结

本文详细解析了如何使用 verl 框架结合 Slurm 脚本在多节点 AMD 集群上开展强化学习训练。通过一个完整的slurm_script.sh示例,我们展示了从作业调度、容器管理、Ray 集群构建到最终训练启动的全流程。

该方案具有以下优点:

  1. 自动化程度高:一键提交即可完成全链路部署;
  2. 资源利用率高:利用 Ray + vLLM + FSDP 实现高效并行;
  3. 易于调试与维护:日志集中、Dashboard 可视化;
  4. 生产就绪:适用于长期运行的大规模训练任务。

对于希望将 LLM 后训练流程工业化的团队来说,verl + Slurm是一个值得尝试的技术组合。未来我们也将持续关注其在更多硬件平台(如 NVIDIA + DPDK)上的适配进展。


获取更多AI镜像

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

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

5分钟部署TurboDiffusion,清华视频生成加速框架实测体验

5分钟部署TurboDiffusion&#xff0c;清华大学视频生成加速框架实测体验 1. TurboDiffusion技术背景与核心价值 1.1 技术发展历程 TurboDiffusion是由清华大学、生数科技和加州大学伯克利分校联合推出的视频生成加速框架。该框架解决了传统扩散模型在视频生成过程中存在的计…

作者头像 李华
网站建设 2026/1/18 23:12:30

YOLOv12环境配置总报错?官版镜像开箱即用避坑指南

YOLOv12环境配置总报错&#xff1f;官版镜像开箱即用避坑指南 你是不是也遇到过这种情况&#xff1a;兴致勃勃想上手最新的YOLOv12目标检测模型&#xff0c;结果刚打开GitHub仓库就一头雾水。安装依赖、配置CUDA、编译PyTorch扩展……折腾了整整两天&#xff0c;不是版本不兼容…

作者头像 李华
网站建设 2026/1/17 3:22:23

敏捷与韧性:新能源汽车智慧供应链的协同网络

“当一辆车在道路上每一次加速、每一次充电、每一次辅助驾驶介入的数据&#xff0c;都能被自动采集、分析并反馈至研发端优化下一代产品&#xff0c;当一次潜在故障能在发生前被预警并自动预约服务时&#xff0c;汽车便不再是‘交付即终点’的孤立商品&#xff0c;而成为一个持…

作者头像 李华
网站建设 2026/1/21 13:53:52

VibeVoice-TTS-Web-UI实战分享:短视频配音批量生产的流水线搭建

VibeVoice-TTS-Web-UI实战分享&#xff1a;短视频配音批量生产的流水线搭建 1. 引言&#xff1a;从零构建高效的TTS生产流程 随着短视频内容的爆发式增长&#xff0c;高质量、高效率的语音合成&#xff08;Text-to-Speech, TTS&#xff09;已成为内容创作者的核心需求。传统配…

作者头像 李华
网站建设 2026/1/16 13:12:14

Qwen3-0.6B智能写作:辅助创作营销文案的完整流程

Qwen3-0.6B智能写作&#xff1a;辅助创作营销文案的完整流程 1. 技术背景与应用场景 在内容营销日益重要的今天&#xff0c;高效生成高质量文案成为企业提升传播效率的关键。传统文案创作依赖人工构思、撰写和优化&#xff0c;周期长且成本高。随着大语言模型&#xff08;LLM…

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

IQuest-Coder-V1量化版体验:云端GPU轻松跑动,省90%显存

IQuest-Coder-V1量化版体验&#xff1a;云端GPU轻松跑动&#xff0c;省90%显存 你是不是也遇到过这种情况&#xff1a;看到一个性能超强的AI代码大模型&#xff0c;比如最近火出圈的 IQuest-Coder-V1-40B&#xff0c;实测在SWE-bench上解决率高达76.2%&#xff0c;BigCodeBenc…

作者头像 李华