Mempelajari MLOps: model registry, CI/CD untuk machine learning, monitoring data drift, dan observability GenAI dengan OpenTelemetry; serta deployment model lewat API serving (vLLM, TorchServe, Triton), container (Docker/Kubernetes), dan serverless.

Setelah 17 episode membangun kemampuan teknis dan kepatuhan, episode ini masuk ke fase yang menentukan nasib produksi: MLOps dan deployment. Model yang hebat di notebook adalah biaya, bukan aset — ia baru menjadi aset ketika bisa diserve dengan andal, dimonitor, dan diperbarui tanpa downtime.
Mengapa episode ini penting? Karena pola kegagalan paling umum proyek AI bukan "modelnya tidak akurat", melainkan "model bekerja di notebook tapi tidak pernah sampai ke produksi" atau "model di produksi diam-diam menurun performanya". MLOps adalah disiplin yang menjembatani keduanya.
Model registry adalah "sistem kontrol versi" untuk model — menyimpan model, versi, metadata (data training, metrik, siapa yang membuat), dan status siklus hidupnya. MLflow (episode 11) menyediakan ini, begitu juga W&B dan platform lain.
Alur standarnya: model lulus evaluasi → naik ke staging untuk pengujian → disetujui ke production → diarsipkan saat digantikan. Setiap model produksi harus bisa dijawab: berapa versinya, dilatih dengan data apa, skor berapa? — tautan langsung ke audit trail episode 17.
CI/CD klasik otomatis men-build dan men-deploy kode. Untuk ML, pipeline-nya diperluas:
| Tahap | Tradisional | ML/GenAI |
|---|---|---|
| Integrasi | Build & unit test | + Validasi data, linting dataset |
| Model training | — | Training & tracking (episode 11) |
| Evaluasi | — | Metrik + threshold kelulusan |
| Deployment | Deploy app | + Deploy model, promote ke registry |
| Monitoring | Log & alert | + Drift & quality monitoring |
Pola yang dianjurkan: semua perubahan (data, kode, model) melewati pipeline yang sama dan hanya lolos jika syarat terpenuhi — model tidak boleh naik produksi jika skor evaluasinya di bawah baseline, atau jika data training-nya tidak valid.
Model harus diserve sebagai API. Tiga opsi utama:
vllm serve Qwen/Qwen2.5-7B-Instruct \
--port 8000 \
--max-model-len 8192Setelah berjalan, endpoint /v1/chat/completions — format OpenAI-compatible yang kita pakai di episode 14 — siap dipanggil aplikasi kalian.
Model diserve dalam container (Docker) agar konsisten di semua environment, lalu diorkestrasi dengan Kubernetes untuk skala dan self-healing:
FROM vllm/vllm-openai:latest
CMD ["--model", "Qwen/Qwen2.5-7B-Instruct", "--port", "8000"]Kubernetes menangani hal yang bukan urusan model: auto-scaling saat beban naik, restart saat crash, dan distribusi GPU. Ini topik yang bisa kalian perdalam di series belajar-kubernetes — di sini yang penting adalah polanya: model = workload yang sama seperti service lain.
Untuk model kecil atau pemakaian tidak menentu, serverless (misal AWS Lambda, Cloud Run, atau provider serverless LLM) menawarkan skala nol-ke-besar tanpa mengelola server:
Pilihan pragmatis: serverless untuk aplikasi yang jarang dipakai & model kecil; dedicated (vLLM/K8s) untuk beban stabil atau model besar.
Masalah terbesar ML di produksi: model yang akurat saat training menurun karena dunia berubah. Ini disebut drift, dan ada tiga jenis:
| Jenis Drift | Arti | Deteksi |
|---|---|---|
| Data drift | Distribusi data input berubah (perilaku pengguna berubah) | Bandingkan distribusi input produksi vs training |
| Concept drift | Hubungan input-output berubah (aturan bisnis baru) | Pantau metrik prediksi vs outcome aktual |
| Model drift | Kualitas prediksi menurun | Bandingkan metrik online vs evaluasi awal |
import numpy as np
def report_drift(train_mean: float, prod_mean: float,
train_std: float, threshold: float = 2.0) -> str:
z = abs(prod_mean - train_mean) / train_std
return "ALERT: drift" if z > threshold else "normal"
print(report_drift(train_mean=0.42, prod_mean=0.61,
train_std=0.08))OpenTelemetry (OTel) — standar open-source untuk tracing, metrics, dan logs — kini memiliki dukungan untuk GenAI: semantic conventions khusus untuk LLM (span jenis gen_ai.operation, atribut gen_ai.model.name, dll). Ini memungkinkan kalian men-trace satu permintaan end-to-end: user → guardrail → retrieval → LLM → tool → respons.
from opentelemetry import trace
tracer = trace.get_tracer("genai-app")
with tracer.start_as_current_span("chat-completion") as span:
span.set_attribute("gen_ai.model.name", "qwen3:8b")
response = llm_call(messages)
span.set_attribute("gen_ai.usage.completion_tokens", response.usage)Metrik penting yang dipantau untuk aplikasi GenAI:
Tip
Perbedaan mindset: aplikasi biasa cukup memonitor apakah sistem hidup (uptime, latency, error). Aplikasi AI harus memonitor apakah sistem masih berkualitas — drift, hallucination rate, dan cost. Itu pembeda MLOps dari DevOps klasik. Series belajar-opentelemetry bisa memperdalam sisi observability ini.
Inti yang harus dibawa pulang:
Di episode 19 selanjutnya kita akan mengoptimalkan sisi finansial: Scale & Cost Optimization — GPU inference, kuantisasi (GGUF, AWQ), caching, batching, model routing, dan strategi hybrid self-host vs API untuk menekan biaya tanpa mengorbankan kualitas. Sampai jumpa di episode 19!