À 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).
En une phrase

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 :

python
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

  1. Installer MLflow

    On part du principe que tu utilises UV pour gérer ton projet Python. Dans le dossier de ton projet :

    bash
    uv add mlflow scikit-learn

    Vérifie que tout est OK :

    bash
    uv run mlflow --version
  2. 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 :

    bash
    uv run mlflow ui

    Ouvre http://127.0.0.1:5000 dans 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.

  3. Écrire un script d'entraînement instrumenté

    Crée un fichier train.py avec ce contenu :

    python
    import 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 :

    bash
    uv run python train.py
  4. Comparer les runs dans l'UI

    Rafraîchis http://127.0.0.1:5000. Tu vois maintenant l'expérience iris-decision-tree avec 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 de max_depth sur l'accuracy.

    Astuce

    Tu 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.

  5. Recharger un modèle entraîné

    Chaque run a un run_id visible dans l'UI. Pour réutiliser le modèle ailleurs (script, API, notebook) :

    python
    import 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)

    pyfunc est 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.

  6. 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 :

    python
    mlflow.register_model(
        model_uri=f"runs:/{run_id}/model",
        name="iris-classifier",
    )

    Dans l'onglet Models de l'UI, tu vois maintenant iris-classifier avec ses versions (v1, v2…). Tu peux assigner des aliases (@champion, @challenger) pour pointer vers la version « courante » dans ton code de prod.

  7. Configurer VS Code

    Rien de spécifique à MLflow : tant que VS Code utilise l'interpréteur du .venv créé 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 ui dans le terminal intégré : VS Code détecte l'URL et propose de l'ouvrir.

Aide-mémoire

python (API la plus utilisée)
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")
bash (CLI)
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.lock garantit 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 que mlflow 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 server avec un backend SQL (PostgreSQL ou MySQL). MLflow utilise SQLAlchemy en interne pour parler à cette base.
Vue d'ensemble MLOps

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