Zum Hauptinhalt springen

MLflow

Definition

MLflow ist eine Open-Source-Plattform, die darauf ausgelegt ist, den gesamten Machine-Learning-Lebenszyklus zu verwalten. Ursprünglich 2018 von Databricks veröffentlicht, ist sie dank ihrer Einfachheit, Framework-Unabhängigkeit und der Tatsache, dass sie vollständig on-premise ohne Cloud-Abhängigkeit betrieben werden kann, zu einem der am weitesten verbreiteten MLOps-Tools geworden. Ein einfaches pip install mlflow und eine Änderung von zwei Zeilen im Code reichen aus, um mit dem Tracking von Experimenten zu beginnen.

MLflow organisiert seine Funktionalität in vier eng integrierten Komponenten. Tracking erfasst Parameter, Metriken und Artefakte für jeden Trainingslauf. Projects verpacken ML-Code in reproduzierbare, ausführbare Einheiten, die durch eine MLproject-Datei definiert werden. Models bieten ein Standardformat zum Verpacken von Modellen, die von jedem unterstützten Deployment-Ziel bereitgestellt werden können. Model Registry bietet einen zentralen Modell-Store mit Lifecycle-Management (Staging-, Production-, Archived-Zustände) und Versionshistorie. Zusammen decken diese Komponenten den Weg vom rohen Experiment bis zur Produktionsbereitstellung ab.

MLflow kann lokal (SQLite-Backend, lokales Dateisystem für Artefakte), auf einem selbstverwalteten Server (PostgreSQL + S3) oder als vollständig verwalteter Dienst über Databricks Managed MLflow betrieben werden. Der Open-Source-Kern ist unter Apache 2.0 lizenziert, was ihn für regulierte Branchen geeignet macht, in denen Daten die eigene Infrastruktur nicht verlassen dürfen.

Funktionsweise

Tracking-Server

Wenn Sie mlflow.start_run() aufrufen, öffnet der Client einen Lauf auf dem Tracking-Server und beginnt damit, Logs zu puffern. Parameter (log_param, log_params) und Metriken (log_metric, log_metrics) werden in den Backend-Store (SQLite oder PostgreSQL) geschrieben. Artefakte werden in den Artefakt-Store hochgeladen (lokales Dateisystem, S3, GCS, Azure Blob, HDFS). Der Server stellt eine REST-API bereit, die vom Client-SDK und der Web-UI genutzt wird.

MLflow Projects

Ein Projekt ist ein Verzeichnis (oder ein Git-Repository) mit einer MLproject-YAML-Datei, die die Einstiegspunkte, Parameter und die conda/pip-Umgebung deklariert. Das Ausführen von mlflow run . -P lr=0.01 löst die Umgebung auf, setzt Parameter und startet den Einstiegspunkt — wodurch automatisch ein getrackte Lauf erzeugt wird. Dies macht Experimente für jeden mit Zugriff auf das Repository reproduzierbar.

MLflow Models

Ein mit mlflow.<flavor>.log_model() gespeichertes Modell wird im MLmodel-Format gespeichert: ein Verzeichnis, das das serialisierte Modell, einen MLmodel-YAML-Deskriptor und eine conda.yaml / requirements.txt enthält. Die pyfunc-Variante bietet eine einheitliche model.predict(data)-Schnittstelle unabhängig vom zugrunde liegenden Framework, sodass dasselbe Modell von verschiedenen Serving-Backends geladen werden kann.

Model Registry

Die Registry speichert benannte Modellversionen mit Übergangszuständen. Automatisierte CI/CD-Systeme fragen die Registry nach der neuesten Production-Version für die Bereitstellung ab. Menschliche Genehmiger oder automatisierte Validierungsjobs übertragen Versionen zwischen Zuständen. Jede Version verweist zurück auf ihren Quelllauf und bewahrt so die vollständige Herkunft.

Wann verwenden / Wann NICHT verwenden

Verwenden wennVermeiden wenn
Eine vollständig selbst gehostete, Open-Source-MLOps-Plattform benötigt wirdDas Team umfangreiche kollaborative Funktionen (gemeinsame Berichte, Slack-Benachrichtigungen) out of the box benötigt
Daten die eigene Infrastruktur nicht verlassen dürfen (regulierte Branchen)Ein SaaS-Produkt ohne eigene Infrastruktur bevorzugt wird
Databricks bereits verwendet wird und native Integration gewünscht istDer Workflow nur aus Notebooks besteht und kein Produktionsdeployment geplant ist
Framework-Unabhängigkeit wichtig ist (sklearn, XGBoost, PyTorch, TF usw.)Fortgeschrittene integrierte Hyperparameter-Optimierung benötigt wird
Kostenkontrolle entscheidend ist und Open-Source-Lizenzierung erforderlich istDas Team keine Engineering-Ressourcen hat, um einen Server und Artefakt-Store zu verwalten

Vergleiche

KriteriumMLflowWeights & Biases (W&B)
EinrichtungsaufwandSelbst hostbar mit einem Befehl; kein Account erforderlichSaaS; kostenloser Account erforderlich; keine Infrastruktur zu verwalten
UI-QualitätSauber, aber einfach; fokussiert auf tabellarische Metriken und Lauf-VergleicheSehr poliert; exzellentes Media-Logging, benutzerdefinierte Charts, Berichte
ZusammenarbeitGeteilter Server erforderlich; kein integriertes RBAC in OSSIntegrierte Team-Workspaces, Sharing-Links und rollenbasierter Zugriff
PreisgestaltungKostenlos und Open-Source; Databricks Managed MLflow kostet extraKostenlos für Einzelpersonen; bezahlte Pläne für Teams
Hyperparameter-OptimierungIntegration mit Optuna, Ray Tune externSweeps integriert mit Bayesian/Grid/Random Search

Code-Beispiele

# mlflow_full_example.py
# Full MLflow tracking example: logs params, metrics, a custom artifact,
# and registers the model in the Model Registry.
# pip install mlflow scikit-learn matplotlib

import mlflow
import mlflow.sklearn
import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import (
accuracy_score, roc_auc_score, classification_report
)
import os, tempfile, json

# ── 1. Data ──────────────────────────────────────────────────────────────────
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=0
)

# ── 2. Hyperparameters ────────────────────────────────────────────────────────
params = {
"n_estimators": 200,
"learning_rate": 0.05,
"max_depth": 4,
"subsample": 0.8,
"random_state": 0,
}

# ── 3. MLflow run ─────────────────────────────────────────────────────────────
mlflow.set_experiment("breast-cancer-gbt")

with mlflow.start_run(run_name="gbt-tuned") as run:

# Log hyperparameters
mlflow.log_params(params)

# Train
clf = GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)

# Evaluate
y_pred = clf.predict(X_test)
y_prob = clf.predict_proba(X_test)[:, 1]
cv_scores = cross_val_score(clf, X_train, y_train, cv=5, scoring="roc_auc")

metrics = {
"accuracy": accuracy_score(y_test, y_pred),
"roc_auc": roc_auc_score(y_test, y_prob),
"cv_roc_auc_mean": cv_scores.mean(),
"cv_roc_auc_std": cv_scores.std(),
}
mlflow.log_metrics(metrics)

# Log a feature importance plot as an artifact
with tempfile.TemporaryDirectory() as tmp:
fig, ax = plt.subplots(figsize=(8, 5))
feat_imp = clf.feature_importances_
top_idx = np.argsort(feat_imp)[-10:]
ax.barh(range(10), feat_imp[top_idx])
ax.set_title("Top 10 feature importances")
fig.tight_layout()
plot_path = os.path.join(tmp, "feature_importance.png")
fig.savefig(plot_path)
plt.close(fig)
mlflow.log_artifact(plot_path, artifact_path="plots")

# Log classification report as JSON
report = classification_report(y_test, y_pred, output_dict=True)
report_path = os.path.join(tmp, "classification_report.json")
with open(report_path, "w") as f:
json.dump(report, f, indent=2)
mlflow.log_artifact(report_path, artifact_path="evaluation")

# Log and register the model
mlflow.sklearn.log_model(
clf,
artifact_path="model",
registered_model_name="breast-cancer-gbt", # creates registry entry
)

print(f"Run ID : {run.info.run_id}")
for k, v in metrics.items():
print(f" {k}: {v:.4f}")

# ── 4. Load a registered model (simulates downstream serving) ─────────────────
# model_uri = "models:/breast-cancer-gbt/1"
# loaded = mlflow.sklearn.load_model(model_uri)
# print(loaded.predict(X_test[:3]))

Praktische Ressourcen

Siehe auch