Belajar MLOps - CI/CD untuk ML
Episode 8 of 28

Belajar MLOps - CI/CD untuk ML

Membangun CI/CD khusus untuk machine learning: unit test data & model, validasi skema, training test, quality gates evaluasi, dan promo model via GitHub Actions, plus perbandingan dengan GitLab CI.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 7 training pipeline berjalan terjadwal, sekarang kita amankan proses sebelum pipeline itu jalan: CI/CD. Di DevOps biasa, CI menjalankan lint, test, dan build untuk kode. Di MLOps, CI harus menjalankan hal yang sama plus hal-hal khas ML: validasi data, test model, dan evaluasi kualitas sebagai gate sebelum model berhak dipromosikan.

Mengapa CI/CD untuk ML penting? Karena model yang rusak sering tidak menghasilkan error — ia menghasilkan prediksi yang salah. CI/CD untuk ML memastikan bahwa sebelum model menyentuh produksi, ia sudah lolos tes skema data, unit test, dan threshold kualitas yang disepakati tim. Inilah pembeda antara "deploy lalu berharap" dan "deploy karena terbukti".

Perbedaan CI/CD Model vs Kode

TahapCI/CD KodeCI/CD ML
TestUnit test logika+ Test skema data, bentuk output
BuildCompile binary+ Build & cache training image
GateSemua test hijau+ Threshold metrik model
OutputArtifact aplikasi+ Model artifact & registry
DeployRollout aplikasi+ Promosi model staging→prod

Garis besarnya: di ML, "berhasil build" tidak berarti "model bagus". CI/CD ML menambahkan kualitas data & model sebagai gate.

Struktur GitHub Actions untuk ML

Kita pakai project churn-predictor dari episode 3. Tambahkan workflow di .github/workflows/ci.yml:

.github/workflows/ci.yml
name: ML CI
 
on:
  pull_request:
  push:
    branches: [main]
 
jobs:
  test-and-train:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
 
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
 
      - name: Install dependencies
        run: pip install -r requirements.lock
 
      - name: Lint & type check
        run: |
          ruff check src tests
          pyright src
 
      - name: Unit test
        run: pytest -q
 
      - name: Train smoke model
        run: python -m churn.train --max-samples 1000
 
      - name: Evaluate quality gate
        run: python -m churn.evaluate --min-accuracy 0.80

Alur yang terjadi:

  1. Lint & type check — kualitas kode (episode 3).
  2. Unit testpytest untuk skema data & bentuk output.
  3. Train smoke model — training kecil (sample 1000 baris) untuk memastikan pipeline jalan, bukan training penuh — CI harus cepat.
  4. Evaluate quality gate — model diukur; jika accuracy di bawah 0.80, job gagal dan PR ditolak.

Warning

Jangan lakukan training penuh di CI — bisa memakan berjam-jam dan membuat developer menunggu. Gunakan smoke test: training kecil yang cukup untuk membuktikan pipeline sehat. Training penuh tetap ditangani pipeline episode 7 yang berjalan sesuai jadwal.

Quality Gate: Validasi Model

Gate evaluasi adalah otak dari CI/CD ML. Contoh implementasi:

Gate kualitas model
import json
import sys
import mlflow
 
def evaluate_gate(min_accuracy: float) -> None:
    acc = evaluate_on_holdout()
    report = {
        "accuracy": acc,
        "passed": acc >= min_accuracy,
    }
    print(json.dumps(report, indent=2))
    if not report["passed"]:
        sys.exit(f"GAGAL: accuracy {acc:.3f} < {min_accuracy}")

Perhatikan ini bukan sekadar "model jalan", tapi threshold bisnis: akurasi di bawah target = model tidak layak produksi, apa pun alasannya. Threshold ini sebaiknya disepakati dengan pemangku kepentingan, bukan diputuskan sepihak oleh engineer.

Integrasi dengan MLflow dan Registry

Setelah gate lolos, CI bisa langsung mendaftarkan model ke registry dengan tag:

Register model dari CI
import mlflow
 
def promote_to_registry(run_id: str) -> None:
    client = mlflow.tracking.MlflowClient()
    result = client.create_registered_model("churn-predictor")
    client.create_model_version(
        name="churn-predictor",
        source=f"runs:/{run_id}/model",
        tags={"ci": "main", "commit": "abc123"},
    )

Ini menghubungkan CI dengan Model Registry — yang akan kita bedah penuh di episode 11. Model yang diloloskan CI adalah kandidat untuk staging, bukan langsung produksi; keputusan akhir ada di tangan manusia atau aturan promosi.

GitLab CI

Jika tim memakai GitLab, konsepnya sama dengan .gitlab-ci.yml:

.gitlab-ci.yml
stages: [test, train, evaluate]
 
test:
  stage: test
  image: python:3.12-slim
  script:
    - pip install -r requirements.lock
    - pytest -q
 
train:
  stage: train
  image: python:3.12-slim
  script:
    - python -m churn.train --max-samples 1000
  artifacts:
    paths: [models/]
 
evaluate:
  stage: evaluate
  image: python:3.12-slim
  script:
    - python -m churn.evaluate --min-accuracy 0.80
  dependencies: [train]

GitLab memberi stage pipeline yang eksplisit dan artifact passing antar stage — pola yang sebenarnya universal di semua CI/CD tool.

Common Pitfalls

  • Training penuh di CI → pipeline lambat, developer frustrasi; pakai smoke test.
  • Tanpa quality gate → "build hijau" padahal model jelek; evaluasi harus jadi gate.
  • Data tidak tersedia di CI → CI gagal karena tidak bisa mengunduh dataset; pasang DVC remote (dvc pull) di workflow.
  • Threshold ditentukan belakangan → gate yang "aman-aman saja" tidak menahan apa pun; sepakati threshold di awal.
  • Artifact tidak di-upload → model dari CI hilang; simpan di registry/artifact storage.

Penutup

Pada episode 8 ini, kalian telah membangun CI/CD khusus ML.

Inti yang harus dibawa pulang:

  • CI/CD ML = CI biasa + validasi data/model + quality gate.
  • Pakai smoke training di CI; training penuh di pipeline episode 7.
  • Gate evaluasi mengubah threshold kualitas menjadi bagian dari review PR.
  • Model yang lolos CI didaftarkan ke registry — dipromosikan di episode 11.

Di episode 9 selanjutnya kita akan membahas model packaging & serving — cara mengubah model jadi API yang bisa dipanggil: FastAPI, BentoML, TorchServe, dan Triton, lengkap dengan contoh request-response nyata. Sampai jumpa di episode 9!

Belajar MLOps - CI/CD untuk ML | Belajar MLOps