Menyajikan model ke skala produksi: deployment di Kubernetes dengan resource limits yang benar, autoscaling berbasis metrik inference, serta multi-tenant serving untuk melayani banyak model dan banyak pelanggan dengan isolasi dan biaya yang terkontrol

Setelah di episode 21 kita melatih model dengan banyak GPU, sekarang giliran sisi lain dari skala: serving. Model yang dilatih sebesar apa pun tidak ada artinya jika saat dipanggil ribuan pengguna ia ambruk. Di episode 9 kita serving di satu mesin; kini kita naik ke skala produksi: Kubernetes, autoscaling, dan multi-tenant serving.
Serving at scale punya tantangan unik yang berbeda dari serving aplikasi biasa: model butuh GPU (mahal), beban inference bersifat bursty (melonjak mendadak), dan satu mesin biasanya melayani satu keluarga model saja. Episode ini membangun fondasi: deploy di Kubernetes dengan resource yang benar, autoscaling berbasis metrik yang tepat, dan pola multi-tenant untuk mengendalikan biaya.
Kubernetes memberi tiga hal yang dibutuhkan serving skala: elastisitas (menambah/mengurangi pod otomatis), resilience (restart saat gagal), dan declarative config (semua terdokumentasi di git).
apiVersion: apps/v1
kind: Deployment
metadata:
name: churn-api
spec:
replicas: 2
selector:
matchLabels:
app: churn-api
template:
metadata:
labels:
app: churn-api
spec:
containers:
- name: churn-api
image: registry.example/churn-api:1.4.2
ports:
- containerPort: 8000
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: "2"
memory: 2Gi
readinessProbe:
httpGet:
path: /healthz
port: 8000Dua hal yang wajib kalian pahami sejak awal:
/healthz sehat — mencegah request dikirim ke model yang belum siap (model loading bisa butuh menit untuk model besar).Autoscaler standar HPA mengukur CPU — yang untuk serving ML sering menyesatkan: GPU bisa 100% sementara CPU menganggur. Solusinya, scale berdasarkan metrik inference (RPS, request per pod) atau queue depth:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: churn-api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: churn-api
minReplicas: 2
maxReplicas: 20
metrics:
- type: External
external:
metric:
name: inference_rps_per_pod
target:
type: AverageValue
averageValue: 50Prinsip autoscaling serving:
Untuk LLM, GPU utilization bukan satu-satunya: KV cache (episode 15) menentukan berapa request konkuren yang muat. Autoscaling LLM sering dihitung dari estimated concurrent requests vs max_num_seqs.
Saat melayani banyak model (tim internal, banyak pelanggan, banyak versi), muncul pilihan arsitektur:
| Pola | Cara | Cocok | Trade-off |
|---|---|---|---|
| Satu model per service | Tiap model punya deployment sendiri | Isolasi kuat | Boros resource, banyak service |
| Multi-model per service | Satu deployment memuat beberapa model (Triton/Seldon) | Hemat GPU, model kecil | Blast radius lebih besar |
| Model mesh / gateway | Gateway routing ke kumpulan serving | Skala banyak model | Kompleksitas infrastruktur |
Multi-model serving dengan Triton adalah cara paling efisien: satu proses GPU melayani beberapa model, memanfaatkan idle satu model dengan model lain. Pengaturan per-model (resource, GPU quota, concurrency) penting untuk mencegah satu penyewa rakus menghabiskan resource bersama.
Konsep yang wajib ada di sistem multi-tenant:
LLM serving (episode 15) di K8s punya tambahan:
--tensor-parallel-size + resource nvidia.com/gpu: 2. resources:
limits:
nvidia.com/gpu: 1
memory: 48Gi
requests:
nvidia.com/gpu: 1
memory: 40GiBiaya adalah metrik serving yang paling sering diabaikan. Empat lever utama:
| Lever | Cara |
|---|---|
| Pilih ukuran model yang tepat | Terkecil yang cukup (episode 15) |
| Autoscale agresif saat idle | Turun ke 0-2 pod di luar jam sibuk |
| Multi-model di satu GPU | Manfaatkan idle (Triton) |
| Batch inference | Gabungkan request untuk model batch |
Important
Menghitung biaya serving hanya dari "harga GPU per jam" itu salah. Biaya sesungguhnya adalah harga per 1.000 prediksi — yang menggabungkan pemilihan model, efisiensi batching, dan pemakaian resource. Ukur metrik ini dari awal; kalian akan terkejut betapa besarnya perbedaan antar pilihan arsitektur.
| Pitfall | Dampak | Pencegahan |
|---|---|---|
| HPA berbasis CPU untuk serving ML | Salah trigger saat GPU yang penuh | Metrik inference (RPS/concurrency) |
| Tanpa readinessProbe | Trafik masuk sebelum model siap | Probe /healthz |
| GPU request di lupakan di yaml | Pod dijadwalkan di node tanpa GPU | nvidia.com/gpu requests |
| Satu tenant rakus resource | Tenant lain melambat | Quota + metrik per tenant |
| Over-provisioning abadi | Biaya GPU meledak | Autoscale + scale-to-zero saat idle |
Pada episode 22 ini, kalian telah membangun serving skala produksi:
Di episode 23 selanjutnya kita akan membahas Model Optimization — kuantisasi INT8/FP8, distillation, dan pruning: cara membuat model lebih kecil, lebih cepat, dan lebih hemat biaya tanpa mengorbankan kualitas secara signifikan. Sampai jumpa di episode 23!