SkyPilot + Verl:在跨云 GPU 上运行 PPO/GRPO 大模型强化学习训练
2026/9/16 14:00:27 网站建设 项目流程

SkyPilot + Verl:在跨云 GPU 上运行 PPO/GRPO 大模型强化学习训练

【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot

本指南以 llm/verl/README.md 为核心,讲解如何使用 SkyPilot 在跨云与 Kubernetes 环境中一键拉起 Verl(Volcano Engine Reinforcement Learning)强化学习训练任务。你将掌握单节点 PPO/GRPO 智能体训练的启动命令、多节点 RLHF 训练的集群编排、训练日志与 Ray Dashboard 的监控方法,以及基于搜索工具(Google Search / Wikipedia FAISS)的 Search-R1 风格训练与推理配置。

背景:为什么把 Verl 跑在 SkyPilot 上

Verl 是目前开源社区中流行的 LLM 强化学习框架,支持 PPO、GRPO 等多种算法(相关声明见 llm/verl/README.md)。它需要分布式 Ray 集群、多 GPU 资源与复杂的环境安装,而 SkyPilot 恰好把这些环节自动化,两者的结合体现在三个核心优势:

  • 快速获取 GPU:一条sky launch命令即可在 AWS、GCP、Azure、Nebius 等云厂商及 Kubernetes 上申请 GPU 实例,无需手动配置云资源;
  • 更低的训练成本:SkyPilot 支持抢占式(spot)实例,可显著降低 RL 训练这种迭代型负载的账单;
  • 零配置的分布式集群:SkyPilot 自动拉起 Ray 集群,为每个节点注入SKYPILOT_NODE_IPSSKYPILOT_NODE_RANKSKYPILOT_NUM_NODESSKYPILOT_NUM_GPUS_PER_NODE等环境变量(相关实现见 sky/backends/task_codegen.py 与 sky/skylet/constants.py),训练脚本无需自己发现节点 IP 与拓扑。

仓库中 llm/verl 目录提供了 PPO、GRPO、多节点、搜索工具训练/推理共 7 个可直接运行的 SkyPilot YAML,配套数据预处理脚本位于 llm/verl/code/preprocess_rstar_coder.py。

快速开始:单节点 PPO 与 GRPO 智能体训练

在已安装 SkyPilot 的客户端上,进入仓库根目录,即可用以下命令启动单节点训练:

# PPO 训练(仅 W&B 追踪) sky launch -c verl-ppo llm/verl/verl-ppo.yaml --secret WANDB_API_KEY --num-nodes 1 -y # PPO 训练(同时注入 Hugging Face Token,训练结束会上传模型) sky launch -c verl-ppo llm/verl/verl-ppo.yaml --secret WANDB_API_KEY --secret HF_TOKEN --num-nodes 1 -y # GRPO 训练(仅 W&B 追踪) sky launch -c verl-grpo llm/verl/verl-grpo.yaml --secret WANDB_API_KEY --num-nodes 1 -y # GRPO 训练(同时注入 HF_TOKEN) sky launch -c verl-grpo llm/verl/verl-grpo.yaml --secret WANDB_API_KEY --secret HF_TOKEN --num-nodes 1 -y

其中--secret将本机环境变量安全注入远端节点,--num-nodes 1明确使用单节点,-y跳过交互确认。

启动多节点 RLHF 训练(按成本最优选择可用 GPU):

sky launch -c verl llm/verl/multinode.yaml

监控训练进度:

sky logs verl

查看 Ray Dashboard(分布式训练实时监控):

sky status --endpoint 8280 verl

PPO 训练配置详解:verl-ppo.yaml

llm/verl/verl-ppo.yaml 是单节点 PPO 数学推理训练的完整配置,核心结构如下:

resources: infra: nebius # 指定云厂商 accelerators: H100:1 # 单卡 H100 memory: 128+ # 至少 128GB 内存 image_id: docker:verlai/verl:app-verl0.6-transformers4.56.1-sglang0.5.2-mcore0.13.0-te2.2 ports: - 8265 # Ray Dashboard - 9090 # vLLM 服务端口 num_nodes: 1 envs: TOTAL_EPOCHS: 1 WANDB_PROJECT_NAME: skypilot-verl WANDB_EXPERIMENT_NAME: ppo-math CHECKPOINT_BUCKET_NAME: sky-verl-ppo-checkpoints HF_UPLOAD_MODEL_NAME: "maknee/verl-ppo-math" SAVE_FINAL_MODEL_HF_PATH: /checkpoints/hf_model file_mounts: /checkpoints: store: nebius name: ${CHECKPOINT_BUCKET_NAME} mode: MOUNT secrets: HF_TOKEN: null WANDB_API_KEY: null

配置要点说明:

  • 资源规格H100:1表示申请 1 张 H100;infra: nebius固定使用 Nebius 云;image_id使用 Verl 官方 Docker 镜像,内置了 verl 0.6、transformers 4.56.1、sglang 0.5.2、megatron-core 0.13.0 与 tensorrt-llm 2.2,省去大部分环境安装时间;
  • 端口声明:8265 供 Ray Dashboard 使用,9090 供训练结束后的 vLLM 推理服务使用,SkyPilot 会为其自动分配公网端点;
  • 文件挂载/checkpoints通过store: nebius对象存储以 MOUNT 模式挂载,checkpoint 持久化在云上,训练中断或换节点后可继续读取;
  • 密钥注入HF_TOKENWANDB_API_KEYsecrets中声明为null,由命令行--secret传入。

setup阶段会在远端节点完成:创建 Python 3.10 虚拟环境(uv venv --python 3.10 --seed)、克隆 Verl 仓库并固定到提交83aebcc133663c12ac33ea3d5ba5c5c5b4687286、安装 cu126 版 PyTorch、flashinfervllm==0.10.0、flash-attention 2.8.3 预编译 wheel,以及ray[train]datasets等依赖。值得注意的一个兼容性处理:脚本将uvloop固定到 0.21.0,注释中说明这是为了规避 Verl 仓库 issue #3806 的 asyncio 事件循环 bug。

run阶段的关键逻辑:

HEAD_IP=$(echo "$SKYPILOT_NODE_IPS" | head -n1) NUM_NODES=$SKYPILOT_NUM_NODES NUM_GPUS_PER_NODE=$SKYPILOT_NUM_GPUS_PER_NODE NETWORK_INTERFACE=$(ip route get 8.8.8.8 | grep -oP 'dev \K\S+') export GLOO_SOCKET_IFNAME=$NETWORK_INTERFACE export NCCL_SOCKET_IFNAME=$NETWORK_INTERFACE export VLLM_USE_V1=1 ~/sky_templates/ray/start_cluster # SkyPilot 提供的 Ray 集群启动脚本

其中~/sky_templates/ray/start_cluster是 SkyPilot 分发的 Ray 集群初始化脚本(源码见 sky_templates/ray),它会自动以SKYPILOT_NODE_IPS中第一个 IP 作为 Ray head,将GLOO_SOCKET_IFNAME/NCCL_SOCKET_IFNAME指向探测到的网络接口,从而让分布式通信正确工作。

头节点(SKYPILOT_NODE_RANK == 0)会先轮询ray status等待所有 worker 加入(最多重试 30 次、每次间隔 10 秒),随后调用 Verl 训练入口:

python3 -m verl.trainer.main_ppo \ data.train_files=$HOME/data/math/train.parquet \ data.val_files=$HOME/data/math/test.parquet \ data.train_batch_size=256 \ data.max_prompt_length=1024 \ data.max_response_length=1024 \ data.filter_overlong_prompts=True \ actor_rollout_ref.model.path=Qwen/Qwen2.5-0.5B-Instruct \ actor_rollout_ref.actor.optim.lr=1e-6 \ actor_rollout_ref.actor.ppo_mini_batch_size=64 \ actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=4 \ actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=8 \ actor_rollout_ref.rollout.tensor_model_parallel_size=1 \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \ actor_rollout_ref.rollout.trace.backend=weave \ actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=4 \ actor_rollout_ref.actor.fsdp_config.model_dtype=bfloat16 \ critic.optim.lr=1e-5 \ critic.model.path=Qwen/Qwen2.5-0.5B-Instruct \ critic.ppo_micro_batch_size_per_gpu=4 \ algorithm.kl_ctrl.kl_coef=0.001 \ trainer.logger=[console,wandb] \ trainer.n_gpus_per_node=$NUM_GPUS_PER_NODE \ trainer.nnodes=$NUM_NODES \ trainer.save_freq=10 \ trainer.default_local_dir=/checkpoints \ trainer.total_epochs=${TOTAL_EPOCHS} \ trainer.project_name=$WANDB_PROJECT_NAME \ trainer.experiment_name=$WANDB_EXPERIMENT_NAME

这里使用的 math 数据集由setup阶段调用 Verl 仓库的examples/data_preprocess/math_dataset.py下载并切分为 train/test parquet 文件。训练结束后,脚本读取/checkpoints/latest_checkpointed_iteration.txt定位最新 checkpoint,用verl.model_merger merge--backend fsdp --tie-word-embedding)将 FSDP 分片合并为完整 HF 模型,保存到/checkpoints/hf_model;若注入了HF_TOKEN,还会通过--hf_upload_path ${HF_UPLOAD_MODEL_NAME}上传到 Hugging Face Hub。最后一步执行vllm serve /checkpoints/hf_model --host 0.0.0.0 --port 9090,把训练产物直接变成一个可调用的 OpenAI 兼容推理服务。worker 节点则通过ray start --address $HEAD_IP:6379加入集群。

GRPO 代码训练配置详解:verl-grpo.yaml

llm/verl/verl-grpo.yaml 演示了 GRPO 在代码生成任务上的用法,与 PPO 配置的差异集中在:

  • 数据集:使用 llm/verl/code/preprocess_rstar_coder.py 预处理microsoft/rStar-Coder合成数据(question + code/response 作为 ground truth),按 90/10 切分 train/test,并转换为 Verl 的 RL 数据格式(promptability: codereward_model.style: rule等字段),通过/code文件挂载(mode: COPY)分发到训练节点;
  • 算法algorithm.adv_estimator=grpo,并配套actor_rollout_ref.actor.ppo_epochs=1actor_rollout_ref.actor.use_kl_loss=Falsealgorithm.use_kl_in_reward=Falseactor_rollout_ref.actor.entropy_coeff=0等 GRPO 典型设置;
  • 显存优化:开启enable_gradient_checkpointing=True,FSDP 参数/优化器 offload(param_offloadoptimizer_offload),模型为 7B 量级的Qwen/Qwen2.5-7B-Instructtrain_batch_size=32明显小于 PPO 示例;
  • 推理后端:同样使用 vLLM(actor_rollout_ref.rollout.name=vllm),并开启enable_chunked_prefill=Truemax_num_batched_tokens=2048以降低长序列 prefilled 的显存峰值。

多节点 RLHF 训练详解:multinode.yaml

llm/verl/multinode.yaml 演示 2 节点 PPO 训练,核心结构:

resources: accelerators: - A100:8 - A100-80GB:8 - H100:8 use_spot: false ports: - 8280 # Ray dashboard 端口 num_nodes: 2 envs: HF_HUB_ENABLE_HF_TRANSFER: "1" TORCH_NCCL_AVOID_RECORD_STREAMS: "1" CHECKPOINT_BUCKET_NAME: sky-verl-checkpoints MODEL_NAME: Qwen/Qwen2.5-0.5B-Instruct TOTAL_EPOCHS: 3 ACTOR_LR: 1e-6 CRITIC_LR: 1e-5 file_mounts: /checkpoints: name: ${CHECKPOINT_BUCKET_NAME} mode: MOUNT

该配置不固定云厂商,SkyPilot 会在A100:8A100-80GB:8H100:8之间按可用性与价格自动选择(可通过cloud:字段固定,例如注释中的cloud: lambda)。setup阶段通过 Verl 的scripts/install_vllm_sglang_mcore.shUSE_MEGATRON=0)安装推理与训练依赖。

运行阶段与单节点版本的主要区别:

  1. 头节点负责数据与模型准备(下载 GSM8K 数据集、预热模型权重到缓存);
  2. 通过环境变量自定义 Ray 端口(RAY_HEAD_PORT=6385RAY_DASHBOARD_PORT=8280等)后执行start_cluster
  3. 训练任务以 Ray Job 方式提交:ray job submit --address=http://localhost:8280 --runtime-env=runtime_env_custom.yaml,runtime env 中注入TORCH_NCCL_AVOID_RECORD_STREAMSCUDA_DEVICE_MAX_CONNECTIONS等 NCCL 调优项;
  4. 训练命令复用verl.trainer.main_ppo,参数通过$MODEL_NAME$ACTOR_LR$CRITIC_LR$TOTAL_EPOCHS环境变量模板化,并启用trainer.resume_mode=auto支持断点续训。

若需启用 W&B 日志,按文件注释操作即可:在envs--secret提供WANDB_API_KEY,将trainer.logger改为['console', 'wandb'],并设置trainer.wandb_projecttrainer.wandb_run_name

进阶:Search-R1 风格的搜索工具训练与推理

除标准 RL 训练外,llm/verl/search-tooling 还提供了一整套工具增强(tool-augmented)“搜索”工作流配置,让模型学会在推理过程中调用外部检索工具(Search-R1 风格),包括 Google Search 后端推理、Wikipedia FAISS 检索服务以及检索增强的 RL 训练。

推理:Google Search 后端

启动依赖 Google 搜索的推理任务:

sky launch -c verl-infer-google llm/verl/search-tooling/verl-search-interaction-google-search.yaml \ --env MODEL_PATH=/checkpoints/hf_model \ --env GOOGLE_API_KEY=your_key_here \ --env GOOGLE_CSE_ID=your_cse_id_here \ -y

llm/verl/search-tooling/verl-search-interaction-google-search.yaml 要求提供 Google API Key 与 Custom Search Engine(CSE)ID(缺少时会直接报错退出),运行阶段启动 Search-R1 的google_search_server.py监听 8000 端口,随后执行infer.py完成工具调用式推理。

推理:同节点本地 Wikipedia 检索

sky launch -c verl-infer llm/verl/search-tooling/verl-search-interaction-infer.yaml \ --env MODEL_PATH=/checkpoints/hf_model \ -y

llm/verl/search-tooling/verl-search-interaction-infer.yaml 在 GPU 节点上同时运行 FAISS 检索服务与推理。setup阶段会下载 Wikipedia 语料wiki-18-100k.jsonl.gz与 E5 向量索引e5_Flat-100k.index(重命名为wiki-18.jsonl/e5_Flat.index并解压),运行阶段用retrieval_server.py --topk 3 --retriever_name e5 --retriever_model intfloat/e5-base-v2启动检索服务(默认返回 top-3 结果),再执行infer.py

检索服务:CPU 独立部署,供多个任务复用

# 方式一:普通任务 sky launch -c retrieval llm/verl/search-tooling/verl-search-interaction-retrieval.yaml --cpus 32+ --memory 256+ -y # 方式二:SkyServe 托管(推荐,自动扩缩容与健康检查) sky serve up -n retrieval llm/verl/search-tooling/verl-search-interaction-retrieval.yaml --cpus 32+ --memory 256+ -y sky serve status retrieval --endpoint 8000

llm/verl/search-tooling/verl-search-interaction-retrieval.yaml 是一个纯 CPU 检索服务:CPU 版 PyTorch +faiss-cpu+ FastAPI/uvicorn,setup通过sed注释掉retrieval_server.py中的 CUDA 调用以适配 CPU-only 部署。作为 SkyServe 服务(replicas: 3readiness_probe: /)时,训练任务可以稳定地按域名访问检索端点。

训练:检索增强的 GRPO 工具交互

两种训练模式:

  • 单节点一体化:检索服务与训练同节点运行,见 llm/verl/search-tooling/verl-search-interaction.yaml;
  • 外置检索服务:训练指向已部署的检索端点,见 llm/verl/search-tooling/verl-search-interaction-rl-trainer.yaml。

先启动外置检索服务,再启动训练:

# 1. 启动检索服务 sky launch -c retrieval llm/verl/search-tooling/verl-search-interaction-retrieval.yaml --cpus 32+ --memory 256+ -y # 2. 获取检索服务端点 RETRIEVAL_IP=$(sky status retrieval --endpoint 8000) # 3. 启动训练(可加 --secret WANDB_API_KEY 开启 W&B 日志) sky launch -c verl-train llm/verl/search-tooling/verl-search-interaction-rl-trainer.yaml \ --env RETRIEVAL_SERVICE_URL=http://$RETRIEVAL_IP \ --env DATASET_SIZE=small \ --env TOTAL_EPOCHS=1 -y

这两个训练 YAML 的关键特征:

  • 多轮工具交互配置actor_rollout_ref.rollout.name=sglang(而非 vLLM)、data.return_raw_chat=Trueactor_rollout_ref.rollout.multi_turn.max_assistant_turns=2,通过actor_rollout_ref.rollout.multi_turn.tool_config_path指向search_tool_config.yaml,训练配置基于 Verl 的search_multiturn_grpo配置;
  • GRPO 变体algorithm.adv_estimator=grpo、KL 使用use_kl_loss=True+kl_loss_type=low_var_kl(低方差 KL 变体),algorithm.use_kl_in_reward=False
  • 长上下文data.max_prompt_length=4096data.max_response_length=3000actor_rollout_ref.rollout.max_model_len=15000,采样数actor_rollout_ref.rollout.n=5
  • 数据规模可控DATASET_SIZE支持small(1000 训练 / 200 测试)、medium(10k / 2k)、full三档,便于快速验证;
  • 外置检索接线:rl-trainer 变体在setup中用sedsearch_tool_config.yaml中的本地地址http://127.0.0.1:8000/retrieve替换为$RETRIEVAL_SERVICE_URL/retrieve,并将num_workers从 120 调低到 8;run阶段还会用curl -X POST {URL}/retrieve做连通性探测(最多重试 30 次);
  • 容器级联调:两个训练 YAML 都通过config.docker.run_options注入--cap-add=SYS_PTRACE(PyTorch 多进程 CUDA tensor 共享所需)、--ipc=host--shm-size=16g
  • 训练收尾:与单节点 PPO/GRPO 一致,训练后读取最新 checkpoint、verl.model_merger merge合并出/checkpoints/hf_model,并清理后台检索进程。

端到端工作流总结

综合上述配置,一条完整的“训练 → 导出 → 部署”链路是:

  1. 启动训练sky launch -c verl-ppo llm/verl/verl-ppo.yaml --secret WANDB_API_KEY --secret HF_TOKEN --num-nodes 1 -y(或使用 GRPO / 多节点 / 搜索工具变体);
  2. 监控sky logs verl-ppo查看训练日志与 reward 曲线,sky status --endpoint 8265 verl-ppo打开 Ray Dashboard 查看分布式资源与 worker 状态;
  3. 产物导出:训练结束自动合并 FSDP checkpoint 到/checkpoints/hf_model,并可选上传 Hugging Face;
  4. 本地推理:同节点自动vllm serve到 9090 端口(通过sky status --endpoint 9090获取公网地址);更复杂的搜索/检索场景则使用 llm/verl/search-tooling 下的推理 YAML;
  5. 清理sky down verl-ppo释放集群(checkpoint 已持久化在云存储,不会丢失)。

参考与延伸阅读

  • 单节点 PPO 配置:llm/verl/verl-ppo.yaml
  • 单节点 GRPO 配置:llm/verl/verl-grpo.yaml
  • 多节点 RLHF 配置:llm/verl/multinode.yaml
  • 搜索工具训练/推理与检索服务:llm/verl/search-tooling(含 Google Search 推理、FAISS 检索服务、内外置检索训练四个 YAML 及使用说明)
  • rStar-Coder 代码数据集预处理:llm/verl/code/preprocess_rstar_coder.py
  • Ray 集群启动脚本(SkyPilot 分发给每个节点):sky_templates/ray
  • SkyPilot 分布式任务环境变量注入实现:sky/backends/task_codegen.py、sky/skylet/constants.py

需要说明的是,文中训练命令涉及的具体 Verl 版本、PyTorch 版本与云资源规格均以仓库内配置为准;start_cluster脚本要求skypilot-nightly >= 1.0.0.dev20251114,旧版本需手动从 sky_templates/ray/start_cluster 拷贝脚本。运行上述示例前,请确保已按 SkyPilot 官方方式完成云厂商凭据配置与安装。

【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询