AReaL × SkyPilot:在云端与 Kubernetes 上编排单机与多节点 GRPO 强化学习实验的实战指南

发布时间:2026/9/18 17:18:57
AReaL × SkyPilot:在云端与 Kubernetes 上编排单机与多节点 GRPO 强化学习实验的实战指南 AReaL × SkyPilot在云端与 Kubernetes 上编排单机与多节点 GRPO 强化学习实验的实战指南【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaLAReaLThe RL Bridge for LLM-based Agent Applications为大规模 LLM 强化学习训练提供了本地、Slurm、Ray 等多种启动方式。本文聚焦仓库中examples/skypilot目录下的官方示例讲解如何使用 SkyPilot 在 17 公有云或自有 Kubernetes 集群上一键拉起 AReaL 实验包括单节点 GSM8K GRPO 的极简启动、多节点场景下先用 SkyPilot 编排 Ray 集群再由 AReaL Ray Launcher 调度训练以及共享存储、InfiniBand 网络等关键细节。读完本文你将能基于 SkyPilot 在 GCP、AWS、K8s 等任意基础设施上复现 AReaL 的 GRPO 训练流程。一、方案概览为什么用 SkyPilot 跑 AReaLSkyPilot 是面向多云的作业编排框架它把申请 GPU 资源、上传代码、挂载存储、执行任务、自动回收整合为一条命令天然适配 AReaL 这类同时需要推理引擎SGLang/vLLM 训练引擎FSDP/Megatron的强化学习负载。在 AReaL 中SkyPilot 承担的是基础设施编排层的角色单节点场景SkyPilot 负责拉起一台带 GPU 的节点实验本身由 AReaL 的 local launcher 在节点内完成进程调度对应scheduler.typelocal多节点场景SkyPilot 负责跨节点拉起 Ray 集群实验由 AReaL 的 Ray launcher 在 Ray 之上完成分布式调度对应scheduler.typeray。官方在 docs/en/tutorial/installation.md 中把 SkyPilot 列为可选安装项并在 examples/skypilot/README.md 中提供了经 GCP 与 Kubernetes 集群实测的单/多节点完整示例。所有示例命令均要求在AReaL 仓库根目录下执行这一点务必注意。二、前置条件安装并验证 SkyPilot运行示例前请先按照官方安装指南完成 SkyPilot 的安装。以 GCP 和 Kubernetes 为例最小步骤如下通过 pip 安装# 在 conda 环境中执行 # NOTE: SkyPilot 要求 3.7 python 3.13 pip install -U skypilot[gcp,kubernetes]GCP 认证# 安装 Google Cloud SDK conda install -y -c conda-forge google-cloud-sdk # 初始化 gcloud 并选择账号/项目 gcloud init # 可选显式指定项目 gcloud config set project PROJECT_ID # 创建 Application Default Credentials gcloud auth application-default loginKubernetes 配置如果选择在 Kubernetes 上运行需要先完成 SkyPilot 的 Kubernetes 集群接入配置包含 kubeconfig、RBAC、storage class 等具体以 SkyPilot 官方 Kubernetes 设置指南为准。验证安装sky check当输出中出现GCP: enabled或Kubernetes: enabled时说明 SkyPilot 已就绪可以继续执行下文示例。三、单节点实验一条命令拉起 GSM8K GRPO单节点场景下你只需要用 SkyPilot 准备一台节点实验本身交给 AReaL 的 local launcher 执行。仓库提供了现成的 single_node.sky.yaml可在单条命令中启动一个完整的 GSM8K GRPO 实验。3.1 配置清单与字段解读name: areal-test-skypilot resources: accelerators: A100:2 autostop: idle_minutes: 10 down: true cpus: 8 memory: 32GB disk_size: 256GB image_id: docker:ghcr.io/areal-project/areal-runtime:v2.1.0-sglang num_nodes: 1 file_mounts: /storage: # Should be consistent with the storage paths set in gsm8k_grpo_ray.yaml source: s3://my-bucket/ # or gs://, https://azure_storage_account.blob.core.windows.net/container, r2://, cos://region/bucket, oci://bucket_name mode: MOUNT # MOUNT or COPY or MOUNT_CACHED. Defaults to MOUNT. Optional. workdir: . run: | python3 examples/math/gsm8k_rl.py \ --config examples/math/gsm8k_grpo.yaml \ scheduler.typelocal \ experiment_namegsm8k-grpo \ trial_nametrial0 \ cluster.n_nodes1 \ cluster.n_gpus_per_node$SKYPILOT_NUM_GPUS_PER_NODE \ rollout.backendsglang:d1 \ actor.backendfsdp:d1 \ train_dataset.batch_size4 \ actor.mb_spec.max_tokens_per_mb4096各字段的作用如下字段取值说明resources.acceleratorsA100:2每节点申请 2 张 A100 GPUresources.autostopidle_minutes: 10, down: true空闲 10 分钟后自动关停并销毁节点节省成本resources.cpus/memory8/32GBCPU 与内存下限约束resources.disk_size256GB系统盘大小resources.image_iddocker:ghcr.io/areal-project/areal-runtime:v2.1.0-sglang使用 AReaL 官方运行时镜像内含 SGLang 环境num_nodes1单节点file_mounts/storage ← s3://my-bucket/将云端存储桶挂载到节点/storagemode: MOUNT为只读直挂可选COPY/MOUNT_CACHED默认MOUNTworkdir.将当前目录AReaL 仓库上传为工作目录run训练命令SkyPilot 在节点上执行的入口脚本注意file_mounts中的挂载点/storage必须与实验配置里设定的存储路径保持一致——在 gsm8k_grpo_ray.yaml 中对应cluster.fileroot: /storage/experiments。3.2 训练命令逐参数解读run段的核心是调用 examples/math/gsm8k_rl.py 并传入 YAML 配置与命令行覆盖项--config examples/math/gsm8k_grpo.yaml基础实验配置定义了 GRPO 算法的全部超参数见下文 3.3scheduler.typelocal选用 AReaL local launcher 进行进程级调度cluster.n_nodes1、cluster.n_gpus_per_node$SKYPILOT_NUM_GPUS_PER_NODE$SKYPILOT_NUM_GPUS_PER_NODE是 SkyPilot 注入的环境变量自动取值为节点 GPU 数此处为 2无需硬编码rollout.backendsglang:d1推理后端使用 1 路 SGLangd1表示 data parallel1actor.backendfsdp:d1训练后端使用 FSDPdata parallel1train_dataset.batch_size4、actor.mb_spec.max_tokens_per_mb4096控制训练 batch 与单 micro-batch 的 token 上限用于在 2 卡小规模环境下收敛显存。3.3 启动命令sky launch -c areal-test examples/skypilot/single_node.sky.yaml-c areal-test为集群命名便于复用或停止。如需指定具体云厂商/基础设施追加--infrasky launch -c areal-test examples/skypilot/single_node.sky.yaml --infra gcp sky launch -c areal-test examples/skypilot/single_node.sky.yaml --infra aws sky launch -c areal-test examples/skypilot/single_node.sky.yaml --infra k8s3.4 底层执行链路源码佐证从源码结构看scheduler.typelocal最终落到 areal/infra/launcher/local.py 的LocalLauncher它首先根据配置的分配模式如sglang:d1通过areal.infra.launcher.sglang_server模块拉起 LLM 推理服务器并通过 name resolve 机制等待服务器地址就绪wait_llm_server_addrs见 local.py随后以torchrun --nnodes 1 --nproc-per-node n --master-addr localhost --master-port port方式启动 trainer 进程见 local.py并注入AREAL_LLM_SERVER_ADDRS、AREAL_SPMD_MODE1等环境变量GPU 通过 round-robin 方式从CUDA_VISIBLE_DEVICES或其他平台设备控制变量中轮询分配见 local.py。而训练入口 examples/math/gsm8k_rl.py 会加载GRPOConfig、构造 GSM8K 训练/验证数据集再以areal.workflow.openai.math_agent.MathAgent作为 rollout workflow 交给PPOTrainer执行 GRPO 训练。基础配置 examples/math/gsm8k_grpo.yaml 中定义了gconfig.n_samples4每组采样数、actor.eps_clip0.4、actor.reward_scaling10.0、actor.kl_ctl0.0解耦 GRPO 损失、actor.rejection_sampling.metricratio等关键超参数SkyPilot 的run段只是通过命令行覆盖其中少量字段。四、多节点实验SkyPilot 编排 Ray 集群 Ray Launcher当单节点显存或算力不足时可以用 SkyPilot 拉起多节点并在节点内部先组装 Ray 集群再交由 AReaL 的 Ray launcher 运行实验。仓库提供的 ray_cluster.sky.yaml 与 gsm8k_grpo_ray.yaml 即为此场景设计官方声明已在 GCP 与 Kubernetes 集群上测试通过。4.1 资源与镜像定义resources: accelerators: A100:8 image_id: docker:ghcr.io/areal-project/areal-runtime:v2.1.0-sglang memory: 32 cpus: 8 num_nodes: 2 workdir: .这里申请 2 个节点、每节点 8 张 A100使用同一 AReaL 运行时镜像含 SGLang 与 Ray。对应地多节点训练命令中rollout.backendsglang:d8、actor.backendfsdp:d8表示每节点 8 卡的数据并行规模cluster.n_gpus_per_node$SKYPILOT_NUM_GPUS_PER_NODE同样由 SkyPilot 自动注入值为 8。4.2 共享存储的两种配置方式多节点训练要求各节点访问同一份实验数据与 checkpointSkyPilot 提供两种共享存储方案。方式一挂载已有云端存储桶或卷file_mounts: /storage: # Should be consistent with the storage paths set in gsm8k_grpo_ray.yaml source: s3://my-bucket/ # or gs://, https://azure_storage_account.blob.core.windows.net/container, r2://, cos://region/bucket, oci://bucket_name mode: MOUNT # MOUNT or COPY or MOUNT_CACHED. Defaults to MOUNT. Optional.source支持 S3、GCS、Azure Blob、R2、COS腾讯云、OCI甲骨文云等多种存储协议mode可选MOUNT默认、COPY、MOUNT_CACHED。方式二让 SkyPilot 新建存储桶# Create an empty gcs bucket file_mounts: /storage: # Should be consistent with the storage paths set in gsm8k_grpo_ray.yaml name: my-sky-bucket store: gcs # Optional: either of s3, gcs, azure, r2, ibm, ociSkyPilot 会根据store指定的厂商自动创建对应存储桶并挂载到所有节点的/storage。无论哪种方式挂载点都必须与训练配置中cluster.fileroot: /storage/experiments见 gsm8k_grpo_ray.yaml保持一致否则 saver、evaluator、recover 等组件的日志与 checkpoint 会写错位置。4.3 节点内 run 脚本组装 Ray 集群并启动训练ray_cluster.sky.yaml的run段是整套编排的核心SkyPilot 会在每个节点上执行同一脚本脚本利用 SkyPilot 注入的环境变量区分主节点与工作节点先组装 Ray 集群再在 rank 0 上启动 AReaL 训练。完整脚本如下取自仓库实际文件envs: EXPERIMENT_NAME: my-areal-experiment TRIAL_NAME: my-trial-name run: | # Get the Head nodes IP and total number of nodes (environment variables injected by SkyPilot). head_ip$(echo $SKYPILOT_NODE_IPS | head -n1) if [ $SKYPILOT_NODE_RANK 0 ]; then echo Starting Ray head node... ray start --head --port6379 while [ $(ray status | grep node_ | wc -l) -lt $SKYPILOT_NUM_NODES ]; do echo Waiting for all nodes to join... Current nodes: $(ray status | grep node_ | wc -l) / $SKYPILOT_NUM_NODES sleep 5 done echo Executing training script on head node... python3 examples/math/gsm8k_rl.py \ --config examples/skypilot/gsm8k_grpo_ray.yaml \ scheduler.typeray \ experiment_namegsm8k-grpo \ trial_nametrial0 \ cluster.n_nodes$SKYPILOT_NUM_NODES \ cluster.n_gpus_per_node$SKYPILOT_NUM_GPUS_PER_NODE \ rollout.backendsglang:d8 \ actor.backendfsdp:d8 else sleep 10 echo Starting Ray worker node... ray start --address $head_ip:6379 sleep 5 fi echo Node setup complete for rank $SKYPILOT_NODE_RANK.脚本依赖的 SkyPilot 注入环境变量环境变量含义SKYPILOT_NODE_IPS集群所有节点的 IP 列表按节点 rank 排序SKYPILOT_NODE_RANK当前节点在集群中的编号rank 0 为主节点SKYPILOT_NUM_NODES节点总数SKYPILOT_NUM_GPUS_PER_NODE每节点 GPU 数执行逻辑说明rank 0head执行ray start --head --port6379启动 Ray 主节点head 通过轮询ray status等待全部SKYPILOT_NUM_NODES个节点加入每 5 秒检查一次节点齐备后head 上直接执行python3 examples/math/gsm8k_rl.py --config examples/skypilot/gsm8k_grpo_ray.yaml scheduler.typeray ...其余节点sleep 10等待 head 的 Ray 服务就绪后以ray start --address $head_ip:6379加入集群。4.4 训练配置 gsm8k_grpo_ray.yaml 要点多节点实验使用专门面向 Ray 场景的 gsm8k_grpo_ray.yaml它与单节点用的 gsm8k_grpo.yaml 的主要差异在于集群与调度层cluster.n_nodes: 2、cluster.n_gpus_per_node: 8集群拓扑定义运行时会以命令行覆盖值为准cluster.fileroot: /storage/experiments与 SkyPilotfile_mounts的/storage挂载点对齐cluster.name_resolve.type: ray节点间寻址name resolve改为通过 Ray 完成并指定ray_actor_name: ray_kv_store作为 KV 存储 actor——这正是scheduler.typeray与本地type: nfs的关键区别rollout.backend: sglang:d8、actor.backend: fsdp:d8每节点 8 卡的数据并行分配其余超参数gconfig、actor、ref、sglang、vllm、saver/recover/evaluator/stats_logger等与单节点配置保持一致例如actor.use_decoupled_loss: true解耦损失、actor.rejection_sampling.metric: ratio、gconfig.n_samples: 4、gconfig.max_new_tokens: 1024。从源码看scheduler.typeray对应 areal/infra/launcher/ray.py 中的RayLauncher它通过ray.util.placement_group(bundles[...], strategyPACK)为训练任务创建跨节点放置组并以 placement group 为单位提交任务见 ray.pySGLang 推理服务器按节点粒度拉起trainer 则按每进程 1 GPU的粒度提交并通过torch_env_hook为每个 trainer 进程注入RANK/WORLD_SIZE/LOCAL_RANK/MASTER_ADDR/MASTER_PORT以模拟 torchrun 的分布式初始化见 ray.py所有任务的输出会经_LogWriteractor 合并写入同一份trainer.log可直接tail -f跟踪见 ray.py。4.5 InfiniBand 网络补充配置如果运行在节点间通过 InfiniBand 互联的集群Kubernetes 场景常见上需要为实验 YAML 追加如下配置授予容器IPC_LOCK能力否则实验可能无法正常运行config: kubernetes: pod_config: spec: containers: - securityContext: capabilities: add: - IPC_LOCK4.6 启动多节点实验sky launch -c areal-test examples/skypilot/ray_cluster.sky.yaml同样支持指定基础设施sky launch -c areal-test examples/skypilot/ray_cluster.sky.yaml --infra gcp sky launch -c areal-test examples/skypilot/ray_cluster.sky.yaml --infra aws sky launch -c areal-test examples/skypilot/ray_cluster.sky.yaml --infra k8s4.7 运行效果启动成功后训练日志会直接流式输出到你的终端。下图是官方示例在 GCP 上成功拉起 2 个节点并部署 Ray 集群的实况节点与推理服务就绪后即可看到训练步正常推进五、RoadmapSkyPilot 原生 Launcher除了SkyPilot 拉起节点 AReaL local/Ray launcher 调度实验的间接集成方式AReaL 官方还计划基于 SkyPilot Python SDK 实现一个原生 SkyPilot launcher即把 SkyPilot 直接作为 AReaL 的scheduler.type之一由 AReaL 内部通过 SDK 完成资源申请与作业编排。该功能当前处于开发阶段见 examples/skypilot/README.md尚未提供可运行配置。六、小结与进一步阅读本文梳理了 AReaL 基于 SkyPilot 的两条实践路径单节点sky launchscheduler.typelocal一条命令完成 GSM8K GRPO 实验适合快速验证与调试多节点ray_cluster.sky.yaml先组装 Ray 集群再以scheduler.typeray交给 AReaL Ray launcher 调度适合大规模分布式训练共享存储、SKYPILOT_*环境变量与 InfiniBandIPC_LOCK是落地时的关键细节。可以继续深入阅读的仓库资料示例文档examples/skypilot/README.mdSkyPilot YAMLexamples/skypilot/single_node.sky.yaml、examples/skypilot/ray_cluster.sky.yaml训练配置examples/skypilot/gsm8k_grpo_ray.yaml、examples/math/gsm8k_grpo.yaml训练入口examples/math/gsm8k_rl.pyLauncher 实现areal/infra/launcher/local.py、areal/infra/launcher/ray.py安装指南含 SkyPilot 部分docs/en/tutorial/installation.md【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考