Model dengan akurasi bagus di notebook itu baru separuh cerita. Separuh lainnya — yang dulu saya abaikan total — adalah bagaimana model itu tetap hidup di produksi: di-retrain saat data berubah, bisa dilacak versinya, di-deploy tanpa drama, dan dipantau performanya. Itulah MLOps. Anggap seperti DevOps tapi objek yang di-deploy bukan kode, melainkan kode + data + model sekaligus. Episode ini catatan saya memahami empat pilar MLOps.
Pilar 1: Pipeline yang Reproducible
Pipeline ML adalah rangkaian langkah dari data mentah sampai model terlatih: ingest, cleaning, feature engineering, training, evaluasi. Masalah klasik notebook: urutan eksekusi sel acak, hasil tiap run beda, tidak ada yang tahu model produksi dibuat dari data versi mana. Prinsipnya sama seperti CI/CD: setiap artefak harus bisa direproduksi dari sumbernya. scikit-learn punya abstraksi Pipeline yang menyatukan preprocessing dan model jadi satu objek — mengurangi kebocoran data antara train dan test:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
pipe = Pipeline([
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000)),
])
scores = cross_val_score(pipe, X, y, cv=5)
print(scores.mean())Pilar 2: Versioning Data & Model
Kode kita versioning pakai Git; data dan model juga perlu perlakuan sama. Kalau minggu depan akurasi turun, pertanyaan pertama: “model mana? dilatih dari data mana? dengan hyperparameter apa?” Tanpa versioning, jawabannya menebak-nebak. Tools umum: DVC untuk versioning dataset besar di atas Git, MLflow untuk melacak eksperimen (parameter, metrik, artefak model). Contoh logging sederhana dengan MLflow:
import mlflow
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=42)
with mlflow.start_run():
mlflow.log_param("n_estimators", 200)
clf = RandomForestClassifier(n_estimators=200, random_state=42)
clf.fit(X_tr, y_tr)
acc = accuracy_score(y_te, clf.predict(X_te))
mlflow.log_metric("accuracy", acc)
mlflow.sklearn.log_model(clf, "model")Pilar 3: Deployment
Cara termurah menyajikan model: bungkus sebagai REST API. FastAPI pilihan populer karena cepat dan validasi skema otomatis via Pydantic:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Features(BaseModel):
sepal_length: float
sepal_width: float
petal_length: float
petal_width: float
@app.post("/predict")
def predict(f: Features):
x = [[f.sepal_length, f.sepal_width, f.petal_length, f.petal_width]]
return {"prediction": int(clf.predict(x)[0])}Untuk skala lebih besar ada serving khusus seperti TensorFlow Serving atau TorchServe, plus strategi rilis yang familiar bagi web developer: canary deployment, A/B testing antar versi model, rollback cepat.
Pilar 4: Monitoring
Model tidak rusak mendadak seperti server down — ia membusuk perlahan. Data dunia nyata bergeser (data drift), distribusi input berubah, dan akurasi tergerus diam-diam. Yang dipantau minimal: latensi dan error rate API (seperti service biasa), distribusi fitur input vs waktu training, dan proxy label ground truth kalau tersedia. Ketika drift terdeteksi, picu retraining. Monitoring tanpa aksi retraining hanya pajangan dashboard.
| Tahap | Masalah tanpa MLOps | Praktik minimum |
|---|---|---|
| Pipeline | Notebook tak reproducible | Pipeline + seed tetap |
| Versioning | Lupa model versi mana | MLflow/DVC |
| Deployment | Model dikirim via email/screenshot | REST API + container |
| Monitoring | Akurasi turun tak terdeteksi | Drift check + alert |
Jujur saja: untuk proyek pribadi saya belum menjalankan semua ini penuh. Tapi sekali model harus dipertanggungjawabkan ke user nyata, MLOps berhenti jadi kata kunci LinkedIn dan mulai jadi kebutuhan.
Komentar Terbaru