Bab 10 ~4 jam

Deploy Model & MLOps

Model tidak berguna jika hanya di notebook. Pelajari cara membawa model ke produksi dengan API, container, dan pipeline otomatis.

10.1 REST API dengan FastAPI

FastAPI adalah standar modern untuk menyajikan model ML — cepat, type-hinted, dan otomatis terdokumentasi.

# app.py from fastapi import FastAPI from pydantic import BaseModel import joblib import numpy as np app = FastAPI(title="Klasifikasi Iris") model = joblib.load("model.joblib") scaler = joblib.load("scaler.joblib") class InputIris(BaseModel): sepal_length: float sepal_width: float petal_length: float petal_width: float class Prediksi(BaseModel): spesies: str probabilitas: dict @app.post("/predict", response_model=Prediksi) async def predict(data: InputIris): fitur = np.array([[data.sepal_length, data.sepal_width, data.petal_length, data.petal_width]]) fitur_scaled = scaler.transform(fitur) proba = model.predict_proba(fitur_scaled)[0] spesies = model.classes_[np.argmax(proba)] return Prediksi( spesies=spesies, probabilitas={str(c): round(float(p), 4) for c, p in zip(model.classes_, proba)} ) # Jalankan: uvicorn app:app --host 0.0.0.0 --port 8000 # Dokumentasi di: http://localhost:8000/docs
Uji coba: FastAPI otomatis menghasilkan dokumen interaktif di /docs (Swagger UI) dan /redoc. Tidak perlu frontend untuk menguji API Anda.

10.2 Kontainer Docker

Docker memaketkan model, kode, dan dependensi ke dalam kontainer portabel yang berjalan identik di mana saja.

# Dockerfile FROM python:3.11-slim WORKDIR /app # Install dependensi COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Salin model dan kode COPY model.joblib scaler.joblib ./ COPY app.py ./ # Expose port EXPOSE 8000 # Health check HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost:8000/health || exit 1 CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
# Build dan jalankan docker build -t klasifikasi-iris . docker run -p 8000:8000 klasifikasi-iris # Uji API curl -X POST http://localhost:8000/predict \ -H "Content-Type: application/json" \ -d '{"sepal_length":5.1,"sepal_width":3.5,"petal_length":1.4,"petal_width":0.2}'

10.3 Versioning Model

Lacak eksperimen, parameter, dan artefak model secara sistematis.

import mlflow import mlflow.sklearn mlflow.set_experiment("klasifikasi-iris") with mlflow.start_run(run_name="random_forest_v2"): # Log parameter mlflow.log_params({"n_estimators": 200, "max_depth": 5}) # Latih model model = RandomForestClassifier(n_estimators=200, max_depth=5) model.fit(X_train, y_train) # Log metrik mlflow.log_metrics({"akurasi": akurasi, "f1": f1}) # Log model mlflow.sklearn.log_model(model, "model") # Serve model yang sudah di-log mlflow.sklearn.serve("runs:/<run-id>/model", port=5000)

10.4 Pipeline CI/CD

Otomatiskan pengujian, pembangunan, dan deployment model ML Anda.

# .github/workflows/deploy.yml name: Latih & Deploy on: push: branches: [main] schedule: - cron: '0 0 * * 0' # Retrain mingguan jobs: latih-dan-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: { python-version: '3.11' } - run: pip install -r requirements.txt - run: pytest tests/ - run: python train.py - run: docker build -t model:${{ github.sha }} . - run: docker push registry/model:${{ github.sha }}

10.5 Monitoring & Deteksi Drift

Model akan menurun kinerjanya seiring waktu. Monitoring mendeteksi kapan retraining diperlukan.

Data Drift

Distribusi fitur input berubah. Deteksi dengan uji KS, PSI, atau chi-kuadrat. Contoh: pola musiman, demografi pengguna baru.

Concept Drift

Hubungan fitur-target berubah. Lebih sulit dideteksi. Contoh: pola fraud berevolusi, perubahan regime pasar.

from scipy import stats # Population Stability Index (PSI) def hitung_psi(expected, actual, buckets=10): breaks = np.quantile(expected, np.linspace(0, 1, buckets + 1)) expected_pct = np.histogram(expected, bins=breaks)[0] / len(expected) actual_pct = np.histogram(actual, bins=breaks)[0] / len(actual) expected_pct = np.clip(expected_pct, 0.0001, None) actual_pct = np.clip(actual_pct, 0.0001, None) psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct)) return psi # PSI < 0.1: tidak ada drift | 0.1-0.25: sedang | > 0.25: signifikan

10.6 Praktik Terbaik MLOps

  • Versioning segalanya: Kode, data, model, konfigurasi — semuanya di-versioning. Gunakan Git untuk kode, DVC untuk data, MLflow untuk model.
  • Otomatiskan pipeline: Dari ingesti data hingga deployment. Langkah manual memperkenalkan error dan tidak scalable.
  • Uji secara menyeluruh: Unit test untuk transformasi data, integration test untuk pipeline, performance test untuk model.
  • Buat eksperimen reproducible: Tetapkan random seed, pin versi library, log semua hyperparameter.
  • Rancang untuk rollback: Selalu simpan versi model sebelumnya yang masih berjalan. Deployment canary untuk model baru.
  • Monitor di produksi: Lacak distribusi prediksi, latensi, error rate, dan metrik bisnis.
  • Dokumentasikan model: Model cards berisi: tujuan, data training, keterbatasan, analisis keadilan, benchmark kinerja.
Latihan Akhir: Proyek end-to-end: latih model pada dataset California housing, simpan, buat wrapper FastAPI, kontainerisasi dengan Docker, dan deploy secara lokal. Tambahkan health check dan validasi input dasar.

Kursus Selesai! 🎉

Anda telah menempuh seluruh pipeline data science dan machine learning — dari dasar Python hingga deployment ke produksi. Terus berlatih, terus membangun, terus belajar.

Kembali ke Ikhtisar Mata Kuliah