news 2026/4/16 21:45:17

新手友好!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/4/16 12:15:55

网络安全技术栈硬核盘点:一文讲透关键领域的核心要点与高能总结

1.网络安全的概念 网络安全的定义 ISO对网络安全的定义&#xff1a;网络系统的软件、硬件以及系统中存储和传输的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭到破坏、更改、泄露&#xff0c;网络系统连续可靠正常地运行&#xff0c;网络服务不中断。 网络安全的属…

作者头像 李华
网站建设 2026/4/16 15:30:23

通义千问3-Embedding-4B应用实战:智能写作辅助工具

通义千问3-Embedding-4B应用实战&#xff1a;智能写作辅助工具 1. 引言 1.1 业务场景描述 在内容创作、技术文档撰写和多语言资料处理等场景中&#xff0c;高效的信息检索与语义理解能力是提升写作效率的核心。传统关键词匹配方式难以应对同义替换、跨语言表达和长文本上下文…

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

FunASR热词定制教程:10分钟学会提升专业术语识别

FunASR热词定制教程&#xff1a;10分钟学会提升专业术语识别 在医疗行业&#xff0c;医生每天要处理大量病历、会诊记录和患者沟通内容。传统的手动录入方式不仅耗时费力&#xff0c;还容易出错。语音转文字技术本应是理想的解决方案&#xff0c;但现实却常常让人失望——系统…

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

LobeChat知识库入门必看:云端按需付费成主流,1块钱起步

LobeChat知识库入门必看&#xff1a;云端按需付费成主流&#xff0c;1块钱起步 你是不是也遇到过这样的情况&#xff1f;应届生找工作&#xff0c;看到招聘要求写着“熟悉知识库系统”“具备AI助手使用经验”&#xff0c;心里一紧——这玩意儿学校没教啊&#xff01;网上搜教程…

作者头像 李华
网站建设 2026/4/16 12:15:25

AI Agent九种设计模式全景解析:来源、场景与选型指南

在AI Agent从“工具调用”走向“自主决策”的进化中,设计模式是定义其核心能力的“骨架”。本文整合学术理论与工程实践,系统拆解Agent领域最核心的九种设计模式,不仅详解每种模式的核心机制、适用场景、优劣势,还追溯其理论源头与框架关联,最终给出可落地的选型决策框架,…

作者头像 李华
网站建设 2026/4/16 13:56:20

GPT-SoVITS负载均衡:高并发场景下的多实例部署与调度策略

GPT-SoVITS负载均衡&#xff1a;高并发场景下的多实例部署与调度策略 1. 引言&#xff1a;GPT-SoVITS在语音合成中的应用挑战 随着生成式AI技术的快速发展&#xff0c;GPT-SoVITS作为一款融合了GPT语言建模能力与SoVITS声学模型优势的开源语音合成系统&#xff0c;已在个性化…

作者头像 李华