contracts : le contrat de prévision H+1 et sa référence publiée #161
No reviewers
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!161
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/36-contrat-prevision"
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?
contracts : le contrat de prévision H+1 et sa référence en base
Rien n'écrit
public.prevision. La table est posée depuis la 0011 et aucuninsertdu dépôt ne la vise ;services/inference/porte unREADME.mddetrois lignes et
packages/contracts/était vide. L'API sert donc une prévisionde jeu et calcule l'EF-08 dessus.
Ce qui manque d'abord n'est pas un modèle, c'est ce qui permet à celui qui le
produira et à celui qui le servira d'avancer sans s'attendre.
Cette fiche est « proposée », et elle le reste
L'ADR 0012 met les options devant les titulaires du #36 et du #37 au lieu
de trancher à leur place : grain horaire sur
mesure_horaire, cible H+1 parsite, référence publiée, critère de promotion chiffré, cron par la dérogation de
l'ADR 0008, T4 non requis et pourquoi. Le nom du modèle y est « à confirmer »,
et aucun n'est réservé au registre.
Justine, un point t'appartient et la fiche ne le ferme pas : la variable qui
porte le site. La fiche propose un modèle unique avec le
typede site envariable ; l'identifiant
site_idest l'autre candidat. Sur le référentiel réelle type ne confond que deux paires,
SITE001/SITE006etSITE002/SITE007,les deux plus proches du parc. Les deux variantes coûtent une ligne : le #36 les
entraîne toutes les deux et garde celle qui gagne à la MAE.
Le T4, lui, est réglé : le #36 a été amendé le 07/09, son premier critère ne
demande plus le GPU ni
nvidia-smi. La fiche et le ticket disent la même chose.Mise à jour du 07/09 après la relecture de Justine. L'ADR ferme maintenant
trois manques qu'elle a eu raison de relever : la rejouabilité du CA4 du #36
(graine fixée, fenêtre bornée par deux instants UTC explicites, et surtout le jeu
figé et enregistré comme entrée de l'exécution), l'antériorité d'EF-08, qui
appartient au job à l'émission et non au contrat, et la trace de l'entrée du
CA3 du #37, qui va au journal du job et à l'exécution MLflow, pas dans
public.prevision.Le piège de la migration 0017
reference_kwne double pasvaleur_reference_kw, qui existe depuis la 0011 :valeur_reference_kwreference_kwLes confondre donnerait un écart nul par construction, donc une comparaison
EF-07 qui ne compare rien : deux courbes plausibles, dont une fausse. Les deux
colonnes portent désormais leur sens en base, et un cas de test garde le renvoi
croisé.
Le contrat
PrevisionH1décrit une ligne de la table et refuse ce que la base refuseraittrop tard — dans le journal d'un cron : identifiant hors format
SITE000,instant sans fuseau, horodatage hors du grain horaire. Il est plus strict que
le schéma sur un point, délibérément : la référence y est obligatoire, parce
qu'une prévision publiée seule ne tient pas l'EF-07.
Ce que cette PR ne fait pas
Aucun modèle écrit, rien enregistré dans MLflow, aucun nom réservé, et
services/inference/est intact. EC06 est l'épreuve qui a le moins depreuves ; ce qui la sauve est un contrat clair et une heure lundi matin, pas un
train.pyque sa titulaire ne saurait pas défendre.Preuve
ruff,ruff format,mypy --strictsur le nouveau paquet : propres.pytest tests/unit: 601 tests, 0 échec.Exigences : EF-07, EF-08. Prépare #36 et #37.
Ce qui ne colle pas avec #36
Le T4. C'est le vrai point, et il est plus dur que la PR ne le formule. Ton critère dit « l'entraînement s'exécute en local sur le Tesla T4, jamais dans le cloud », avec nvidia-smi en preuve. L'ADR ne se contente pas de dire que le T4 « n'est pas requis » : le candidat qu'elle propose, HistGradientBoostingRegressor, n'a aucun chemin GPU dans scikit-learn. Accepter la fiche telle quelle rend le critère techniquement inatteignable, pas seulement facultatif. Il faut donc trancher franchement : amender #36 (titre, CA et preuve comprises), ou garder le T4 et changer de candidat. L'argument de l'ADR — l'outil à la taille du problème — se défend très bien devant un jury ; mais il se défend en amendant le ticket, pas en le laissant dire autre chose.
La rejouabilité. Ton CA4 demande le même résultat sur les mêmes données. L'ADR écrit elle-même, en contexte, que l'historique « n'est pas réputé déterministe » — puis ne dit rien de la graine, du gel de la fenêtre d'entraînement, ni du figement du jeu. C'est le critère le plus fragile de #36 et la fiche le laisse entier.
Un modèle unique vs un modèle par site. La PR te renvoie ce choix, mais la fiche l'a déjà tranché : « un seul modèle pour les sept sites ». Et elle le tranche avec type de site en variable, pas site_id comme l'annonce la description de la PR. Ce n'est pas la même chose : sur sept sites, le type perd l'identité du site. À décider explicitement.
Ce qui ne colle pas avec #37
Le CA1 est déplacé sans le dire. #37 demande « le service charge le modèle promu depuis MLflow et répond sous 200 ms ». L'ADR remplace ça par un cron horaire qui écrit en base, l'API lisant la table. C'est probablement le seul montage qui tient les 200 ms — mais alors c'est le cron qui charge MLflow, pas le chemin de requête. À réécrire dans #37, sinon l'écart se lira au jury.
5. Le CA3 n'a aucun emplacement. « Chaque prédiction journalisée avec son entrée et l'identifiant du modèle » : PrevisionH1 porte modele_version, mais l'entrée (les retards t−1…t−24) n'est ni dans le contrat, ni dans public.prevision, ni dans la 0017, ni mentionnée dans l'ADR. C'est le seul critère de #37 que cette PR laisse sans place.
« Avant l'heure concernée » n'est plus garanti nulle part. Le contrat retire volontairement le contrôle emise_le < horodatage — la justification par le rejeu est bonne. Mais EF-08 repose sur cette antériorité, et rien dans le dépôt ne la porte désormais. Il faut dire où elle vit (côté job, au moment de l'émission en ligne).
Relecture utile, et quatre de tes six points étaient justes sans réserve. Ils
sont traités dans
0be9631. Je réponds dans l'ordre, y compris là où je ne tesuis pas.
1. Le T4 : refermé, et par toi
Ton point était exact, mais il est déjà appliqué : le #36 a été amendé à 08h01,
deux minutes après ton commentaire. Le premier critère ne demande plus le Tesla
T4 ni
nvidia-smi, il demande un entraînement local sur le serveur de la salle,avec le motif écrit et la fiche citée. La fiche et le ticket disent enfin la
même chose. Rien à faire de plus.
2. La rejouabilité : tu as raison, la fiche laissait le CA4 entier
Elle déclarait l'historique non déterministe puis ne disait rien de la suite.
Trois verrous ajoutés, et le troisième est le seul qui compte :
random_statefixé et journalisé dans les paramètres de l'exécution ;en paramètres, jamais « les N derniers jours » calculés à l'exécution ;
Sans le troisième, les deux premiers ne prouvent rien : la zone or bouge sous
les pieds de l'entraînement, une réimputation de la zone argent suffit à changer
le résultat sans qu'aucun paramètre n'ait bougé. « Les mêmes données » doit se
vérifier, pas s'affirmer.
3. Le type contre l'identifiant : tu as raison, et voilà le chiffre
Tu as raison sur la contradiction, et elle est de moi : la fiche écrit
type de site, ma description de PR annonçaitsite_id. Deux textes de ma main quidisent l'inverse. La description est corrigée.
Sur le fond, ton « sur sept sites, le type perd l'identité du site » mérite
d'être chiffré, parce que le référentiel réel le borne :
Cinq types pour sept sites. Le type ne confond que deux paires, et ce sont
les deux plus proches du parc, à 10 % et 5 % de capacité l'une de l'autre. La
perte que tu nommes est réelle et bornée à ça.
Les deux variantes coûtent une ligne. Plutôt que de trancher sur une intuition,
la fiche demande maintenant au #36 d'entraîner les deux et de garder celle qui
gagne à la MAE. Si
site_idgagne, tu auras la mesure pour le dire au jury aulieu d'un avis.
4. Le CA1 du #37 : tu as raison, et tu as même donné la raison
Le cron est le seul montage qui tient les 200 ms, et alors c'est lui qui charge
MLflow. À noter quand même : la fiche ne supprime pas les 200 ms, elle déplace
le chargement du modèle hors du chemin de requête. Le critère n'est pas affaibli,
il change d'endroit. Rédaction proposée dans le #37, tu valides ou tu réécris.
5. Le CA3 : le manque est réel, l'emplacement non
J'accepte le constat. Rien dans le dépôt ne disait où vit l'entrée, et c'est un
oubli de la fiche.
Mais le CA3 dit « journalisée », pas « stockée en base », et la nuance décide de
la réponse. Vingt quatre retards par ligne dans
public.prevision, qui est unehypertable comprimée à une ligne par site et par heure, multiplierait la
largeur d'une ligne servie par cinq environ pour y loger de la preuve de
reproductibilité. On paierait ça sur chaque lecture du tableau de bord, pour une
donnée que personne n'affiche.
La fiche dit donc maintenant : journal du job pour l'inférence, comme le
collecteur écrit le sien, et exécution MLflow côté entraînement. Ni le
contrat ni la 0017 ne bougent. Si tu veux l'entrée en base, dis-le et on en
discute, mais alors ce sera une table à part, pas une colonne de
prevision.6. L'antériorité : tu as raison, et le contrat ne bouge pas
Retirer
emise_le < horodatagedu contrat reste le bon choix, pour la raisonque tu reprends toi-même : une règle qui interdit le rattrapage se contourne en
trichant sur l'horodatage, ce qui est pire que de ne pas l'avoir.
Mais tu as raison que l'antériorité d'EF-08 ne vivait plus nulle part. Elle vit
dans le job, à l'émission en ligne : une passe horaire refuse d'écrire une
prévision dont l'instant visé est déjà passé, et le dit dans son journal. Un
rattrapage écrit sans cette garde et se reconnaît à ce que son
emise_lesuitson
horodatage. C'est écrit dans la fiche, et c'est le #37 qui porte lecontrôle.
Ce qui reste
Trois amendements au #37, sur les points 4, 5 et 6. C'est ton ticket, donc je te
propose la rédaction exacte en commentaire là-bas plutôt que de l'éditer. Tu
appliques, tu réécris, ou tu dis non.
tests/ci/test-liens-markdown.shvert, 144 liens dans 72 fichiers.