Membawa model dari notebook ke produksi: kolaborasi dengan ML engineer, pola deployment (API, batch, embedded), monitoring performa & drift, dan praktik proses rilis model yang aman dan terdokumentasi

Setelah di episode 23 kita menangani skala besar, pada episode ini kita menutup celah paling sering diabaikan: membawa model ke produksi. Model terbaik di dunia bernilai nol jika tidak berjalan di dunia nyata — dan transisi notebook → produksi adalah tempat banyak proyek gagal.
Mengapa episode ini penting bagi data scientist? Karena data scientist tidak harus jadi ML engineer, tetapi harus tahu cara berkolaborasi dengan mereka — apa yang harus diserahkan, dalam format apa, dan dengan dokumentasi apa. Model yang dikirim tanpa pipeline yang jelas, tanpa tracking, dan tanpa monitoring adalah sumber konflik dan kegagalan yang tak perlu. Episode ini membangun bahasa bersama itu.
Dua peran yang bekerja sama (bukan bersaing):
| Aspek | Data Scientist | ML Engineer |
|---|---|---|
| Fokus | Problem, data, model, insight | Sistem, deployment, skalabilitas |
| Keluaran | Model + analisis + rekomendasi | Layanan model yang andal |
| Lingkungan | Notebook, eksperimen | Pipeline, CI/CD, infrastruktur |
| Kepemilikan | Menentukan "apa" & "kenapa" | Menerapkan "bagaimana" & "berapa" |
Pembagian kerja yang sehat: data scientist menyiapkan model yang reproducible (episode 12) + documentation (episode 20); ML engineer mengurus serving, autoscaling, dan pipeline. Ketika keduanya berkomunikasi lewat artefak standar (registry, model card), kolaborasi menjadi mulus.
Tiga pola utama menghadirkan model ke pengguna:
| Pola | Cara Kerja | Kapan Dipakai |
|---|---|---|
| Batch | Model menjalankan skor terjadwal | Prioritas, laporan berkala |
| Online / API | Model melayani permintaan real-time | Keputusan per-transaksi |
| Embedded | Model masuk ke aplikasi/sidecar | Latensi sangat rendah, offline |
Pola paling umum untuk model seperti churn — skor dihitung berkala:
import pandas as pd
import mlflow
model = mlflow.sklearn.load_model("models:/churn-prod/Production")
customers = pd.read_sql("SELECT * FROM customers_active", engine)
customers["churn_score"] = model.predict_proba(customers[X_COLS])[:, 1]
customers.to_sql("churn_scores", engine, if_exists="replace")
print("skor dihitung untuk:", len(customers), "customer")Model dimuat dari registry (bukan file notebook), skor dihitung, dan hasil ditulis kembali ke database — pola yang di episode 8 kita persiapkan sejak dari SQL.
Untuk prediksi real-time (misal skor saat checkout):
from fastapi import FastAPI
import mlflow
import numpy as np
app = FastAPI()
model = mlflow.sklearn.load_model("models:/churn-prod/Production")
@app.post("/predict")
def predict(features: dict):
X = np.array([[features["tenure"],
features["monthly_charges"],
features["total_charges"]]])
proba = model.predict_proba(X)[0, 1]
return {"churn_probability": float(proba)}Endpoint kecil ini — dengan validasi input, logging, dan autentikasi yang ditambahkan ML engineer — menjadi layanan yang dipakai aplikasi lain. Satu hal yang wajib: preprocessing harus identik dengan training (pipeline episode 10), atau angka akan meleset diam-diam.
Important
Sumber kegagalan produksi paling umum: preprocessing berbeda antara training dan serving. Solusinya: serialisasi seluruh preprocessing dalam satu pipeline (episode 10) dan simpan sebagai artefak model (episode 12) — bukan menyalin kode transformasi ke file baru.
Setelah deploy, model tidak selesai — ia mulai memburuk seiring data berubah. Dua jenis drift yang wajib dipantau:
| Jenis | Arti | Dampak |
|---|---|---|
| Data drift | Distribusi fitur berubah | Input di luar yang dipelajari model |
| Concept drift | Hubungan fitur-target berubah | Model mempelajari pola usang |
import numpy as np
def drift_report(feature, train_values, live_values):
train_mean = np.mean(train_values)
live_mean = np.mean(live_values)
pct_change = (live_mean - train_mean) / train_mean * 100
return f"{feature}: training={train_mean:.2f}, " \
f"live={live_mean:.2f} ({pct_change:+.1f}%)"
print(drift_report("tenure", train["tenure"], live["tenure"]))Perubahan besar pada mean fitur = sinyal untuk meninjau model. Di produksi, monitoring dijaga ML engineer (misal Evidently, Prometheus); data scientist bertugas menentukan apa yang dipantau dan threshold-nya — memakai metrik dan pemahaman domain yang sudah kalian bangun.
Rilis model yang aman mengikuti alur — ini inti praktik "model release":
1. Kandidat model diuji (episode 11): metrik + fairness
2. Model card diperbarui (episode 20)
3. Model didaftarkan ke registry: Staging (episode 12)
4. Shadow / canary: uji di sebagian trafik
5. Jika aman → Production; jika tidak → rollback
6. Monitoring aktif: metrik + drift
7. Retraining terjadwal sesuai kebutuhanKata kunci di 2026: shadow/canary release — model baru berjalan paralel dengan yang lama, membandingkan output nyata, sebelum menggantikannya. Ini meminimalkan risiko tanpa berhenti dari deployment.
| Pitfall | Dampak | Solusi |
|---|---|---|
| Menyerahkan model tanpa pipeline | ML engineer tidak bisa deploy | Pipeline serialized sebagai artefak |
| Preprocessing beda saat serving | Prediksi meleset diam-diam | Satu pipeline untuk train & serve |
| Tanpa monitoring drift | Model memburuk tanpa disadari | Pantau fitur + metrik |
| Rilis langsung full trafik | Kegagalan berdampak semua | Shadow/canary dulu |
| Dokumentasi tertinggal | Model tak bisa dirawat | Model card sebelum rilis |
Inti yang harus dibawa pulang:
Di episode 25 selanjutnya kita akan membahas advanced modeling & ensemble — gradient boosting dengan XGBoost/LightGBM, teknik ensemble, dan hyperparameter tuning untuk membangun model kompetitif. Sampai jumpa di episode 25!