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

发布时间:2026/9/16 14:00:29
SkyPilot + Verl:在跨云 GPU 上运行 PPO/GRPO 大模型强化学习训练 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 环境中一键拉起 VerlVolcano 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_IPS、SKYPILOT_NODE_RANK、SKYPILOT_NUM_NODES、SKYPILOT_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 训练仅 WB 追踪 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 训练仅 WB 追踪 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 训练按成本最优选择可用 GPUsky launch -c verl llm/verl/multinode.yaml监控训练进度sky logs verl查看 Ray Dashboard分布式训练实时监控sky status --endpoint 8280 verlPPO 训练配置详解verl-ppo.yamlllm/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 张 H100infra: 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_TOKEN与WANDB_API_KEY在secrets中声明为null由命令行--secret传入。setup阶段会在远端节点完成创建 Python 3.10 虚拟环境uv venv --python 3.10 --seed、克隆 Verl 仓库并固定到提交83aebcc133663c12ac33ea3d5ba5c5c5b4687286、安装 cu126 版 PyTorch、flashinfer、vllm0.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_V11 ~/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_size256 \ data.max_prompt_length1024 \ data.max_response_length1024 \ data.filter_overlong_promptsTrue \ actor_rollout_ref.model.pathQwen/Qwen2.5-0.5B-Instruct \ actor_rollout_ref.actor.optim.lr1e-6 \ actor_rollout_ref.actor.ppo_mini_batch_size64 \ actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu4 \ actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu8 \ actor_rollout_ref.rollout.tensor_model_parallel_size1 \ actor_rollout_ref.rollout.namevllm \ actor_rollout_ref.rollout.gpu_memory_utilization0.4 \ actor_rollout_ref.rollout.trace.backendweave \ actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu4 \ actor_rollout_ref.actor.fsdp_config.model_dtypebfloat16 \ critic.optim.lr1e-5 \ critic.model.pathQwen/Qwen2.5-0.5B-Instruct \ critic.ppo_micro_batch_size_per_gpu4 \ algorithm.kl_ctrl.kl_coef0.001 \ trainer.logger[console,wandb] \ trainer.n_gpus_per_node$NUM_GPUS_PER_NODE \ trainer.nnodes$NUM_NODES \ trainer.save_freq10 \ 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.yamlllm/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 数据格式prompt、ability: code、reward_model.style: rule等字段通过/code文件挂载mode: COPY分发到训练节点算法algorithm.adv_estimatorgrpo并配套actor_rollout_ref.actor.ppo_epochs1、actor_rollout_ref.actor.use_kl_lossFalse、algorithm.use_kl_in_rewardFalse、actor_rollout_ref.actor.entropy_coeff0等 GRPO 典型设置显存优化开启enable_gradient_checkpointingTrueFSDP 参数/优化器 offloadparam_offload、optimizer_offload模型为 7B 量级的Qwen/Qwen2.5-7B-Instructtrain_batch_size32明显小于 PPO 示例推理后端同样使用 vLLMactor_rollout_ref.rollout.namevllm并开启enable_chunked_prefillTrue、max_num_batched_tokens2048以降低长序列 prefilled 的显存峰值。多节点 RLHF 训练详解multinode.yamlllm/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:8、A100-80GB:8、H100:8之间按可用性与价格自动选择可通过cloud:字段固定例如注释中的cloud: lambda。setup阶段通过 Verl 的scripts/install_vllm_sglang_mcore.shUSE_MEGATRON0安装推理与训练依赖。运行阶段与单节点版本的主要区别头节点负责数据与模型准备下载 GSM8K 数据集、预热模型权重到缓存通过环境变量自定义 Ray 端口RAY_HEAD_PORT6385、RAY_DASHBOARD_PORT8280等后执行start_cluster训练任务以 Ray Job 方式提交ray job submit --addresshttp://localhost:8280 --runtime-envruntime_env_custom.yamlruntime env 中注入TORCH_NCCL_AVOID_RECORD_STREAMS、CUDA_DEVICE_MAX_CONNECTIONS等 NCCL 调优项训练命令复用verl.trainer.main_ppo参数通过$MODEL_NAME、$ACTOR_LR、$CRITIC_LR、$TOTAL_EPOCHS环境变量模板化并启用trainer.resume_modeauto支持断点续训。若需启用 WB 日志按文件注释操作即可在envs或--secret提供WANDB_API_KEY将trainer.logger改为[console, wandb]并设置trainer.wandb_project与trainer.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_KEYyour_key_here \ --env GOOGLE_CSE_IDyour_cse_id_here \ -yllm/verl/search-tooling/verl-search-interaction-google-search.yaml 要求提供 Google API Key 与 Custom Search EngineCSEID缺少时会直接报错退出运行阶段启动 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 \ -yllm/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 8000llm/verl/search-tooling/verl-search-interaction-retrieval.yaml 是一个纯 CPU 检索服务CPU 版 PyTorch faiss-cpu FastAPI/uvicornsetup通过sed注释掉retrieval_server.py中的 CUDA 调用以适配 CPU-only 部署。作为 SkyServe 服务replicas: 3、readiness_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 开启 WB 日志 sky launch -c verl-train llm/verl/search-tooling/verl-search-interaction-rl-trainer.yaml \ --env RETRIEVAL_SERVICE_URLhttp://$RETRIEVAL_IP \ --env DATASET_SIZEsmall \ --env TOTAL_EPOCHS1 -y这两个训练 YAML 的关键特征多轮工具交互配置actor_rollout_ref.rollout.namesglang而非 vLLM、data.return_raw_chatTrue、actor_rollout_ref.rollout.multi_turn.max_assistant_turns2通过actor_rollout_ref.rollout.multi_turn.tool_config_path指向search_tool_config.yaml训练配置基于 Verl 的search_multiturn_grpo配置GRPO 变体algorithm.adv_estimatorgrpo、KL 使用use_kl_lossTruekl_loss_typelow_var_kl低方差 KL 变体algorithm.use_kl_in_rewardFalse长上下文data.max_prompt_length4096、data.max_response_length3000、actor_rollout_ref.rollout.max_model_len15000采样数actor_rollout_ref.rollout.n5数据规模可控DATASET_SIZE支持small1000 训练 / 200 测试、medium10k / 2k、full三档便于快速验证外置检索接线rl-trainer 变体在setup中用sed将search_tool_config.yaml中的本地地址http://127.0.0.1:8000/retrieve替换为$RETRIEVAL_SERVICE_URL/retrieve并将num_workers从 120 调低到 8run阶段还会用curl -X POST {URL}/retrieve做连通性探测最多重试 30 次容器级联调两个训练 YAML 都通过config.docker.run_options注入--cap-addSYS_PTRACEPyTorch 多进程 CUDA tensor 共享所需、--ipchost与--shm-size16g训练收尾与单节点 PPO/GRPO 一致训练后读取最新 checkpoint、verl.model_merger merge合并出/checkpoints/hf_model并清理后台检索进程。端到端工作流总结综合上述配置一条完整的“训练 → 导出 → 部署”链路是启动训练sky launch -c verl-ppo llm/verl/verl-ppo.yaml --secret WANDB_API_KEY --secret HF_TOKEN --num-nodes 1 -y或使用 GRPO / 多节点 / 搜索工具变体监控sky logs verl-ppo查看训练日志与 reward 曲线sky status --endpoint 8265 verl-ppo打开 Ray Dashboard 查看分布式资源与 worker 状态产物导出训练结束自动合并 FSDP checkpoint 到/checkpoints/hf_model并可选上传 Hugging Face本地推理同节点自动vllm serve到 9090 端口通过sky status --endpoint 9090获取公网地址更复杂的搜索/检索场景则使用 llm/verl/search-tooling 下的推理 YAML清理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.pyRay 集群启动脚本SkyPilot 分发给每个节点sky_templates/raySkyPilot 分布式任务环境变量注入实现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),仅供参考