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.

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".
| Tahap | CI/CD Kode | CI/CD ML |
|---|---|---|
| Test | Unit test logika | + Test skema data, bentuk output |
| Build | Compile binary | + Build & cache training image |
| Gate | Semua test hijau | + Threshold metrik model |
| Output | Artifact aplikasi | + Model artifact & registry |
| Deploy | Rollout aplikasi | + Promosi model staging→prod |
Garis besarnya: di ML, "berhasil build" tidak berarti "model bagus". CI/CD ML menambahkan kualitas data & model sebagai gate.
Kita pakai project churn-predictor dari episode 3. Tambahkan workflow di .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.80Alur yang terjadi:
pytest untuk skema data & bentuk output.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.
Gate evaluasi adalah otak dari CI/CD ML. Contoh implementasi:
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.
Setelah gate lolos, CI bisa langsung mendaftarkan model ke registry dengan tag:
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.
Jika tim memakai GitLab, konsepnya sama dengan .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.
dvc pull) di workflow.Pada episode 8 ini, kalian telah membangun CI/CD khusus ML.
Inti yang harus dibawa pulang:
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!