{"id":"skypilot","name":"skypilot-multi-cloud-orchestration","summary":"自動コスト最適化を備えたMLワークロードのマルチクラウドオーケストレーション。複数のクラウドでトレーニングやバッチジョブを実行したい場合、自動回復機能付きのスポットインスタンスを活用する際、プロバイダー間でGPUコストを最適化する必要がある場合に使えます。","body":"# SkyPilot Multi-Cloud Orchestration\n\nComprehensive guide to running ML workloads across clouds with automatic cost optimization using SkyPilot.\n\n## When to use SkyPilot\n\n**Use SkyPilot when:**\n- Running ML workloads across multiple clouds (AWS, GCP, Azure, etc.)\n- Need cost optimization with automatic cloud/region selection\n- Running long jobs on spot instances with auto-recovery\n- Managing distributed multi-node training\n- Want unified interface for 20+ cloud providers\n- Need to avoid vendor lock-in\n\n**Key features:**\n- **Multi-cloud**: AWS, GCP, Azure, Kubernetes, Lambda, RunPod, 20+ providers\n- **Cost optimization**: Automatic cheapest cloud/region selection\n- **Spot instances**: 3-6x cost savings with automatic recovery\n- **Distributed training**: Multi-node jobs with gang scheduling\n- **Managed jobs**: Auto-recovery, checkpointing, fault tolerance\n- **Sky Serve**: Model serving with autoscaling\n\n**Use alternatives instead:**\n- **Modal**: For simpler serverless GPU with Python-native API\n- **RunPod**: For single-cloud persistent pods\n- **Kubernetes**: For existing K8s infrastructure\n- **Ray**: For pure Ray-based orchestration\n\n## Quick start\n\n### Installation\n\n```bash\npip install \"skypilot[aws,gcp,azure,kubernetes]\"\n\n# Verify cloud credentials\nsky check\n```\n\n### Hello World\n\nCreate `hello.yaml`:\n```yaml\nresources:\n  accelerators: T4:1\n\nrun: |\n  nvidia-smi\n  echo \"Hello from SkyPilot!\"\n```\n\nLaunch:\n```bash\nsky launch -c hello hello.yaml\n\n# SSH to cluster\nssh hello\n\n# Terminate\nsky down hello\n```\n\n## Core concepts\n\n### Task YAML structure\n\n```yaml\n# Task name (optional)\nname: my-task\n\n# Resource requirements\nresources:\n  cloud: aws              # Optional: auto-select if omitted\n  region: us-west-2       # Optional: auto-select if omitted\n  accelerators: A100:4    # GPU type and count\n  cpus: 8+                # Minimum CPUs\n  memory: 32+             # Minimum memory (GB)\n  use_spot: true          # Use spot instances\n  disk_size: 256          # Disk size (GB)\n\n# Number of nodes for distributed training\nnum_nodes: 2\n\n# Working directory (synced to ~/sky_workdir)\nworkdir: .\n\n# Setup commands (run once)\nsetup: |\n  pip install -r requirements.txt\n\n# Run commands\nrun: |\n  python train.py\n```\n\n### Key commands\n\n| Command | Purpose |\n|---------|---------|\n| `sky launch` | Launch cluster and run task |\n| `sky exec` | Run task on existing cluster |\n| `sky status` | Show cluster status |\n| `sky stop` | Stop cluster (preserve state) |\n| `sky down` | Terminate cluster |\n| `sky logs` | View task logs |\n| `sky queue` | Show job queue |\n| `sky jobs launch` | Launch managed job |\n| `sky serve up` | Deploy serving endpoint |\n\n## GPU configuration\n\n### Available accelerators\n\n```yaml\n# NVIDIA GPUs\naccelerators: T4:1\naccelerators: L4:1\naccelerators: A10G:1\naccelerators: L40S:1\naccelerators: A100:4\naccelerators: A100-80GB:8\naccelerators: H100:8\n\n# Cloud-specific\naccelerators: V100:4         # AWS/GCP\naccelerators: TPU-v4-8       # GCP TPUs\n```\n\n### GPU fallbacks\n\n```yaml\nresources:\n  accelerators:\n    H100: 8\n    A100-80GB: 8\n    A100: 8\n  any_of:\n    - cloud: gcp\n    - cloud: aws\n    - cloud: azure\n```\n\n### Spot instances\n\n```yaml\nresources:\n  accelerators: A100:8\n  use_spot: true\n  spot_recovery: FAILOVER  # Auto-recover on preemption\n```\n\n## Cluster management\n\n### Launch and execute\n\n```bash\n# Launch new cluster\nsky launch -c mycluster task.yaml\n\n# Run on existing cluster (skip setup)\nsky exec mycluster another_task.yaml\n\n# Interactive SSH\nssh mycluster\n\n# Stream logs\nsky logs mycluster\n```\n\n### Autostop\n\n```yaml\nresources:\n  accelerators: A100:4\n  autostop:\n    idle_minutes: 30\n    down: true  # Terminate instead of stop\n```\n\n```bash\n# Set autostop via CLI\nsky autostop mycluster -i 30 --down\n```\n\n### Cluster status\n\n```bash\n# All clusters\nsky status\n\n# Detailed view\nsky status -a\n```\n\n## Distributed training\n\n### Multi-node setup\n\n```yaml\nresources:\n  accelerators: A100:8\n\nnum_nodes: 4  # 4 nodes × 8 GPUs = 32 GPUs total\n\nsetup: |\n  pip install torch torchvision\n\nrun: |\n  torchrun \\\n    --nnodes=$SKYPILOT_NUM_NODES \\\n    --nproc_per_node=$SKYPILOT_NUM_GPUS_PER_NODE \\\n    --node_rank=$SKYPILOT_NODE_RANK \\\n    --master_addr=$(echo \"$SKYPILOT_NODE_IPS\" | head -n1) \\\n    --master_port=12355 \\\n    train.py\n```\n\n### Environment variables\n\n| Variable | Description |\n|----------|-------------|\n| `SKYPILOT_NODE_RANK` | Node index (0 to num_nodes-1) |\n| `SKYPILOT_NODE_IPS` | Newline-separated IP addresses |\n| `SKYPILOT_NUM_NODES` | Total number of nodes |\n| `SKYPILOT_NUM_GPUS_PER_NODE` | GPUs per node |\n\n### Head-node-only execution\n\n```bash\nrun: |\n  if [ \"${SKYPILOT_NODE_RANK}\" == \"0\" ]; then\n    python orchestrate.py\n  fi\n```\n\n## Managed jobs\n\n### Spot recovery\n\n```bash\n# Launch managed job with spot recovery\nsky jobs launch -n my-job train.yaml\n```\n\n### Checkpointing\n\n```yaml\nname: training-job\n\nfile_mounts:\n  /checkpoints:\n    name: my-checkpoints\n    store: s3\n    mode: MOUNT\n\nresources:\n  accelerators: A100:8\n  use_spot: true\n\nrun: |\n  python train.py \\\n    --checkpoint-dir /checkpoints \\\n    --resume-from-latest\n```\n\n### Job management\n\n```bash\n# List jobs\nsky jobs queue\n\n# View logs\nsky jobs logs my-job\n\n# Cancel job\nsky jobs cancel my-job\n```\n\n## File mounts and storage\n\n### Local file sync\n\n```yaml\nworkdir: ./my-project  # Synced to ~/sky_workdir\n\nfile_mounts:\n  /data/config.yaml: ./config.yaml\n  ~/.vimrc: ~/.vimrc\n```\n\n### Cloud storage\n\n```yaml\nfile_mounts:\n  # Mount S3 bucket\n  /datasets:\n    source: s3://my-bucket/datasets\n    mode: MOUNT  # Stream from S3\n\n  # Copy GCS bucket\n  /models:\n    source: gs://my-bucket/models\n    mode: COPY  # Pre-fetch to disk\n\n  # Cached mount (fast writes)\n  /outputs:\n    name: my-outputs\n    store: s3\n    mode: MOUNT_CACHED\n```\n\n### Storage modes\n\n| Mode | Description | Best For |\n|------|-------------|----------|\n| `MOUNT` | Stream from cloud | Large datasets, read-heavy |\n| `COPY` | Pre-fetch to disk | Small files, random access |\n| `MOUNT_CACHED` | Cache with async upload | Checkpoints, outputs |\n\n## Sky Serve (Model Serving)\n\n### Basic service\n\n```yaml\n# service.yaml\nservice:\n  readiness_probe: /health\n  replica_policy:\n    min_replicas: 1\n    max_replicas: 10\n    target_qps_per_replica: 2.0\n\nresources:\n  accelerators: A100:1\n\nrun: |\n  python -m vllm.entrypoints.openai.api_server \\\n    --model meta-llama/Llama-2-7b-chat-hf \\\n    --port 8000\n```\n\n```bash\n# Deploy\nsky serve up -n my-service service.yaml\n\n# Check status\nsky serve status\n\n# Get endpoint\nsky serve status my-service\n```\n\n### Autoscaling policies\n\n```yaml\nservice:\n  replica_policy:\n    min_replicas: 1\n    max_replicas: 10\n    target_qps_per_replica: 2.0\n    upscale_delay_seconds: 60\n    downscale_delay_seconds: 300\n  load_balancing_policy: round_robin\n```\n\n## Cost optimization\n\n### Automatic cloud selection\n\n```yaml\n# SkyPilot finds cheapest option\nresources:\n  accelerators: A100:8\n  # No cloud specified - auto-select cheapest\n```\n\n```bash\n# Show optimizer decision\nsky launch task.yaml --dryrun\n```\n\n### Cloud preferences\n\n```yaml\nresources:\n  accelerators: A100:8\n  any_of:\n    - cloud: gcp\n      region: us-central1\n    - cloud: aws\n      region: us-east-1\n    - cloud: azure\n```\n\n### Environment variables\n\n```yaml\nenvs:\n  HF_TOKEN: $HF_TOKEN  # Inherited from local env\n  WANDB_API_KEY: $WANDB_API_KEY\n\n# Or use secrets\nsecrets:\n  - HF_TOKEN\n  - WANDB_API_KEY\n```\n\n## Common workflows\n\n### Workflow 1: Fine-tuning with checkpoints\n\n```yaml\nname: llm-finetune\n\nfile_mounts:\n  /checkpoints:\n    name: finetune-checkpoints\n    store: s3\n    mode: MOUNT_CACHED\n\nresources:\n  accelerators: A100:8\n  use_spot: true\n\nsetup: |\n  pip install transformers accelerate\n\nrun: |\n  python train.py \\\n    --checkpoint-dir /checkpoints \\\n    --resume\n```\n\n### Workflow 2: Hyperparameter sweep\n\n```yaml\nname: hp-sweep-${RUN_ID}\n\nenvs:\n  RUN_ID: 0\n  LEARNING_RATE: 1e-4\n  BATCH_SIZE: 32\n\nresources:\n  accelerators: A100:1\n  use_spot: true\n\nrun: |\n  python train.py \\\n    --lr $LEARNING_RATE \\\n    --batch-size $BATCH_SIZE \\\n    --run-id $RUN_ID\n```\n\n```bash\n# Launch multiple jobs\nfor i in {1..10}; do\n  sky jobs launch sweep.yaml \\\n    --env RUN_ID=$i \\\n    --env LEARNING_RATE=$(python -c \"import random; print(10**random.uniform(-5,-3))\")\ndone\n```\n\n## Debugging\n\n```bash\n# SSH to cluster\nssh mycluster\n\n# View logs\nsky logs mycluster\n\n# Check job queue\nsky queue mycluster\n\n# View managed job logs\nsky jobs logs my-job\n```\n\n## Common issues\n\n| Issue | Solution |\n|-------|----------|\n| Quota exceeded | Request quota increase, try different region |\n| Spot preemption | Use `sky jobs launch` for auto-recovery |\n| Slow file sync | Use `MOUNT_CACHED` mode for outputs |\n| GPU not available | Use `any_of` for fallback clouds |\n\n## References\n\n- **[Advanced Usage](references/advanced-usage.md)** - Multi-cloud, optimization, production patterns\n- **[Troubleshooting](references/troubleshooting.md)** - Common issues and solutions\n\n## Resources\n\n- **Documentation**: https://docs.skypilot.co\n- **GitHub**: https://github.com/skypilot-org/skypilot\n- **Slack**: https://slack.skypilot.co\n- **Examples**: https://github.com/skypilot-org/skypilot/tree/master/examples","author":"@Orchestra-Research","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/Orchestra-Research/AI-Research-SKILLs/tree/main/09-infrastructure/skypilot","license":"MIT","category":"coding","lang":"en","tokens":2615,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"references/advanced-usage.md","size":7469,"sha256":"6d5712aba97cc6152ff753d83847f5711d6233f459cb87b4e1295b82f35a5d95"},{"path":"references/troubleshooting.md","size":10493,"sha256":"3f7aab77726105a4f636e5defde9c634d13e0e584fda820f5524f68c78c4e93b"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":["docs.skypilot.co","download.pytorch.org","my-service-v2.skypilot.cloud","slack.skypilot.co"]}}