MLflow
La boîte à outils open source pour suivre tes expériences de machine learning, versionner tes modèles et les amener jusqu'en production — sans réinventer la roue à chaque projet.
À quoi ça sert
Quand tu entraînes un modèle, tu fais en réalité plein d'essais : tu changes un hyperparamètre, tu testes un autre algorithme, tu modifies tes features… À la fin de la journée, tu as 30 modèles entraînés et une question : lequel était le meilleur, et avec quels paramètres ?
MLflow répond à ce problème (et à quelques autres) avec quatre briques :
- Tracking — enregistrer pour chaque entraînement : les paramètres utilisés, les métriques obtenues, le code, et le modèle produit.
- Models — emballer un modèle dans un format standard, rechargeable n'importe où (Python, REST, Docker…).
- Model Registry — un « catalogue » centralisé des modèles validés, avec des versions et des étapes (Staging, Production).
- Projects — décrire un entraînement reproductible (moins utilisé au début, on peut zapper).
MLflow = le carnet de bord de tes expériences ML + le coffre à modèles versionnés, le tout dans une UI web.
Un exemple d'usage
Tu travailles sur un modèle de classification (par exemple, prédire si un client va résilier). Tu testes plusieurs profondeurs d'arbre de décision et tu veux savoir laquelle donne la meilleure précision.
Sans MLflow, tu finis avec un fichier Excel à la main et beaucoup de prints. Avec MLflow :
import mlflow
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
for depth in [3, 5, 10]:
with mlflow.start_run():
model = DecisionTreeClassifier(max_depth=depth)
model.fit(X_train, y_train)
acc = accuracy_score(y_test, model.predict(X_test))
mlflow.log_param("max_depth", depth)
mlflow.log_metric("accuracy", acc)
mlflow.sklearn.log_model(model, "model")
En 6 lignes utiles, tu obtiens : 3 « runs » enregistrés, comparables côte à côte
dans une UI web, avec leurs paramètres, leurs scores, et le modèle entraîné prêt à
être rechargé. Tu peux trier par accuracy et identifier le meilleur en
un clic.
How-to : installer et utiliser MLflow
-
Installer MLflow
On part du principe que tu utilises UV pour gérer ton projet Python. Dans le dossier de ton projet :
bashuv add mlflow scikit-learnVérifie que tout est OK :
bashuv run mlflow --version -
Lancer l'interface MLflow
MLflow est livré avec une UI web. Lance-la dans un terminal séparé — elle va tourner en continu pendant que tu entraînes :
bashuv run mlflow uiOuvre
http://127.0.0.1:5000dans ton navigateur. Pour le moment la liste est vide — c'est normal, on n'a encore rien tracké.Où sont stockées les données ?Par défaut, MLflow crée un dossier
mlruns/dans le répertoire courant. C'est là que vivent tes runs et tes modèles. Pense à l'ajouter à ton.gitignore: ces fichiers n'ont rien à faire dans Git. -
Écrire un script d'entraînement instrumenté
Crée un fichier
train.pyavec ce contenu :pythonimport mlflow import mlflow.sklearn from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score # 1. Données X, y = load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 2. On nomme l'expérience (visible dans l'UI) mlflow.set_experiment("iris-decision-tree") for depth in [2, 5, 10]: with mlflow.start_run(run_name=f"depth={depth}"): model = DecisionTreeClassifier(max_depth=depth, random_state=42) model.fit(X_train, y_train) preds = model.predict(X_test) acc = accuracy_score(y_test, preds) # 3. On enregistre tout ce qu'on veut comparer ensuite mlflow.log_param("max_depth", depth) mlflow.log_metric("accuracy", acc) mlflow.sklearn.log_model(model, name="model") print(f"depth={depth} -> accuracy={acc:.3f}")Lance-le :
bashuv run python train.py -
Comparer les runs dans l'UI
Rafraîchis
http://127.0.0.1:5000. Tu vois maintenant l'expérienceiris-decision-treeavec 3 runs. Coche-les tous, clique sur « Compare » : tu obtiens un tableau paramètre/métrique et même des graphiques pour visualiser l'effet demax_depthsur l'accuracy.AstuceTu peux ajouter
mlflow.sklearn.autolog()au début de ton script : MLflow capture automatiquement les hyperparamètres, les métriques d'entraînement et le modèle. Très utile pour ne rien oublier. -
Recharger un modèle entraîné
Chaque run a un
run_idvisible dans l'UI. Pour réutiliser le modèle ailleurs (script, API, notebook) :pythonimport mlflow run_id = "<colle ici l'id depuis l'UI>" model = mlflow.pyfunc.load_model(f"runs:/{run_id}/model") preds = model.predict(X_test)pyfuncest un format universel : peu importe que le modèle ait été entraîné avec sklearn, PyTorch ou XGBoost, l'interface.predict()est la même. -
Enregistrer un modèle dans le Registry
Quand un modèle est « assez bon » pour être candidat à la production, on l'enregistre dans le Model Registry pour le versionner :
pythonmlflow.register_model( model_uri=f"runs:/{run_id}/model", name="iris-classifier", )Dans l'onglet Models de l'UI, tu vois maintenant
iris-classifieravec ses versions (v1, v2…). Tu peux assigner des aliases (@champion,@challenger) pour pointer vers la version « courante » dans ton code de prod. -
Configurer VS Code
Rien de spécifique à MLflow : tant que VS Code utilise l'interpréteur du
.venvcréé par UV, tout marche (cf. la fiche UV). Quelques extensions utiles :- Python de Microsoft (obligatoire).
- Jupyter si tu prototypes en notebook.
Pour ouvrir l'UI MLflow depuis VS Code, lance
uv run mlflow uidans le terminal intégré : VS Code détecte l'URL et propose de l'ouvrir.
Aide-mémoire
import mlflow
# Organisation
mlflow.set_experiment("nom-projet")
with mlflow.start_run(run_name="essai-1"):
...
# Logging manuel
mlflow.log_param("lr", 0.01)
mlflow.log_metric("loss", 0.123, step=10)
mlflow.log_artifact("plot.png")
mlflow.sklearn.log_model(model, name="model")
# Logging automatique (sklearn, pytorch, xgboost…)
mlflow.sklearn.autolog()
# Recharger
m = mlflow.pyfunc.load_model("runs:/<run_id>/model")
m = mlflow.pyfunc.load_model("models:/iris-classifier@champion")
mlflow ui # UI sur :5000
mlflow ui --port 5050 # autre port
mlflow server --backend-store-uri sqlite:///mlflow.db \
--default-artifact-root ./mlruns
mlflow models serve -m runs:/<id>/model -p 5001 # servir un modèle en REST
MLflow et le reste de l'écosystème
MLflow ne vit pas seul : il est conçu pour s'intégrer dans une stack MLOps. Voici comment il se branche aux autres briques déjà couvertes sur ce site.
-
UV — installer MLflow et figer sa
version dans
uv.lockgarantit que les coéquipiers et le CI utiliseront exactement la même version. Important : un modèle loggé avec MLflow 2.x ne se recharge pas toujours avec une autre version majeure. -
Docker — MLflow peut générer un
Dockerfile pour servir un modèle en REST :
mlflow models build-docker -m runs:/<id>/model -n mon-image. Tu obtiens une image standalone, déployable sur n'importe quel runtime (Kubernetes compris). -
FastAPI — pour exposer un modèle
avec une API custom (auth, validation, logique métier), tu charges le modèle
avec
mlflow.pyfunc.load_model()au démarrage et tu l'appelles dans ton endpoint. Plus flexible quemlflow models serve. -
pytest — dans tes tests, tu peux
charger un modèle depuis le Model Registry (par alias
@champion) et vérifier qu'il dépasse un seuil minimum d'accuracy sur un jeu de régression. C'est la base du model testing. - CI/CD — un pipeline GitHub Actions peut entraîner, logger dans MLflow, comparer aux versions précédentes, et promouvoir automatiquement le modèle en Staging si les métriques sont meilleures.
-
SQLAlchemy — par défaut MLflow
stocke ses runs dans des fichiers locaux. En équipe, on lance un
mlflow serveravec un backend SQL (PostgreSQL ou MySQL). MLflow utilise SQLAlchemy en interne pour parler à cette base.
Dans un projet de fin de formation type : tu entraînes avec un script tracké par MLflow → tu enregistres le meilleur modèle dans le Registry → tu construis une image Docker autour → tu l'exposes via FastAPI → tu déploies sur Kubernetes → tu réentraînes périodiquement via un pipeline CI/CD. Chaque brique a sa fiche sur ce site.
Pour aller plus loin
- Documentation officielle : mlflow.org/docs
- Tutoriel pas à pas : Getting Started
- Repo GitHub : github.com/mlflow/mlflow