Module 5 — Registre de modèles et étapes de promotion
Le suivi de MLflow (module 3) donne une vue à plat des exécutions. Le
registre y ajoute une dimension : le cycle de vie d'un modèle. Un
même artefact passe par plusieurs états au cours de sa vie utile, et
chacun de ces états impose des règles.
Un modèle enregistré et ses versions
Une exécution MLflow produit un artefact ; enregistrer cet artefact dans
le registre lui donne un nom stable et un numéro de version.
result = mlflow.register_model(
model_uri=f"runs:/{run_id}/modele",
name="churn-telecom",
)
print(result.name, result.version)
# churn-telecom 7
À partir de ce moment, churn-telecom version 7 est un objet nommé,
retrouvable, référençable. La version 8 sera la suivante, produite par une
autre exécution. Le service en production ne pointe jamais sur un
run_id (qui reste un identifiant d'exécution technique) : il pointe sur
un nom et une version, qui traduisent une décision.
Étapes et alias : la promotion contrôlée
Le registre attache à chaque version des étiquettes appelées alias dans
les versions récentes de MLflow (elles remplacent les anciennes « stages »
Staging / Production / Archived, plus rigides).
from mlflow import MlflowClient
client = MlflowClient()
client.set_registered_model_alias(
name="churn-telecom",
alias="champion",
version="7",
)
Trois alias sont couramment utilisés :
candidat: version qui vient d'être enregistrée, en revalidation.champion: version actuellement servie en production.retiree: version qu'on ne veut plus servir mais qu'on garde pour audit ou pour retour arrière.
Le service en production charge le modèle par alias, pas par version :
mlflow.pyfunc.load_model("models:/churn-telecom@champion"). Promouvoir
une nouvelle version consiste alors à déplacer l'alias champion de la
version 7 à la version 8. Le service redémarre, ou recharge à chaud, sans
que son code ait changé d'une ligne.
Métadonnées obligatoires
Une version qui vient d'être enregistrée est nue. Sans métadonnées, on ne peut ni décider de la promouvoir, ni la juger six mois plus tard. Six champs suffisent :
- Métrique de référence (
AUCsur le jeu de validation figé) - Métrique métier (
taux_faux_positifs_a_5_pourcent_rappel) - Empreinte du snapshot données (lien vers
DVC) - Commit du code d'entraînement
- Signature du modèle (types et formes des entrées et sorties)
- Auteur de l'enregistrement
client.update_model_version(
name="churn-telecom",
version="7",
description=(
"AUC=0.842 sur validation figee; TFP@Rappel95=0.089; "
"donnees_md5=a5c0...; commit=e2f9...; auteur=alice"
),
)
client.set_model_version_tag("churn-telecom", "7", "donnees_md5", "a5c0...")
Ces métadonnées deviennent la fiche d'identité de la version : elles sont la première chose que le comité de mise en production lit, la seule chose qu'un auditeur demande, et le seul moyen honnête de comparer la version 7 à la version 8.
Promotion sans validation : le piège majeur
Une équipe qui promeut la version 8 parce qu'elle a la meilleure AUC sur le jeu de validation prend un risque considérable. Le jeu de validation peut avoir été surajusté par les 37 essais du mercredi (module 3) ; la version 8 peut être meilleure sur la moyenne mais nettement pire sur un segment sensible ; la métrique métier peut ne pas suivre la métrique technique.
Le module rappelle trois barrières qui doivent séparer l'enregistrement de la promotion.
Un jeu de test figé, non touché pendant l'expérimentation. Il ne sert qu'à mesurer la performance de la version candidate. S'il est utilisé plusieurs fois, il devient un jeu de validation : il est brûlé et il en faut un nouveau.
Une comparaison par tranches (slices). La version 8 doit être aussi
bonne que la version 7 sur chaque segment qui compte : abonnés
professionnels, forfaits d'entrée de gamme, nouveaux venus. Une moyenne
qui monte tandis qu'un segment sensible s'effondre est un mauvais échange.
Une approbation humaine. Le code peut appliquer les deux tests
précédents automatiquement (module 7), mais la décision finale de basculer
l'alias champion demande une signature. Cette exigence est réglementaire
dans plusieurs secteurs (crédit, santé) et sage partout ailleurs.
Le retour arrière, en une ligne
Le corollaire de la promotion par alias est le retour arrière :
client.set_registered_model_alias(
name="churn-telecom",
alias="champion",
version="7",
)
Une seule ligne, exécutée par n'importe quel opérateur avec les droits, ramène le service à la version précédente. Le service redémarre, ou recharge, et le trafic reçoit à nouveau la version stable. Le module 10 détaille comment automatiser ce déclenchement sur alerte.
champion n'existe pas par magieUne version qu'on enregistre sans lui attacher d'alias n'est jamais
servie ; le service continue de charger la version portée par l'alias
courant. Cette rigueur évite qu'un register_model maladroit ne bascule
la production sans le savoir. Elle exige en contrepartie que la promotion
soit explicite et journalisée.
En résumé
- Le registre nomme et numérote les versions ; le service en charge par
alias (
@champion), jamais parrun_id. - Six métadonnées obligatoires font la fiche d'identité de la version : métriques, snapshot, commit, signature, auteur.
- Trois barrières séparent enregistrement et promotion : jeu de test figé, comparaison par tranches, approbation humaine.
- Le retour arrière est le déplacement inverse de l'alias, en une seule ligne exécutable en urgence.
Le module 6 emballe le modèle dans une image Docker prête à être servie.