name: skypilot-多云-编排 description: 用于 ML 工作负载的多云编排,具有自动成本优化功能。当您需要在多个云上运行训练或批量作业、利用具有自动恢复功能的竞价实例或在提供者之间优化 GPU 成本时使用。 version: 1.0.0 author: Orchestra Research license: MIT tags: [基础设施, 多云, 编排, GPU, 成本优化, SkyPilot] dependencies: [skypilot>=0.7.0]
SkyPilot 多云编排
使用 SkyPilot 运行 ML 工作负载并跨多云进行自动成本优化的全面指南。
何时使用 SkyPilot
使用 SkyPilot 当:
- 在多个云(AWS、GCP、Azure 等)上运行 ML 工作负载
- 需要成本优化并自动选择云/区域
- 在竞价实例上运行长作业并自动恢复
- 管理分布式多节点训练
- 希望为 20+ 云提供商提供统一接口
- 需要避免供应商锁定
关键特性:
- 多云:AWS、GCP、Azure、Kubernetes、Lambda、RunPod、20+ 提供商
- 成本优化:自动选择最便宜的云/区域
- 竞价实例:3-6倍成本节省,自动恢复
- 分布式训练:多节点作业,组调度
- 托管作业:自动恢复、检查点、容错
- Sky Serve:模型服务,自动扩展
使用替代方案:
- Modal:用于更简单的无服务器 GPU,具有 Python 原生 API
- RunPod:用于单云持久 Pod
- Kubernetes:用于现有 K8s 基础设施
- Ray:用于纯基于 Ray 的编排
快速开始
安装
pip install "skypilot[aws,gcp,azure,kubernetes]"
# 验证云凭据
sky check
Hello World
创建 hello.yaml:
resources:
accelerators: T4:1
run: |
nvidia-smi
echo "Hello from SkyPilot!"
启动:
sky launch -c hello hello.yaml
# SSH 到集群
ssh hello
# 终止
sky down hello
核心概念
任务 YAML 结构
# 任务名称(可选)
name: my-task
# 资源需求
resources:
cloud: aws # 可选:如果省略则自动选择
region: us-west-2 # 可选:如果省略则自动选择
accelerators: A100:4 # GPU 类型和数量
cpus: 8+ # 最小 CPU
memory: 32+ # 最小内存(GB)
use_spot: true # 使用竞价实例
disk_size: 256 # 磁盘大小(GB)
# 分布式训练的节点数量
num_nodes: 2
# 工作目录(同步到 ~/sky_workdir)
workdir: .
# 设置命令(运行一次)
setup: |
pip install -r requirements.txt
# 运行命令
run: |
python train.py
关键命令
| 命令 | 用途 |
|---|---|
sky launch |
启动集群并运行任务 |
sky exec |
在现有集群上运行任务 |
sky status |
显示集群状态 |
sky stop |
停止集群(保留状态) |
sky down |
终止集群 |
sky logs |
查看任务日志 |
sky queue |
显示作业队列 |
sky jobs launch |
启动托管作业 |
sky serve up |
部署服务端点 |
GPU 配置
可用加速器
# NVIDIA GPUs
accelerators: T4:1
accelerators: L4:1
accelerators: A10G:1
accelerators: L40S:1
accelerators: A100:4
accelerators: A100-80GB:8
accelerators: H100:8
# 云特定
accelerators: V100:4 # AWS/GCP
accelerators: TPU-v4-8 # GCP TPUs
GPU 后备
resources:
accelerators:
H100: 8
A100-80GB: 8
A100: 8
any_of:
- cloud: gcp
- cloud: aws
- cloud: azure
竞价实例
resources:
accelerators: A100:8
use_spot: true
spot_recovery: FAILOVER # 抢占时自动恢复
集群管理
启动和执行
# 启动新集群
sky launch -c mycluster task.yaml
# 在现有集群上运行(跳过设置)
sky exec mycluster another_task.yaml
# 交互式 SSH
ssh mycluster
# 流日志
sky logs mycluster
自动停止
resources:
accelerators: A100:4
autostop:
idle_minutes: 30
down: true # 终止而不是停止
# 通过 CLI 设置自动停止
sky autostop mycluster -i 30 --down
集群状态
# 所有集群
sky status
# 详细视图
sky status -a
分布式训练
多节点设置
resources:
accelerators: A100:8
num_nodes: 4 # 4 节点 × 8 GPUs = 32 GPUs 总计
setup: |
pip install torch torchvision
run: |
torchrun \
--nnodes=$SKYPILOT_NUM_NODES \
--nproc_per_node=$SKYPILOT_NUM_GPUS_PER_NODE \
--node_rank=$SKYPILOT_NODE_RANK \
--master_addr=$(echo "$SKYPILOT_NODE_IPS" | head -n1) \
--master_port=12355 \
train.py
环境变量
| 变量 | 描述 |
|---|---|
SKYPILOT_NODE_RANK |
节点索引(0 到 num_nodes-1) |
SKYPILOT_NODE_IPS |
换行分隔的 IP 地址 |
SKYPILOT_NUM_NODES |
总节点数 |
SKYPILOT_NUM_GPUS_PER_NODE |
每个节点的 GPU 数 |
仅头节点执行
run: |
if [ "${SKYPILOT_NODE_RANK}" == "0" ]; then
python orchestrate.py
fi
托管作业
竞价恢复
# 启动具有竞价恢复的托管作业
sky jobs launch -n my-job train.yaml
检查点
name: training-job
file_mounts:
/checkpoints:
name: my-checkpoints
store: s3
mode: MOUNT
resources:
accelerators: A100:8
use_spot: true
run: |
python train.py \
--checkpoint-dir /checkpoints \
--resume-from-latest
作业管理
# 列出作业
sky jobs queue
# 查看日志
sky jobs logs my-job
# 取消作业
sky jobs cancel my-job
文件挂载和存储
本地文件同步
workdir: ./my-project # 同步到 ~/sky_workdir
file_mounts:
/data/config.yaml: ./config.yaml
~/.vimrc: ~/.vimrc
云存储
file_mounts:
# 挂载 S3 桶
/datasets:
source: s3://my-bucket/datasets
mode: MOUNT # 从 S3 流式传输
# 复制 GCS 桶
/models:
source: gs://my-bucket/models
mode: COPY # 预取到磁盘
# 缓存挂载(快速写入)
/outputs:
name: my-outputs
store: s3
mode: MOUNT_CACHED
存储模式
| 模式 | 描述 | 最适合 |
|---|---|---|
MOUNT |
从云流式传输 | 大数据集,读重型 |
COPY |
预取到磁盘 | 小文件,随机访问 |
MOUNT_CACHED |
缓存并异步上传 | 检查点,输出 |
Sky Serve(模型服务)
基础服务
# service.yaml
service:
readiness_probe: /health
replica_policy:
min_replicas: 1
max_replicas: 10
target_qps_per_replica: 2.0
resources:
accelerators: A100:1
run: |
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-2-7b-chat-hf \
--port 8000
# 部署
sky serve up -n my-service service.yaml
# 检查状态
sky serve status
# 获取端点
sky serve status my-service
自动扩展策略
service:
replica_policy:
min_replicas: 1
max_replicas: 10
target_qps_per_replica: 2.0
upscale_delay_seconds: 60
downscale_delay_seconds: 300
load_balancing_policy: round_robin
成本优化
自动云选择
# SkyPilot 找到最便宜选项
resources:
accelerators: A100:8
# 未指定云 - 自动选择最便宜
# 显示优化器决策
sky launch task.yaml --dryrun
云偏好
resources:
accelerators: A100:8
any_of:
- cloud: gcp
region: us-central1
- cloud: aws
region: us-east-1
- cloud: azure
环境变量
envs:
HF_TOKEN: $HF_TOKEN # 从本地环境继承
WANDB_API_KEY: $WANDB_API_KEY
# 或使用秘密
secrets:
- HF_TOKEN
- WANDB_API_KEY
常见工作流
工作流 1:带检查点的微调
name: llm-finetune
file_mounts:
/checkpoints:
name: finetune-checkpoints
store: s3
mode: MOUNT_CACHED
resources:
accelerators: A100:8
use_spot: true
setup: |
pip install transformers accelerate
run: |
python train.py \
--checkpoint-dir /checkpoints \
--resume
工作流 2:超参数扫描
name: hp-sweep-${RUN_ID}
envs:
RUN_ID: 0
LEARNING_RATE: 1e-4
BATCH_SIZE: 32
resources:
accelerators: A100:1
use_spot: true
run: |
python train.py \
--lr $LEARNING_RATE \
--batch-size $BATCH_SIZE \
--run-id $RUN_ID
# 启动多个作业
for i in {1..10}; do
sky jobs launch sweep.yaml \
--env RUN_ID=$i \
--env LEARNING_RATE=$(python -c "import random; print(10**random.uniform(-5,-3))")
done
调试
# SSH 到集群
ssh mycluster
# 查看日志
sky logs mycluster
# 检查作业队列
sky queue mycluster
# 查看托管作业日志
sky jobs logs my-job
常见问题
| 问题 | 解决方案 |
|---|---|
| 配额超出 | 请求配额增加,尝试不同区域 |
| 竞价抢占 | 使用 sky jobs launch 自动恢复 |
| 文件同步慢 | 对输出使用 MOUNT_CACHED 模式 |
| GPU 不可用 | 使用 any_of 后备云 |