MLflow : ne perds plus la trace de tes modèles IA

MLflow : ne perds plus la trace de tes modèles IA

De quoi avez-vous besoin

Version de Python

3.x

Packages

  • {"nom":"mlflow","version":"3.16.0"}
  • {"nom":"scikit-learn","version":"1.9.1"}

Difficulté

Intermédiaire

Tu entraînes un modèle, tu changes un paramètre, tu relances, tu changes encore, et au bout de dix essais tu ne sais plus lequel avait le meilleur score. C'est le quotidien de quiconque fait du machine learning sans carnet de bord. Résultat : on retombe toujours sur les mêmes réglages par défaut, et on perd des heures à refaire ce qu'on avait déjà trouvé.

MLflow règle ce problème. C'est un outil open source qui journalise automatiquement chaque expérience : les paramètres utilisés, les métriques obtenues, et même le modèle entraîné. À la fin, tu retrouves le meilleur run en une ligne, tu le recharges, et tu l'utilises en production. Voici comment t'y mettre en Python.

Étape 1 : installer MLflow

MLflow s'installe comme n'importe quel paquet Python. On l'accompagne de scikit-learn, qui nous fournit les données et le modèle de démonstration.

bash
pip install mlflow scikit-learn

Étape 2 : ouvrir le carnet de bord

MLflow enregistre tout dans un backend de suivi (tracking store). La version moderne utilise SQLite, un simple fichier de base de données, parfait pour démarrer en local. On crée aussi une expérience pour regrouper les runs qui vont ensemble.

python
import mlflow

# Le carnet de bord : un fichier SQLite local
mlflow.set_tracking_uri("sqlite:///mlflow.db")

# Une expérience = un regroupement thématique de runs
mlflow.set_experiment("digits-logistic-regression")

Étape 3 : préparer les données

Pour la démonstration, on entraîne une régression logistique sur le jeu de données digits de scikit-learn : 1 797 images de chiffres manuscrits, chacune codée en 64 valeurs (une grille de 8x8 pixels). Le but : reconnaître le chiffre dessiné.

python
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split

X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

Étape 4 : lancer les expériences

Un run, c'est une tentative avec un jeu de réglages précis. Ici, on fait varier C, le paramètre de régularisation de la régression logistique. Pour chaque valeur, on ouvre un run, on note le paramètre, on entraîne, puis on journalise le score et le modèle.

python
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import mlflow.sklearn

for C in [0.001, 0.01, 0.1, 1.0, 10.0]:
    with mlflow.start_run(run_name=f"logreg-C={C}"):
        mlflow.log_param("C", C)

        model = LogisticRegression(C=C, max_iter=5000)
        model.fit(X_train, y_train)
        acc = accuracy_score(y_test, model.predict(X_test))

        mlflow.log_metric("accuracy", acc)
        mlflow.sklearn.log_model(model, name="model")

À chaque itération, MLflow consigne trois choses : le paramètre (log_param), la métrique (log_metric) et le modèle lui-même (log_model). Le bloc with mlflow.start_run() délimite proprement chaque tentative : pas besoin de nettoyer quoi que ce soit à la main. Sur digits, la valeur C=0.001 régularise trop et fait chuter le score autour de 0.958, tandis que C=0.1 frôle les 0.976. Sans MLflow, tu aurais dû noter ces chiffres à la main.

Étape 5 : retrouver le meilleur modèle

Voilà le cœur du sujet. Une fois tes runs terminés, tu interroges le carnet de bord pour retrouver celui qui a le meilleur score, puis tu recharges son modèle en une ligne. Fini les fichiers nommés modele_v2_final_OK.py qui traînent dans tous les dossiers.

python
import mlflow
import mlflow.sklearn

# Trier les runs par accuracy décroissante
runs = mlflow.search_runs(order_by=["metrics.accuracy DESC"])
best = runs.iloc[0]
print(f"Meilleur run : {best['run_id']}")
print(f"Accuracy : {best['metrics.accuracy']:.4f} — C={best['params.C']}")

# Recharger le modèle gagnant et prédire
model = mlflow.sklearn.load_model(f"runs:/{best['run_id']}/model")
print(model.predict([X_test[0]]))

Étape 6 : visualiser tout ça

MLflow embarque une interface web qui lit directement ton carnet de bord. Une commande, et tu compares tes runs dans un tableau, avec des graphiques.

bash
mlflow ui --backend-store-uri sqlite:///mlflow.db

Ouvre ensuite http://127.0.0.1:5000 dans ton navigateur. Tu y retrouves tous tes runs, leurs paramètres, leurs métriques, et tu peux les comparer côte à côte.

MLflow ne remplace ni scikit-learn ni ton modèle : il les encadre. Dès que tu enchaînes plus de deux expériences, le carnet de bord devient indispensable — tu sais exactement ce qui a été essayé, avec quels réglages, et quel résultat. La prochaine fois que tu lanceras des dizaines d'essais pour trouver les bons hyperparamètres, tu ne repartiras plus de zéro. Et le jour où tu passes en production, tu exporteras le modèle gagnant en un clin d'œil, versionné et prêt à servir.