[infra] MLflow, registre de modèles #30
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
2 participants
Notifications
Due date
No due date set.
Blocks
Depends on
#36 [EF-07] Entraînement du modèle et promotion
g2/enervision
#26 [Infra] Installation PostgreSQL 17
g2/enervision
Reference
g2/enervision#30
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Exigence couverte
ENF-09
Épreuve servie
EC06 · IA et automatisation
Charge estimée
1 j.h
Ce qu'on veut obtenir
Disposer d'un registre où les modèles entraînés sont versionnés, comparés et promus, avec les artefacts dans MinIO et le suivi dans PostgreSQL.
Critères d'acceptation
Comment on le vérifie
Commande une exécution mlflow d'exemple, puis lecture dans l'interface
Attendu l'exécution visible, l'artefact présent dans MinIO
Preuve capture de l'exécution et sortie mc ls du bucket
Manuel d'exploitation à mettre à jour
docs/runbooks/mlflow.md, promotion d'un modèle
Risque et retour arrière
Le stockage en fichiers est le défaut de MLflow et ne survit pas à une reconstruction du serveur. Vérifier que le paramètre de suivi pointe bien sur PostgreSQL.
État au 2 septembre : service installé et en service, 2 critères sur 4 éprouvés
Le registre tourne sur
ml-stagiaire-02. Brancheolivier/30-mlflow-registre,pas encore de demande de fusion.
127.0.0.1:5000, injoignable de l'extérieurmlflow, aucun magasin fichiermlflowde MinIOFAILEDLe blocage : le #28 est fusionné dans
developmais rien ne tourne sur leserveur — pas de conteneur MinIO, rien sur 9000/9001, pas de
/etc/enervision/minio.env,mcabsent. Sans bucket ni identifiants, les deuxderniers critères sont hors d'atteinte. Rien à corriger de mon côté : le
mandataire d'artefacts fonctionne, les
artifact_urisont bien enmlflow-artifacts:/, c'est la destination qui manque.Quand MinIO tournera, il reste vingt minutes : jouer
genere-identifiants.sh, le contrôle de fumée, le test complet, retirer lebandeau du manuel, coller la sortie
mc ls.Preuves (sorties collées du serveur)
Depuis un poste tiers de la salle, la vérification qui compte :
L'unique échec du test est le bon : il détecte précisément l'absence de MinIO.
Ce que le chantier a produit
infra/compose/mlflow/— image maison (base épinglée réutilisée de lachaîne), composition en réseau hôte, générateur d'identifiants, contrôle de
fumée. Aucun volume : tout l'état est dans les deux magasins, déjà
sauvegardés, et le conteneur est jetable.
docs/runbooks/mlflow.md— dont la promotion d'un modèle, par alias et nonpar « stage », qui est déprécié.
docs/adr/0002-mlflow-mandataire-artefacts.md— les artefacts passent parle serveur : les clients des #36 et #37 n'ont besoin que de
MLFLOW_TRACKING_URI, aucun identifiant MinIO ne quitte la machine.tests/integration/test_registre_mlflow.py— un cas par critère, plus lecloisonnement de l'utilisateur MinIO dédié.
Deux défauts trouvés en le faisant tourner, et corrigés
useradd --systemavec--uid 1001: l'image sortait sur un avertissement.MLFLOW_S3_ENDPOINT_URLétait dans le fichier de secrets.Fichier incomplet → variable absente → boto3 s'est rabattu sur le vrai AWS
S3, et le client a pendu deux minutes sans qu'aucun message ne dise que la
requête partait vers Internet. Une variable qui, absente, change la cible
d'une écriture n'a pas sa place dans un fichier qu'on peut écrire à moitié :
elle est passée dans la composition versionnée, avec des bornes de reprise.
L'échec prend maintenant 18 s et nomme la cause.
À savoir pour la suite
#36peut déjà travailler : paramètres, métriques et modèles enregistrésfonctionnent. Seuls les artefacts échouent.
PostgreSQL, qui tourne sur le serveur mais dont les commits ne sont pas dans
develop— et le #80 n'a aucune demande de fusion ouverte./etc/enervision/mlflow.envest écrit à la main, avec le seul mot depasse PostgreSQL, et porte un en-tête qui dit qu'il est incomplet. Il sera
remplacé par le générateur.
MinIO déployé, les quatre critères sont éprouvés — test à 14 / 14
MinIO a été mis en service dans l'après-midi (#28). J'ai enchaîné : utilisateur
MinIO dédié créé, registre redémarré, contrôle de fumée de bout en bout.
127.0.0.1:5000et n'est pas joignable de l'extérieurmlflowmlflowde MinIODeux choses en plus des critères :
mlflow-7ffe27e5porte la politiquemlflow-artefacts, lit le bucketmlflowet reçoitAccessDeniedsurbronze,silveretgold. Legénérateur vérifie ce refus lui-même avant d'écrire le fichier de secrets,
et retire l'utilisateur s'il constate le contraire.
jetable, supprimé ensuite : lister les versions et l'alias, comparer la
métrique, promouvoir avec les trois étiquettes (
promu_par,promu_le,promu_motif), puis retour arrière. L'alias se déplace, aucune version n'estsupprimée. Seul
pyfunc.load_modelreste non joué — il exige un vrai artefactde modèle, ce sera au premier modèle du #36.
Preuves — sorties collées du serveur
ENF-14, depuis un poste tiers de la salle :
Trois défauts trouvés en installant, et corrigés
useradd --systemavec--uid 1001: l'image sortait sur un avertissement.MLFLOW_S3_ENDPOINT_URLétait dans le fichier de secrets. Fichierincomplet → variable absente → boto3 se rabat sur le vrai AWS S3, et le
client attend deux minutes sans qu'aucun message ne dise que la requête part
vers Internet. Une variable qui, absente, change la cible d'une écriture n'a
pas sa place dans un fichier qu'on peut écrire à moitié : elle est passée dans
la composition versionnée, avec des bornes de reprise. L'échec prend
maintenant 18 s et nomme la cause.
l'historique de ses échecs : le cas passait ou échouait selon l'exécution que
l'API choisissait. Il regarde maintenant la dernière, explicitement.
Ce qui a changé sur le serveur, et qui n'est pas à moi
mca été installé en/usr/local/bin/mc(
RELEASE.2025-08-13T08-35-41Z), par la commande dedocs/runbooks/stockage-minio.md. Il n'était pas là etgenere-identifiants.shen dépend.du journal du 31 août : MinIO tourne en bridge, ports publiés sur
127.0.0.1,et rien ne répond depuis la salle. Cette pile-ci reste en réseau hôte pour une
autre raison, qui n'a pas bougé — elle doit joindre les deux magasins sur la
boucle locale de l'hôte.
/etc/enervision/minio.envest en640 root:deploy, là où le #28 et son testattendent
600 root. Signalé là-bas, pas corrigé ici.Reste à faire
Le manuel n'a plus de bandeau d'avertissement et porte son historique. Ce
ticket dépend du #80 pour la fusion : le manuel renvoie à la pile PostgreSQL,
qui tourne sur le serveur mais dont les commits ne sont pas dans
develop— etle #80 n'a toujours aucune demande de fusion ouverte.
#36peut commencer :export MLFLOW_TRACKING_URI=http://127.0.0.1:5000, etrien d'autre. Aucun identifiant MinIO à copier sur la machine du T4.