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:
setup Anda satu kali, lalu perintah run.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:
resourcesmenjelaskan perangkat keras.acceleratorsmemakai bentukNAMA:JUMLAH(A100:1,T4:4,H100:8). Anda juga dapat membiarkancloudkosong agar optimizer yang memilih, dan menyetelusespot: trueuntuk meminta instance preemptible berdiskon.setupberjalan satu kali saat cluster pertama kali disediakan (atau saat setup berubah). Letakkan instalasi dependensi di sini agar run berikutnya cepat.runadalah perintah sebenarnya yang menjalankan beban kerja Anda.workdirmenyinkronkan direktori lokal ke cluster sebelum tiap run. Jaga tetap kecil; dataset besar sebaiknya difilemounts.filemountsmemetakan path remote ke file lokal atau bucket cloud. Me-mount bucket memberi pekerjaan akses langsung ke object storage tanpa menyalin semuanya di awal.envsmendeklarasikan 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
-iuntuk cluster pengembangan dan--downuntuk 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
cloudkosong 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.