Tutorial SkyPilot: Menjalankan Workload ML di Cloud Mana Saja

# SkyPilot: Menjalankan Beban Kerja ML dan AI di Cloud Apa Pun Melatih dan menyajikan model machine learning sering kali berarti menghadapi dua persoalan sekaligus: mencari GPU yang benar-benar terse...

By Ruby Abdullah · · tutorial
SkyPilotCloudMLOpsGPUMulti-CloudInfrastructure

SkyPilot: Menjalankan Beban Kerja ML dan AI di Cloud Apa Pun

Melatih dan menyajikan model machine learning sering kali berarti menghadapi dua persoalan sekaligus: mencari GPU yang benar-benar tersedia, dan menghindari tagihan cloud yang membengkak tanpa diduga. SkyPilot adalah framework open-source yang berada di atas AWS, GCP, Azure, Kubernetes, dan mesin milik Anda sendiri, sehingga Anda cukup mendeskripsikan sebuah pekerjaan satu kali lalu menjalankannya di tempat yang paling murah dan tersedia. Tutorial ini membahas konsep, format YAML, CLI, managed spot job, dan penyajian model — lengkap dengan contoh praktis yang dapat Anda adaptasi.

Apa Itu SkyPilot dan Masalah yang Diselesaikannya

SkyPilot adalah lapisan yang menyediakan dan mengelola komputasi pada backend mana pun yang Anda pilih, lalu menjalankan beban kerja Anda di atasnya. Anda menulis deskripsi deklaratif tentang apa yang Anda butuhkan (sebuah akselerator, sejumlah CPU, skrip setup, perintah run) dan SkyPilot menentukan di mana menempatkannya.

Ia menangani beberapa masalah yang berulang dalam infrastruktur ML:

  • Kelangkaan GPU. Tipe GPU tertentu sering kehabisan kapasitas di satu region padahal tersedia di region lain. SkyPilot mencari kapasitas lintas region dan cloud, alih-alih membiarkan Anda mencoba ulang secara manual.
  • Biaya. Akselerator yang sama bisa berbeda harga jauh antar penyedia dan region. Optimizer SkyPilot membandingkan opsi dan memilih yang termurah yang memenuhi batasan Anda.
  • Ketergantungan pada satu cloud (lock-in). Tim sering menstandarkan satu penyedia bukan karena ia paling baik, melainkan karena menulis ulang infrastruktur itu merepotkan. SkyPilot memakai definisi tugas yang sama di mana saja, sehingga memindahkan pekerjaan dari AWS ke GCP cukup dengan mengubah flag, bukan menulis ulang.
  • Pengelolaan cluster secara manual. Menyalakan VM, memasang driver, menyinkronkan kode, dan ingat untuk mematikan semuanya itu melelahkan dan rawan kesalahan. SkyPilot mengotomatiskan provisioning, sinkronisasi kode, dan — yang penting — menghentikan cluster yang menganggur otomatis sehingga Anda berhenti membayar mesin yang terlupakan.

Ia bukan pengganti akun cloud Anda; ia memakai kredensial dan kuota Anda sendiri. Anggaplah ia sebagai lapisan orkestrasi, bukan layanan hosting terkelola.

Cara Kerjanya

Secara garis besar, saat Anda meluncurkan sebuah tugas, SkyPilot melakukan hal berikut:

  • Membaca definisi tugas Anda (file YAML atau panggilan Python) yang menjelaskan resources dan perintah.
  • Menjalankan optimizer, yang menanyakan harga dan ketersediaan di seluruh cloud yang Anda aktifkan, lalu memeringkat kandidat kombinasi (cloud, region, tipe instance).
  • Menyediakan cluster pada opsi pemenang memakai kredensial cloud Anda, dan mencoba region atau cloud lain bila kapasitas tidak tersedia.
  • Menyinkronkan direktori kerja lokal dan file apa pun yang di-mount ke cluster.
  • Menjalankan perintah setup Anda satu kali, lalu perintah run.
  • Mengalirkan log kembali ke terminal Anda dan, bila diatur, menghentikan cluster otomatis setelah periode tidak aktif.
  • Cluster tersebut adalah sekumpulan VM biasa (atau pod Kubernetes) di akun Anda. Anda dapat SSH ke dalamnya, menjalankan perintah tambahan, menghentikannya, atau menghapusnya kapan saja.

    Instalasi dan Penyiapan Cloud

    SkyPilot dipasang dengan pip. Anda memilih backend mana yang diaktifkan melalui extras:

    pip install "skypilot[aws,gcp,kubernetes]"
    

    Tambah atau kurangi extras sesuai lingkungan Anda — misalnya skypilot[azure], skypilot[lambda], atau skypilot[all]. Sebaiknya pasang di dalam virtual environment khusus:

    python -m venv .venv
    

    source .venv/bin/activate

    pip install "skypilot[aws,gcp,kubernetes]"

    Selanjutnya, konfigurasikan kredensial untuk setiap cloud yang akan Anda gunakan. SkyPilot mengandalkan mekanisme kredensial standar masing-masing penyedia, jadi bila CLI Anda sudah berfungsi, SkyPilot biasanya juga berfungsi.

    # AWS: konfigurasikan access key atau SSO
    

    aws configure

    GCP: autentikasi dan tetapkan project

    gcloud auth login

    gcloud auth application-default login

    gcloud config set project YOURPROJECTID

    Kubernetes: arahkan SkyPilot ke konteks kubeconfig yang berfungsi

    kubectl config current-context

    Terakhir, verifikasi apa yang dapat dilihat SkyPilot dengan sky check:

    sky check
    

    Perintah ini melaporkan setiap cloud sebagai aktif atau nonaktif dan menjelaskan apa yang kurang bila sebuah cloud belum siap (misalnya kredensial yang hilang atau izin yang tidak memadai). Hanya cloud yang aktif yang ikut dalam optimizer.

    Task YAML: Konsep Utama

    Segala sesuatu di SkyPilot berputar pada definisi tugas. Bentuk paling umum adalah file YAML. Berikut contoh beranotasi yang mencakup field-field utama:

    # train.yaml
    

    resources:

    accelerators: A100:1 # satu GPU A100; gunakan A100:8 untuk delapan

    cloud: aws # opsional: kunci ke cloud tertentu

    cpus: 8+ # minimal 8 vCPU

    memory: 32+ # minimal 32 GB RAM

    disksize: 256 # disk boot/data dalam GB

    ports: 8888 # buka sebuah port (mis. untuk notebook)

    usespot: false # set true untuk meminta spot/preemptible

    workdir: . # sinkronkan direktori saat ini ke cluster

    filemounts:

    /data: s3://my-bucket/datasets # mount bucket sebagai sebuah path

    ~/.netrc: ~/.netrc # salin file lokal ke cluster

    envs:

    WANDBAPIKEY: "" # dideklarasikan di sini, nilai diberikan saat launch

    EPOCHS: "10"

    setup: |

    pip install -r requirements.txt

    run: |

    python train.py --epochs $EPOCHS --data-dir /data

    Field-field penting:

    • resources menjelaskan perangkat keras. accelerators memakai bentuk NAMA:JUMLAH (A100:1, T4:4, H100:8). Anda juga dapat membiarkan cloud kosong agar optimizer yang memilih, dan menyetel usespot: true untuk meminta instance preemptible berdiskon.
    • setup berjalan satu kali saat cluster pertama kali disediakan (atau saat setup berubah). Letakkan instalasi dependensi di sini agar run berikutnya cepat.
    • run adalah perintah sebenarnya yang menjalankan beban kerja Anda.
    • workdir menyinkronkan direktori lokal ke cluster sebelum tiap run. Jaga tetap kecil; dataset besar sebaiknya di filemounts.
    • filemounts memetakan path remote ke file lokal atau bucket cloud. Me-mount bucket memberi pekerjaan akses langsung ke object storage tanpa menyalin semuanya di awal.
    • envs mendeklarasikan variabel lingkungan. Mendeklarasikannya dengan nilai kosong memungkinkan Anda meneruskan nilai sebenarnya secara aman saat launch.

    Anda dapat menentukan beberapa kandidat akselerator agar optimizer punya lebih banyak ruang mencari kapasitas:

    resources:
    

    accelerators: {A100:1, A10G:1, L4:1}

    usespot: true

    CLI Inti

    Beberapa perintah saja sudah mencakup pekerjaan sehari-hari.

    Luncurkan tugas ke cluster bernama (membuatnya bila perlu):

    sky launch train.yaml -c mycluster --env WANDBAPIKEY=$WANDBAPIKEY
    

    Flag -c menamai cluster agar dapat dipakai ulang. SkyPilot mencetak rencana optimizer dan meminta konfirmasi sebelum provisioning.

    Periksa status cluster Anda:

    sky status
    

    Perintah ini menampilkan tiap cluster, cloud dan region-nya, tipe instance, status (UP, STOPPED, INIT), dan pengaturan autostop.

    Periksa antrean pekerjaan pada cluster dan alirkan log:

    sky queue mycluster
    

    sky logs mycluster # ikuti pekerjaan terbaru

    sky logs mycluster 2 # pekerjaan tertentu berdasarkan ID

    Jalankan perintah tambahan pada cluster yang sudah ada, memakai ulang perangkat keras yang sudah disediakan (dan melewati setup bila tidak berubah):

    sky exec mycluster -- python evaluate.py --checkpoint /data/ckpt.pt
    

    Kelola siklus hidup cluster:

    sky stop mycluster     # hentikan (simpan disk; lanjutkan nanti, ditagih penyimpanan)
    

    sky start mycluster # nyalakan kembali cluster yang dihentikan

    sky down mycluster # terminasi dan hapus semuanya

    Atur autostop agar cluster yang menganggur mematikan dirinya sendiri:

    sky autostop mycluster -i 10   # hentikan setelah menganggur 10 menit
    

    atau saat launch:

    sky launch train.yaml -c mycluster -i 10

    Gunakan --down alih-alih -i bila Anda ingin cluster diterminasi penuh (bukan sekadar dihentikan) setelah menganggur.

    Optimizer

    Saat Anda tidak mengunci sebuah cloud, optimizer SkyPilot mengevaluasi setiap kombinasi (cloud, region, instance) yang aktif yang memenuhi blok resources Anda, dengan memperhitungkan harga terkini dan ketersediaan yang diketahui. Lalu ia mencetak tabel dan memilih opsi termurah yang layak.

    Sebuah launch dapat menampilkan sesuatu seperti ini:

    Considered resources (1 node):
    

    CLOUD INSTANCE vCPUs Mem(GB) ACCELERATORS REGION COST ($/hr)


    GCP a2-highgpu-1g 12 85 A100:1 us-central1 3.67

    AWS p4d.24xlarge 96 1152 A100:8 us-east-1 32.77

    Azure StandardNC24ads 24 220 A100:1 eastus 3.91


    Tanda menunjukkan opsi yang dipilih (termurah).

    Bila provisioning opsi terpilih gagal karena kapasitas, SkyPilot otomatis beralih ke kandidat region atau cloud berikutnya. Perilaku failover inilah salah satu alasan utama mengapa ia menangani kelangkaan GPU lebih baik daripada meluncurkan VM secara manual.

    Managed Jobs dan Pemulihan Spot

    Untuk pelatihan yang berjalan lama, sky launch mengikat pekerjaan ke sesi terminal Anda. Managed Jobs menjalankan pekerjaan di bawah sebuah controller yang mengawasinya, sehingga Anda dapat memutus koneksi dan pekerjaan tetap berjalan:

    sky jobs launch train.yaml -n my-training-run
    

    Pantau dan periksa managed jobs:

    sky jobs queue
    

    sky jobs logs --name my-training-run

    sky jobs cancel my-training-run

    Kombinasi managed jobs dan spot instance adalah fitur yang menonjol. Instance spot (preemptible) jauh lebih murah tetapi dapat ditarik kembali oleh cloud kapan saja. Dengan managed spot job, SkyPilot memantau pemberhentian paksa (preemption): ketika sebuah instance ditarik, ia otomatis menyediakan penggantinya — bisa jadi di region atau cloud berbeda — dan melanjutkan pekerjaan.

    # train-spot.yaml
    

    resources:

    accelerators: A100:1

    usespot: true

    filemounts:

    /checkpoints: s3://my-bucket/checkpoints

    setup: |

    pip install -r requirements.txt

    run: |

    # Lanjutkan dari checkpoint terbaru bila ada

    python train.py \

    --checkpoint-dir /checkpoints \

    --resume-if-exists

    sky jobs launch train-spot.yaml -n spot-training
    

    Kunci agar ini berfungsi adalah checkpointing. SkyPilot menangani penyediaan ulang, tetapi kode Anda harus menyimpan progres secara berkala ke penyimpanan tahan lama (bucket yang di-mount) dan melanjutkan darinya saat restart. Dengan itu, pekerjaan yang terinterupsi di tengah jalan akan melanjutkan dari titik terakhir, bukan mengulang dari awal. Inilah yang membuat ekonomi spot praktis untuk pelatihan berjam-jam.

    SkyServe: Menyajikan Model dengan Autoscaling

    SkyServe mengubah sebuah tugas menjadi layanan dengan endpoint stabil, health check, autoscaling, dan replika yang dapat tersebar lintas region. Anda menambahkan bagian service ke YAML yang menjelaskan readiness probe dan kebijakan replika.

    # serve-llm.yaml
    

    service:

    readinessprobe:

    path: /v1/models # endpoint health check

    replicas: 2 # atau gunakan rentang min/max untuk autoscale

    resources:

    accelerators: {L4:1, A10G:1}

    ports: 8000

    usespot: true

    setup: |

    pip install vllm

    run: |

    python -m vllm.entrypoints.openai.apiserver \

    --model meta-llama/Meta-Llama-3-8B-Instruct \

    --port 8000

    Nyalakan layanan dan kelola:

    sky serve up serve-llm.yaml -n my-llm
    

    sky serve status my-llm

    sky serve logs my-llm 1

    sky serve down my-llm

    SkyServe memberi Anda satu endpoint yang menyeimbangkan beban antar replika. Karena replika dapat berjalan di spot lintas beberapa region, Anda memperoleh penghematan biaya dan ketahanan: bila satu region kehilangan kapasitas, lalu lintas berpindah ke replika yang sehat sementara pengganti disiapkan.

    Menjalankan di Kubernetes

    Bila Anda memiliki cluster Kubernetes dengan GPU (di cloud atau on-premise), SkyPilot memperlakukannya sebagai backend lain. Setelah konteks kubeconfig Anda terjangkau dan sky check menampilkan Kubernetes sebagai aktif, Anda mengunci tugas ke sana seperti cloud lainnya:

    resources:
    

    accelerators: A100:1

    cloud: kubernetes

    sky launch train.yaml -c k8s-run
    

    SkyPilot meluncurkan pod, menyinkronkan kode Anda, dan menjalankan pekerjaan memakai YAML dan CLI yang sama seperti untuk VM. Ini memungkinkan tim berjalan di cluster Kubernetes internal saat kapasitas tersedia di sana dan beralih (burst) ke cloud publik saat tidak — tanpa mengubah definisi tugas.

    Menyinkronkan Data dengan Object Storage

    Untuk dataset dan keluaran, me-mount object storage cloud biasanya lebih baik daripada menyalin melalui workdir. SkyPilot Storage dan filemounts mendukung S3, GCS, dan object store lainnya:

    filemounts:
    

    # Mount bucket yang ada secara read-only untuk data masukan

    /data:

    source: s3://my-bucket/datasets

    mode: MOUNT

    # Buat/sinkronkan bucket untuk keluaran, ditulis kembali ke cloud

    /outputs:

    name: my-training-outputs

    store: gcs

    mode: MOUNT

    Dalam mode MOUNT, bucket tampak sebagai direktori biasa dan baca/tulis dialirkan ke object storage. Ini menjaga data besar tetap di luar disk boot dan membuat data yang sama tersedia tak peduli di region atau cloud mana pekerjaan mendarat — yang justru dibutuhkan oleh pemulihan spot dan optimizer.

    Contoh Menyeluruh (End-to-End)

    Berikut alur yang utuh: definisikan pekerjaan pelatihan GPU, luncurkan di cloud termurah yang tersedia, lalu ubah menjadi managed spot job untuk jangka panjang.

    Pertama, definisi tugas yang membiarkan optimizer memilih perangkat keras dan cloud:

    # resnet.yaml
    

    resources:

    accelerators: {A100:1, A10G:1, L4:1}

    cpus: 8+

    disksize: 256

    workdir: .

    filemounts:

    /data:

    source: s3://my-bucket/imagenet

    mode: MOUNT

    /checkpoints:

    name: resnet-checkpoints

    store: s3

    mode: MOUNT

    envs:

    EPOCHS: "90"

    setup: |

    pip install -r requirements.txt

    run: |

    python trainresnet.py \

    --data-dir /data \

    --checkpoint-dir /checkpoints \

    --resume-if-exists \

    --epochs $EPOCHS

    Luncurkan secara interaktif pada opsi termurah, dengan autostop 15 menit agar bersih sendiri bila Anda meninggalkannya:

    sky launch resnet.yaml -c resnet-dev -i 15
    

    sky logs resnet-dev

    Setelah kode terverifikasi, jalankan pekerjaan penuh sebagai managed spot job agar bertahan dari preemption dan dari laptop yang terputus:

    sky jobs launch resnet.yaml -n resnet-full --use-spot
    

    sky jobs queue

    sky jobs logs --name resnet-full

    Saat pelatihan selesai, checkpoint sudah berada di S3, dan resources managed job dilepaskan otomatis. Bila Anda memakai cluster interaktif, hapus:

    sky down resnet-dev
    

    Python SDK

    Bila Anda lebih suka menjalankan SkyPilot dari kode — misalnya di dalam pipeline atau peluncur eksperimen — Python SDK mencerminkan CLI:

    import sky
    
    

    task = sky.Task(

    setup="pip install -r requirements.txt",

    run="python train.py --epochs $EPOCHS",

    workdir=".",

    envs={"EPOCHS": "10"},

    )

    task.setresources(

    sky.Resources(accelerators="A100:1", usespot=True)

    )

    Luncurkan ke cluster bernama

    sky.launch(task, clustername="sdk-run", idleminutestoautostop=10)

    Atau kirim sebagai managed job

    sky.jobs.launch(task, name="sdk-managed")

    SDK berguna saat Anda perlu menghasilkan tugas secara terprogram (sweep, run berparameter) atau mengintegrasikan SkyPilot ke lapisan orkestrasi yang sudah ada.

    Praktik Terbaik Pengendalian Biaya

    Keluwesan yang diberikan SkyPilot hanya menghemat uang bila Anda memakainya dengan sengaja. Beberapa kebiasaan ini paling berpengaruh.

    • Selalu atur autostop atau autodown. Sumber pemborosan terbesar adalah cluster GPU yang menganggur. Gunakan -i untuk cluster pengembangan dan --down untuk run sekali pakai agar tidak ada yang tersisa.
    • Gunakan spot untuk pekerjaan yang toleran kegagalan. Pelatihan dengan checkpointing, inferensi batch, dan pemrosesan data cocok untuk spot. Simpan on-demand untuk penyajian yang sensitif latensi yang tidak boleh terinterupsi, atau gunakan sedikit fallback on-demand bersama replika spot.
    • Sesuaikan ukuran resources. Minta akselerator terkecil yang memenuhi kebutuhan throughput Anda, dan tawarkan optimizer sekumpulan kandidat (misalnya {A100:1, A10G:1, L4:1}) alih-alih mengunci satu tipe. Lebih banyak kandidat berarti peluang lebih besar menemukan kapasitas murah.
    • Biarkan optimizer memilih cloud. Membiarkan cloud kosong memberi SkyPilot kebebasan menemukan region termurah yang tersedia di seluruh penyedia yang aktif.
    • Simpan data di object storage, bukan di disk. Me-mount bucket menghindari unggah ulang data tiap run dan menjaga disk boot tetap kecil, yang juga membuat pemulihan spot dan penempatan lintas region berjalan rapi.
    • Utamakan managed jobs untuk apa pun yang lama. Mereka bertahan dari pemutusan koneksi dan preemption, sehingga Anda tidak membayar run yang gagal di tengah jalan.

    Kesimpulan dan Poin Penting

    SkyPilot mengurangi gesekan dalam menjalankan beban kerja ML dan AI lintas cloud dengan mengubah "di mana dan bagaimana saya menyediakan ini" menjadi sebuah definisi tugas deklaratif ditambah sejumlah kecil perintah.

    • Sebuah task YAML tunggal (resources, setup, run, workdir, file_mounts, envs) mendeskripsikan pekerjaan satu kali dan menjalankannya di mana saja.
    • Optimizer membandingkan cloud dan region serta memilih opsi termurah yang tersedia, dengan failover otomatis saat kapasitas terbatas.
    • Managed jobs dengan pemulihan spot membuat komputasi preemptible berdiskon praktis untuk pelatihan jangka panjang, asalkan kode Anda melakukan checkpoint ke penyimpanan tahan lama.
    • SkyServe memperluas model yang sama ke endpoint inferensi multi-region yang autoscaling.
    • Kubernetes hanyalah backend lain, sehingga kapasitas on-premise dan cloud berbagi satu alur kerja.
    • Penggunaan autostop, spot, penyesuaian ukuran, dan object storage yang disiplin adalah sumber penghematan biaya yang sebenarnya.

    Jalur praktisnya adalah mulai dari kecil: aktifkan satu atau dua cloud, jalankan pekerjaan singkat secara interaktif dengan autostop pendek, lalu naikkan beban kerja menjadi managed spot job setelah terverifikasi. Dari sana, definisi yang sama meluas secara alami ke penyajian model dan ke backend tambahan seiring kebutuhan Anda bertumbuh.

    Artikel Terkait

    Tutorial Lengkap Terraform untuk ML: Infrastructure as Code untuk Machine Learning

    Tutorial Lengkap Terraform untuk ML: Infrastructure as Code untuk Machine Learning Terraform adalah tool Infrastructure ...

    Tutorial Lengkap NVIDIA NIM: Deploy Model AI dengan Performa Maksimal

    Tutorial Lengkap NVIDIA NIM (NVIDIA Inference Microservices) untuk Developer Indonesia Penulis: Ruby Abdullah Tanggal: 2...

    Tutorial Lengkap Prompt Flow: Framework Microsoft untuk Membangun Aplikasi LLM

    Tutorial Lengkap Prompt Flow: Framework Microsoft untuk Membangun Aplikasi LLM Prompt Flow adalah framework open-source ...

    Truss: Cara Package, Serve, dan Deploy Model ML dengan Rapi

    Truss: Cara Package, Serve, dan Deploy Model ML dengan Rapi Halo temen-temen, ketemu lagi sama aku, Ruby. Kali ini aku p...