Skip to content

CI voie lente : regrouper les runs lourds sur schedule (volet 2 de #11835) -- 60 checks pour une PR de 8 fichiers, file a 2643 #12856

Description

@myia-ai-01

Le constat, mesure ce soir

Une PR de 8 fichiers (7 notebooks RL + 1 json) declenche 60 checks — mesure firsthand sur #12840. La file CI est a 2643 runs en attente pour 18 en cours. Sur un echantillon de 800 runs en attente :

  • 96,8 % sont du pull_request (crons et schedules : 0,2 %) ;
  • aucun workflow ne domine — le plus gros fait 3,1 %, sur 74 distincts ;
  • 0 % de generation perimee : une seule tete par branche, ~40 runs chacune. Personne ne travaille pour un commit remplace ; chaque push tire vraiment ~40 workflows.
  • entree mesuree ~814 runs/h, drain ~160/h. Le systeme tourne a 5x sa capacite.

Deux leviers deja largement consommes, verifies avant de proposer celui-ci :

  • filtres paths: : 86,6 % des 97 workflows pull_request en ont deja un (13 seulement tirent inconditionnellement). Ce gisement est presque epuise ;
  • annulation des generations perimees : 60,8 % declarent cancel-in-progress, et la mesure montre 0 run perime en file. Rien a recuperer la.

Ce qui reste : le volet 2 de #11835, jamais construit

Le titre de #11835 annonce « voie rapide + file asynchrone pour le lourd ». La voie rapide existe (phase ombre, adjugee le 24/08 : bascule partielle 4 gardes). La file asynchrone est ecrite et active (slow-lane.yml, tranche 1, schedule hebdo mardi 02:30 UTC — réfutation 4 de l'audit CONFIRMÉE 2026-08-30, po-2024). Le grain restant = tranche 2+ (déplacer les triggers pull_request des lourds vers la voie lente, critère #12856-2).

Directive user (2026-08-25) : « Est-ce que tu ne peux pas modifier les runs lourds et mutualisables, pour qu'ils soient tires regroupes et sur schedule ? » — et anterieurement : « Les jobs lourds ne devraient etre payes qu'une fois par fournee, les legers tournent a chaque fois, et pourquoi pas les moyens peuvent etre declanches sur des batchs controles. »

Ce qui rend la bascule SURE — verifie firsthand, c'est le point qui debloque

Le risque evident serait qu'un check sorti de pull_request laisse PR gate l'attendre indefiniment. Ce risque n'existe pas ici, pour trois raisons lues dans scripts/pr_gate.py :

Fait Emplacement Consequence
main n'a qu'un seul check requis (PR gate, meta-agrégateur — réfutation 1 CONFIRMÉE 2026-08-30, po-2024) l.6-8 (mesure firsthand 2026-08-07) sortir un workflow ne peut pas bloquer un merge
le gate n'a pas de liste : il « agrege le CI qui existe » et juge sur les noms observes l.75 un check absent n'est pas attendu — il cesse simplement d'exister
aucune tete observee -> « skips polling entirely and reports PASS » l.66 pas de deadlock sur une surface vide

Donc chaque deplacement est reversible par un seul commit, et ne peut pas wedger le depot. C'est ce qui distingue ce grain d'un pari.

Travail demande

Stratifier en trois regimes, sans rien supprimer :

  1. Leger — a chaque push. Les gardes qui lisent le diff ou le body. Deja mutualises par fast-lane-shadow.yml (1 checkout pour 9 gardes, gain d'execution mesure 5,1x).
  2. Lourd — une fois par fournee, sur schedule, contre main. Nouveau slow-lane.yml.
  3. Moyen — batch controle : workflow_dispatch + declenchement sur label. Overkill pour l'instant (mot du user) : cabler le mecanisme, ne pas l'activer.

Candidats lourds a instruire (liste de depart, a confirmer par la mesure job-level)

  • CodeQL Analyze x4 (actions, csharp, javascript-typescript, python) — 4 jobs lourds qui tirent sur une PR notebook sans une ligne de C# ni de JS. Le meilleur rapport gain/risque du lot, et CodeQL est concu pour tourner sur schedule.
  • Quarto (Validate Quarto build (PR), Build Quarto site, Deploy to GitHub Pages).
  • Golden-set execution (H.7 P3).
  • Les ~30 lakes Lean — deja filtres par paths:, mais tres lourds quand ils tirent. A instruire, pas a bouger a l'aveugle : un lake qui ne verifie plus la PR qui le modifie serait une regression de couverture, pas une economie.
  • Suites de tests (Scripts Tests (CPU), ict-tests, ml-tests) — instruire au cas par cas.

Le tri se fait sur des minutes-runner mesurees au niveau JOB (started_at -> completed_at de chaque job), jamais sur run_started_at -> updated_at : cette seconde grandeur inclut l'attente en file et gonfle tout uniformement. Je suis tombe dans ce piege ce soir avant de le corriger — l'adjudication de #11835 le documente deja (§3, « a ne pas citer comme gain »). Fenetre : dernieres 24 h, pour mesurer le regime courant et non la moyenne de trois semaines.

Acceptance

  1. slow-lane.yml existe, sur schedule, et rend un verdict consultable (check-run sur main ou commentaire de fournee). Un job qui tourne sans publier de verdict est un organe eteint.
  2. Chaque workflow deplace perd son trigger pull_request dans le meme commit que son ajout a la voie lente. Pas de phase ou il tire des deux cotes — c'est le defaut actuel de la voie rapide en ombre, qui coute +1 au lieu d'economiser -8.
  3. Mesure avant/apres du nombre de checks sur une PR temoin de surface etroite. Point de depart ecrit : 60 checks sur rename(rl,#12435): rl_3_experience_replay_dqn -> rl_3_experience_replay_her (suite oubliée du fix 02ecf156) #12840 (8 fichiers). La cible est un nombre, pas une impression.
  4. Controle positif obligatoire : au moins une PR temoin ou la voie lente rougit sur un vrai defaut. Un lot entierement vert est indiscernable d'un moteur debranche — c'est l'en-tete de fast-lane-shadow.yml qui le dit, et c'est ce qui a disqualifie 5 gardes sur 9 a l'adjudication.
  5. Reversibilite : git revert d'un seul commit restaure le regime actuel.

Hors scope

See #11835

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions