পাঠ ৮ · ৩৩-এর মধ্যে · মডিউল ২
Home / AI Courses / MLOps / MLflow

Experiment tracking — MLflow

MLflow — tracking, registry, projects, models
৮ মিনিট পড়া মধ্য · Intermediate Python

এই পাঠে যা শিখবেন

  • MLflow-এর ৪টি component — কী, কেন
  • Tracking API — manual ও autolog
  • Run organize — experiments, parent/child run, tags
  • Production-grade backend setup

১ · কেন experiment tracking

একটি data scientist দিনে ১০-৩০টি experiment run করতে পারেন — different hyperparameters, different features. কোন combination best — মনে রাখা impossible. তাই tracking দরকার।

  • Without tracking: "৩ মাস আগে ৯২% পেয়েছিলাম, কিন্তু কী config-এ মনে নেই।"
  • With tracking: "এই run-এ AUC ০.৯২, hyperparams এই, code git SHA এই।"

২ · MLflow components

৪ component

Tracking: log params/metrics/artifacts/models per run.
Projects: reusable, reproducible code package (MLproject file).
Models: framework-agnostic model packaging format (flavors).
Model Registry: centralized versioned model lifecycle (Lesson 11).

৩ · Tracking — manual API

Python · MLflow tracking
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score

mlflow.set_tracking_uri("http://mlflow.local:5000")
mlflow.set_experiment("bangla-sentiment")

with mlflow.start_run(run_name="rf-baseline") as run:
    # ১. params log
    n_estimators = 100
    max_depth = 8
    mlflow.log_params({
        "n_estimators": n_estimators,
        "max_depth": max_depth,
        "data_version": "v3",
    })

    # ২. train
    model = RandomForestClassifier(
        n_estimators=n_estimators, max_depth=max_depth, random_state=42
    )
    model.fit(X_train, y_train)

    # ৩. metric log
    auc = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
    mlflow.log_metric("auc", auc)

    # ৪. model log (with signature for serving)
    mlflow.sklearn.log_model(
        model,
        artifact_path="model",
        registered_model_name="bangla-sentiment-rf",
    )

    # ৫. tag — searchable
    mlflow.set_tag("team", "nlp")
    mlflow.set_tag("env", "dev")

    print(f"Run id: {run.info.run_id}")
    print(f"AUC: {auc:.4f}")

    
start_run context-এ সব log নিজেই grouped. UI-তে গিয়ে এই run compare করা যাবে অন্যদের সাথে। registered_model_name দিলে — registry-তে auto-register.

৪ · Autolog — এক লাইনে

Python · MLflow autolog
import mlflow

mlflow.set_experiment("bangla-sentiment")
mlflow.autolog()  # ⭐ ১ লাইন — sklearn, PyTorch, TF, XGBoost সব track

# নিচের code কিছু change ছাড়াই — সব auto-tracked
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, max_depth=8)
model.fit(X_train, y_train)
preds = model.predict(X_test)

    
Autolog frameworks recognize করে — params, metrics, training curve, model — সব auto. Custom metric-এর জন্য তবু manual log_metric. ৯৫% case-এ autolog যথেষ্ট।

৫ · Run organization

  • Experiment: related runs-এর container. "fraud-v2", "bangla-sentiment".
  • Run: single training execution.
  • Parent/child run: nested. Hyperparameter sweep — parent run, প্রতি combination — child run.
  • Tags: arbitrary key-value — team, env, model_type. Searchable.

৬ · Production-grade setup

Default — local file. Multi-team-এ proper backend দরকার:

  • Backend store: Postgres / MySQL — runs, params, metrics.
  • Artifact store: S3 / GCS / Azure Blob / MinIO — model files, plots.
  • Tracking server: central HTTP server. Run as Docker container.
  • Authentication: reverse proxy (nginx) + OAuth, বা MLflow 2.x basic auth.
YAML · Docker compose for MLflow
version: "3"
services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_USER: mlflow
      POSTGRES_PASSWORD: mlflow
      POSTGRES_DB: mlflow
    volumes: ["pgdata:/var/lib/postgresql/data"]

  minio:
    image: minio/minio
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio12345
    ports: ["9000:9000", "9001:9001"]
    volumes: ["miniodata:/data"]

  mlflow:
    image: ghcr.io/mlflow/mlflow:v2.10.0
    depends_on: [postgres, minio]
    environment:
      MLFLOW_S3_ENDPOINT_URL: http://minio:9000
      AWS_ACCESS_KEY_ID: minio
      AWS_SECRET_ACCESS_KEY: minio12345
    command: >
      mlflow server
      --backend-store-uri postgresql+psycopg2://mlflow:mlflow@postgres/mlflow
      --default-artifact-root s3://mlflow/
      --host 0.0.0.0 --port 5000
    ports: ["5000:5000"]

volumes:
  pgdata:
  miniodata:

    
Local development-এ এই compose stack পুরো MLflow + S3-compatible storage দেয়। MinIO bucket "mlflow" আগে create করতে হবে। Production-এ — managed Postgres + cloud S3.
MLflow architecture — 3-tier Client → Tracking server → Backend + Artifact stores Training script mlflow.log_*() mlflow.autolog() MLflow server REST API + UI port 5000 Backend store Postgres runs, params, metrics Artifact store S3 / GCS / MinIO model files, plots Browser UI compare runs, charts Backend = structured data; Artifact = files; Server = orchestrator.
MLflow tracking server two backend connect করে — structured metadata-এর জন্য Postgres, file artifact-এর জন্য S3-compatible storage.
Bangladesh-এ small team-এর জন্য — sqlite backend + local artifact (single VM) — আগে ৬ মাস ভাল কাজ করে। Multi-team হলে — Postgres + S3-এ migration easy. Lock-in concern নেই।

ভাবনার প্রশ্ন

প্র ০১ "MLflow vs Weights & Biases (W&B) — কোনটা কখন?" Decision factors.

এই দু'টোই dominant experiment tracking tool — overlap বেশি, কিন্তু philosophy ভিন্ন।

MLflow strengths:

  • Open-source, self-hostable. Data on-prem.
  • Model registry built-in.
  • Framework agnostic + many "flavors".
  • Databricks-এর ecosystem-এ deeply integrated.

W&B strengths:

  • Polished UI, real-time charts, smooth UX.
  • Sweeps (hyperparameter search) built-in.
  • Reports — collaborative documents.
  • Faster onboarding — managed SaaS.

Decision factors:

  • Data privacy: on-prem mandate → MLflow.
  • SaaS preferred: small team, fast start → W&B.
  • Cost: MLflow free OSS; W&B paid for team plan.
  • Sweeps focus: heavy hyperparameter search → W&B integrated; MLflow + Optuna combo.
  • Bangladesh banking/regulated: on-prem MLflow + Postgres + on-prem MinIO.
  • NLP research team: W&B's model versioning + reports → favored.

Cost comparison (rough):

  • MLflow self-hosted: ~$৫০-১০০/month infrastructure.
  • W&B Team plan: $২০/seat/month + storage costs.
  • For ৫-engineer team: MLflow $১০০ vs W&B $১,২০০+ per year roughly.

Hybrid pattern:

  • Some teams use both — W&B for research, MLflow for production registry.
  • OS layer flexibility allows this.

Other contenders (২০২৫):

  • Neptune.ai: Polish team alternative — strong UI.
  • Comet ML: similar SaaS.
  • Aim: open-source W&B alternative.
  • ClearML: open-source + integrated orchestration.

মূল উপলব্ধি: MLflow vs W&B — false dichotomy in many cases. Bangladesh tech context-এ MLflow majority appropriate (cost + on-prem + open-source). Research-heavy academic team-এ W&B better UX often justifies.

প্র ০২ "১০,০০০ run after 6 months — how to query/find what we need?"

Tracking adoption-এর paradox — সফল হলে runs explode. Search UX critical.

Search/filter approaches:

(১) Tags strategically:

  • Every run-এ team, env, project, owner tag.
  • UI search: tags.team = "fraud" AND tags.env = "prod-candidate".
  • Programmatic: mlflow.search_runs(filter_string="...")।

(২) Experiments hierarchy:

  • Each project = experiment (e.g., bangla-sentiment-2025-q1).
  • Don't dump everything in "Default".
  • Naming convention: {team}-{project}-{quarter}।

(৩) Run name + run_id:

  • Auto-generated names ("painted-fish-37") — confusing.
  • Custom: mlflow.start_run(run_name="rf-100est-d8-cv5").
  • Self-documenting.

(৪) Parameter & metric filters:

  • UI-এ "metrics.auc > 0.9" filter.
  • Combined: best AUC + matching tags.

(৫) Compare view:

  • Select multiple runs → side-by-side parameter & metric table.
  • Parallel coordinates plot — high-dim hyperparameter visualization.

(৬) Programmatic queries:

  • Pandas DataFrame: mlflow.search_runs(experiment_ids=["1"], filter_string="metrics.auc > 0.9").
  • Top-N best runs: sort + head.
  • Export to BI tool (Metabase, Superset).

Cleanup strategies:

  • Failed/early-terminated runs: mlflow gc.
  • Old experiment archive: mlflow experiments delete.
  • Artifact retention policy — old runs-এর artifact S3 lifecycle-এ delete.

"Best run" selection patterns:

  • Single metric: order_by=["metrics.auc DESC"] + top-1.
  • Multi-metric: business metric primary, others guardrail.
  • "Best stable" — top-10 by mean across seeds.

Common anti-patterns:

  • "Default" experiment-এ everything dump.
  • No tag discipline.
  • Auto-generated run names without context.
  • Failed run-গুলো-ও registry-তে register.

Bangladesh team experience:

  • Initial enthusiasm-এ MLflow adopt → ৬ মাস পরে noisy → engineer give up.
  • Solution: MLflow হলেও — discipline-এর enforcement (tag + naming) critical.

মূল উপলব্ধি: Tracking sustained adoption = tooling + discipline সমান। Tag taxonomy day-1-থেকে define. Naming convention enforce in CI. ১০,০০০ runs-এ লুকানো golden run — disciplined search-এ ১ মিনিটে; chaotic store-এ ৩ ঘণ্টা।

প্র ০৩ "Backend store — sqlite vs Postgres — কখন migrate?"

MLflow backend default sqlite — single-file, file-based. Production multi-user-এ insufficient.

sqlite-এর limit:

  • Single writer at a time — concurrent runs serialize.
  • 10K-100K runs পর slow.
  • Network access কঠিন (file lock issues over NFS).
  • No replication, no backup story.

Postgres benefits:

  • Concurrent write — multiple training jobs simultaneously.
  • Million+ runs scale.
  • Network-accessible — multiple worker nodes connect.
  • Standard backup, replication, monitoring.

When to migrate:

  • ৩+ data scientist concurrent training.
  • ৫,০০০+ accumulated runs.
  • Multi-host setup (training on cluster, server elsewhere).
  • Production registry (model promote, audit).

Migration process:

  • MLflow-এ built-in mlflow db upgrade.
  • sqlite → Postgres dump-and-load tools available.
  • Downtime: ১৫ মিনিট to few hours depending on size.
  • Test in staging first.

Practical tips:

  • Postgres version pin (15 stable choice ২০২৫)।
  • Connection pool config (PgBouncer for many concurrent runs).
  • Indexes — MLflow-এর schema-এ default OK; custom queries-এ tune.
  • Backup: nightly pg_dump + retain ৩০ দিন।

Artifact store separately migrate:

  • local FS → S3 — independent of backend migration.
  • Existing artifacts: rsync or AWS CLI.
  • S3 lifecycle policy: old artifacts archive (Glacier) cost reduce.

Self-hosted Postgres vs managed (RDS, Cloud SQL):

  • Managed: backup, patching, HA — automatic; cost ৩-৪× self-hosted.
  • Self-hosted: cheap; ops overhead.
  • Bangladesh-এ moderate-size — managed comfort worth.

"Don't migrate too late":

  • ৫০K+ runs sqlite-এ বসে থাকলে — migration painful.
  • Schema upgrade deadlock-এর সুযোগ।
  • Better — early migration when team still small.

মূল উপলব্ধি: sqlite ১ engineer-এর জন্য fine. ২+ engineer concurrent — Postgres migrate. Migration cheap + reversible — too-early decision-এর harm কম, too-late-এর কষ্ট বেশি।

প্র ০৪ "MLflow tracking culture establish করা" — team-এ adopt করানোর strategy কী?

Tool ছাড়া adoption — culture. MLflow install easy; consistent use কঠিন।

Adoption barriers:

  • "Notebook-এ print যথেষ্ট" mindset.
  • "আমার experiment small, log করার লাগবে না"।
  • Setup friction — server URL, credentials, environment variable.
  • "আমি code change চাই না"।

Strategy ১ — Reduce friction:

  • MLflow URL — environment variable global, one-time setup.
  • Template script provided — copy-paste mlflow boilerplate.
  • Autolog — minimum code change.
  • Onboarding doc with screenshots.

Strategy ২ — Demonstrate value:

  • "Demo day" — best run-গুলো MLflow UI-তে show.
  • Comparison plot — visually impressive.
  • Real story: "এই run-এ ১৫% improvement, কিন্তু কেউ track করেনি — হারিয়ে গেছে।"

Strategy ৩ — Mandate gradually:

  • Phase 1: optional, encourage.
  • Phase 2: production model registry-তে যেতে — MLflow run-id required.
  • Phase 3: code review checklist-এ — "tracking যোগ?"
  • Pure mandate without education — backlash.

Strategy ৪ — Champion-driven:

  • একজন senior DS adopt → অন্যরা follow.
  • Success story share — internal Slack channel.
  • "এই team-এর tracking discipline best" — public recognition.

Strategy ৫ — Tag taxonomy enforce:

  • CI-এ check: every run must have team, project tag.
  • Pre-commit hook: untracked notebook reject.
  • Production registry promotion — only tracked runs.

Anti-patterns:

  • "Everyone must use MLflow from tomorrow" — top-down mandate, no support.
  • MLflow installed but no admin — broken often, trust eroded.
  • Free-for-all tagging — eventual chaos.

Bangladesh-specific note:

  • Junior engineers tend new tool eager-adopt; senior wary. Senior buy-in important.
  • Bangla docs ও internal demo — accelerate.
  • Local meetup-এ "MLflow journey" share — recruiting + adoption network.

Measurement:

  • Weekly metric: % production model traceable to MLflow run.
  • Goal: ৯৫%+ in ৬ months.
  • Outliers — investigate & support.

মূল উপলব্ধি: MLflow adoption tool-purchase না — habit-formation exercise. Friction কমান, value demonstrate, mandate gradually, champion empower. ৩-৬ months consistent effort — ১ বছর পরে "MLflow ছাড়া আমরা কীভাবে বেঁচে ছিলাম?" — দলের voice.

অনুশীলন

  1. Setup: উপরের docker-compose.yml চালান। MLflow UI (localhost:5000) browser-এ open করুন।

    docker compose up -d. MinIO console (localhost:9001) login → bucket "mlflow" create. MLflow UI-তে empty experiment দেখা যাবে।

  2. Track: উপরের autolog code আপনার নিজের একটি sklearn project-এ apply করুন। UI-তে run আসছে?

    Run finish-এর পর UI refresh — params, metrics, model artifact সব দেখা যাবে। Compare 2 runs — চমৎকার diff view.

  3. Search: Programmatic query — top-5 highest AUC run.
    import mlflow
    runs = mlflow.search_runs(
        experiment_names=["bangla-sentiment"],
        order_by=["metrics.auc DESC"],
        max_results=5,
    )
    print(runs[["run_id", "metrics.auc", "params.n_estimators"]])

আরও পড়ুন

পূর্ববর্তী পাঠ
পাঠ ৭ · Kubernetes