Mengelola siklus hidup model secara terpusat: MLflow Model Registry, stage staging/production/archived, promotion model yang terotomasi, versioning semantic, dan lineage yang menghubungkan model ke data dan kode.

Setelah di episode 10 kalian memilih pola deployment, sekarang kita bereskan masalah yang lebih mendasar: di mana model hidup dan bagaimana perjalanannya. Di organisasi tanpa registry, model "produksi" tinggal di folder laptop seseorang — dan ketika harus rollback, tidak ada yang tahu model mana yang sebelumnya dipakai.
Mengapa model registry adalah tulang punggung MLOps? Karena model adalah artefak yang berubah dan punya siklus hidup: lahir dari eksperimen, dipromosikan ke staging, disetujui ke produksi, lalu diarsipkan saat pensiun. Registry adalah single source of truth untuk seluruh perjalanan itu — dengan versi, stage, dan lineage yang tercatat.
MLflow Model Registry adalah direktori terpusat untuk model terdaftar. Dua entitas kunci:
churn-predictor).Setiap versi melewati stage:
| Stage | Arti |
|---|---|
None / Unstaged | Versi baru, belum diklasifikasi |
Staging | Lolos CI, menunggu evaluasi lebih lanjut |
Production | Model aktif yang melayani traffic |
Archived | Pensiun, tidak lagi dipakai |
Versioning model bersifat immutable: versi tidak bisa diubah isinya setelah dibuat. Kalian tidak "mengedit" model — kalian membuat versi baru. Inilah yang membuat rollback menjadi operasi yang aman dan dapat dilacak.
Setelah training (episode 5) dan setelah CI meloloskan (episode 8), daftarkan model:
import mlflow
from mlflow.tracking import MlflowClient
client = MlflowClient()
result = client.create_registered_model("churn-predictor")
version = client.create_model_version(
name="churn-predictor",
source="runs:/abc123/model",
description="RF v2, feature set F12, data churn v1.4",
)
print(f"Model version: {version.version}")Perhatikan deskripsi: ia mencatat konteks — fitur yang dipakai, versi data. Inilah benih lineage yang akan kita lengkapi nanti.
Promosi model adalah keputusan yang sebaiknya tidak dilakukan sembarangan. Alur yang sehat:
None.Staging untuk pengujian (shadow traffic, A/B).Production.Archive.client.transition_model_version_stage(
name="churn-predictor",
version=3,
stage="Staging",
archive_existing_versions=False,
)
client.transition_model_version_stage(
name="churn-predictor",
version=3,
stage="Production",
archive_existing_versions=True,
)Parameter archive_existing_versions=True secara otomatis mengarsipkan versi yang sebelumnya Production — pola yang mencegah dua model "production" sekaligus.
MLflow modern menyarankan alias daripada stage untuk deployment: alias (seperti champion, candidate) memberi semantik yang lebih fleksibel dan bisa dipindahkan tanpa transisi stage:
client.set_registered_model_alias("churn-predictor", "champion", version=3)Serving kemudian mengambil model "yang sekarang champion" — tanpa tahu nomor versinya. Ini memisahkan nama deployment dari nomor versi, sehingga rollback cukup memindahkan alias.
Model juga bisa diberi semantic version seperti software: MAJOR.MINOR.PATCH.
Konsistensi versioning memudahkan komunikasi: "kita pakai churn-predictor 2.3.0" langsung memberi informasi bahwa schema sama dengan 2.x, berbeda dari 1.x.
Registry yang baik menjawab pertanyaan audit: "model produksi ini dilatih dari apa?". Lineage menghubungkan tiga komponen:
| Komponen | Sumber Kebenaran | Episode |
|---|---|---|
| Kode | Git commit (mlflow.log_param("git_commit", ...)) | 3 |
| Data | DVC hash (episode 6) | 6 |
| Eksperimen | MLflow run ID | 5 |
| Model | Registry version | 11 |
Rangkai di dalam training:
import mlflow
import subprocess
commit = subprocess.check_output(["git", "rev-parse", "HEAD"]).decode().strip()
data_hash = subprocess.check_output(["dvc", "data", "status"]).decode().strip()
with mlflow.start_run() as run:
mlflow.log_param("git_commit", commit)
mlflow.log_param("data_version", data_hash)
# ... training ...
mlflow.sklearn.log_model(model, artifact_path="model")
client.set_registered_model_alias("churn-predictor", "champion", run.info.run_id)Sekarang, untuk setiap model di produksi, kalian bisa menjawab: dibangun dari kode commit apa, di atas data hash apa, oleh run eksperimen mana. Ini prasyarat untuk governance & audit di episode 15.
Tip
Buat kebiasaan: sebelum mendeploy, tanyakan "apakah model ini punya lineage lengkap?". Jika tidak — kode dari mana, data versi apa — jangan deploy. Kebiasaan kecil ini menyelamatkan tim dari model misterius yang tidak bisa diaudit.
champion/candidate memisahkan logika serving dari nomor versi.archive_existing_versions.Pada episode 11 ini, kalian telah mengelola siklus hidup model secara terpusat.
Inti yang harus dibawa pulang:
None → Staging → Production → Archived.champion) memisahkan nama deployment dari nomor versi — rollback jadi mudah.Di episode 12 selanjutnya kita akan membahas monitoring & drift detection — data drift, concept drift, metrik model di produksi, dan tools Evidently/WhyLabs/Prometheus untuk menangkap model yang mulai rusak secara diam-diam. Sampai jumpa di episode 12!