infra: pose le registre de modèles MLflow sur PostgreSQL et MinIO #100
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
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!100
Loading…
Reference in a new issue
No description provided.
Delete branch "olivier/30-mlflow-registre"
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?
Ce que ça change
Un registre de modèles MLflow, en conteneur, qui garde son suivi dans la base
mlflowde PostgreSQL et écrit ses artefacts dans le bucketmlflowde MinIO.Il est en service sur
ml-stagiaire-02depuis le 2 septembre : cette demandefait entrer dans le dépôt ce qui tourne déjà.
Closes #30
Preuve
Les quatre critères du ticket, relevés sur le serveur à l'ouverture de cette
demande.
Depuis un poste tiers de la salle — ENF-14 :
Relecture
Ce qui suit le code
docs/runbooks/mlflow.mdcréé — installation, contrôles, tunnel,promotion d'un modèle, rotation des identifiants, panne, retour arrière
docs/adr/0004— les artefacts passent par le serveur/etc/enervision/mlflow.envest produit pargenere-identifiants.sh, pas rempli à la main : il n'y a donc pas de.env.example, et le README de la pile dit pourquoiOù regarder en priorité
1. Le mandataire d'artefacts, et ce qu'il donne aux #36 et #37. Le serveur
relaie les artefacts (
--serve-artifacts). Un client d'entraînement oud'inférence n'a besoin que de
MLFLOW_TRACKING_URI: aucun identifiant MinIOne quitte le serveur, et un seul tunnel SSH sert le suivi et les artefacts.
C'est l'ADR 0004, et c'est le contrat écrit au §4 du manuel.
2. L'utilisateur MinIO dédié, et le fait qu'il s'éprouve lui-même.
genere-identifiants.shcrée un utilisateur limité au seul bucketmlflow,puis vérifie qu'il ne peut pas lire
bronze,silvernigoldavantd'écrire le fichier de secrets — et retire l'utilisateur qu'il vient de créer
s'il constate le contraire. Le test d'intégration rejoue ce contrôle. Ce n'est
pas
init-buckets.shqui est modifié : rien du #28 n'est touché.3. Deux secrets, deux placements différents, et c'est délibéré. Le mot de
passe PostgreSQL n'est pas dans l'URI de suivi mais dans
PGPASSWORD, que libpqlit dans l'environnement : dans la ligne de commande, il serait lisible par tout
compte de la machine à travers
/proc/<pid>/cmdline. Il reste visible dansdocker inspect, qui exige l'accès à Docker — les deux ne sont pas comparables.À l'inverse,
MLFLOW_S3_ENDPOINT_URLn'est pas dans le fichier de secretsmais dans la composition versionnée : mesuré le 2 septembre, absent, 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.
4. Aucun volume, et c'est le point. Tout l'état est dans les deux magasins,
tous deux sauvegardés — le vidage nocturne prend la base
mlflowsans qu'on aitrien à déclarer, puisqu'il lit le catalogue. Le conteneur est jetable. C'est ce
que le magasin fichier par défaut de MLflow ne permet pas, et que le « Risque »
du ticket demandait d'éviter.
5.
network_mode: hostn'est pas un choix de style. Les deux magasinsn'écoutent que sur la boucle locale de l'hôte : en réseau bridge,
127.0.0.1désignerait le conteneur et le serveur tomberait à la premièreécriture. À noter pour le journal : le réseau bridge fonctionne désormais
sur ce LXC (MinIO tourne ainsi), contrairement au constat du 31 août — la raison
de rester en réseau hôte n'est plus celle-là.
Conflit connu
docs/adr/README.md: la PR #97 de Lénaïc insère sa ligne au même endroit quela mienne. J'ai pris 0004 et laissé 0003 à sa fiche, qui était dans la
file avant moi — il ne reste qu'une ligne de tableau à démêler, dans l'ordre où
les deux seront fusionnées.
Ce qui n'est pas dans cette demande
pyfunc.load_modelest la seule commande du manuel qui n'a pas été jouée : elleexige un vrai artefact de modèle, et le contrôle de fumée n'écrit qu'un fichier
texte. Le manuel le signale à cet endroit précis. Les étapes 1 à 3 de la
promotion et le retour arrière, eux, ont été éprouvés sur un modèle jetable
supprimé ensuite.