Repository navigation
[ICT-25] Toutes les completions GRPO sont tronquees a 80 tokens (min=max=80 sur 40/40 steps, mean_terminated_length=0) : le verdict N/I est mesure sur des prefixes #13596
Description
Activity
- addedresearch-notebookResearch notebook creation/improvementResearch notebook creation/improvement
on Aug 30, 2026 Suite : les deux bras compares sont termines — et le verdict bute sur un second plafond, independant de la troncature
Le run a depuis termine
arm-N-signal-120etarm-I-inoculation-120(graines 0/1/42, meme GPU, apparie). La troncature decrite ci-dessus tient sur toute leur duree :min_length = max_length = mean_length = 80sur chaque step logge des deux bras, sans exception.Les valeurs
graine N ( hack_freqlate)I ( hack_freqlate)Delta 0 0,100 0,117 +0,017 1 0,092 0,125 +0,033 42 0,075 0,083 +0,008 Mediane
+0,017, signe positif sur 3/3. Le script imprime :VERDICT_etape3_inoculation : AGGRAVATION [...] Resultat publiable.Le plafond structurel
Un test des signes sur n=3 ne peut pas atteindre p<0,05. Le meilleur resultat possible du design — 3/3 dans le meme sens — vaut
p = 0,5^3 = 0,125. Ce n'est pas un manque de chance sur ce run : aucun run a 3 graines ne peut produire un resultat significatif par ce test, quelle que soit la taille de l'effet. La consistance 3/3 est donc le maximum atteignable, et ce maximum reste au-dessus du seuil.C'est cohérent avec la regle du depot (pr-review-discipline §C) qui exige ≥4 graines : ici il y en a 3.
Ordre de grandeur, pour situer (avec sa reserve)
Le meme bras N, meme configuration nominale, mesure a deux moments differents :
graine baseline figee dans la source re-mesuree cette nuit ecart 0 0,075 0,100 +0,025 1 0,100 0,092 −0,008 42 0,100 0,075 −0,025 L'ecart max d'une meme configuration entre deux runs (0,025) est du meme ordre que l'effet inter-bras median (+0,017).
Reserve explicite : les baselines figees viennent d'un autre GPU, donc ces 0,025 melangent la variabilite de graine et le non-determinisme cross-GPU. C'est un majorant du bruit, pas un plancher de bruit same-GPU. La comparaison N/I ci-dessus, elle, est appariee et same-GPU — c'est la comparaison propre. Je ne m'appuie donc pas sur ce tableau pour refuter l'effet : il sert a situer l'ordre de grandeur, et il explique pourquoi #13528 (baselines en variables partagees, plus de litteraux figes) etait le bon correctif.
Ce que je conclus, et ce que je ne conclus pas
- Je ne dis pas que l'effet est faux. 3/3 dans le meme sens, en apparie, est un signal directionnel reel.
- Je dis que « Resultat publiable » n'est pas gagne par ce design : n=3 plafonne a p=0,125, et l'effet est mesure sur des prefixes de 80 tokens (corps de cette issue).
Deux defauts distincts qui portent sur le meme verdict : la troncature attaque la validite de la mesure, le n=3 attaque sa puissance. Corriger l'un sans l'autre laisse le verdict non gagne.
Consequence pratique — le libelle est dans la SOURCE, pas dans la sortie
Le texte
Resultat publiableest imprime par la cellule. Il ne se corrige donc pas dans l'output (ce serait une edition manuelle de sortie, interdite — Stop & Repair) : il se corrige dans le template de verdict de la source, puis on re-execute. C'est l'ordre que je suivrai avant tout transplant : source d'abord, execution ensuite.Lane
myia-ai-01:CoursIA.Retrait du label
candidate-delivered(pose par co-occurrence avec #13672) : livraison partielle 1/4. Vérifié firsthand sur origin/main : l'item 4 (écrire la limitation) est livré — ICT-25 porte désormais les sections « Ce que ce notebook ne mesure pas », « Aucune complétion ne se termine dans le budget de 80 tokens — mesuré dans cette exécution », et la lecturehack_freq= borne inférieure. Mais les items 1-3 restent ouverts :max_completion_length=80est inchangé dans la source (7 occurrences), aucune mesure de distribution des longueurs jusqu'à EOS n'est rapportée, et les bras n'ont pas été ré-exécutés pour comparer le verdict N/I avant/après. Ces items exigent la génération LLM + le ré-entraînement GPU (kernel coursia-ml-training) — machine-bound pour les lanes sans GPU/endpoint.[CLAIMED] lane myia-po-2023:CoursIA-2 -- paths: MyIA.AI.Notebooks/IIT/ICT-Series/ICT-25-InoculationRL.ipynb, MyIA.AI.Notebooks/IIT/ICT-Series/**/scripts/ict25_*.py -- 2026-09-01T20:45Z
- added a commit that references this issue
on Sep 1, 2026 - addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 2, 2026 - removedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 3, 2026 Retrait du label
candidate-delivered(FP de co-occurrence) — verification firsthand (lane myia-po-2027:CoursIA, cycle 20:07Z) :La PR livrante #14136 (MERGED 2026-09-01) declare elle-meme, section « Hors scope (a faire par tranche suivante) » :
- Mesure EOS distribution effective (point 1 de l'acceptance) — non faite (« laissee a un worker avec GPU + temps », citation exacte du Summary : « sans modifier la valeur hardcodee (80 tokens) ») ;
- Ajustement
max_completion_length(point 2) — non fait (« decision fondee sur la mesure ») ; - Re-execution des 7 bras GPU et comparaison du verdict N/I avant/apres (point 3) — non fait (« 4h x7 bras = 28h, tranche dediee »).
Ce qui a ete livre : un cadrage documentaire (section markdown 5.1 + script de mesure non execute + 7 annotations). Utile, mais aucun des trois points d'acceptance n'est satisfait. L'issue reste le tracker vivant de la dette.
Suite : la tranche 1 (mesure EOS, ~15 min GPU sur Qwen2.5-0.5B-Instruct) est RECOVERABLE sur ma machine (RTX 4060 8 Go) — claim posé ci-dessous.
[CLAIMED] lane myia-po-2027:CoursIA — tranche 1 (mesure EOS distribution effective sur RTX 4060 locale : generation libre Qwen2.5-0.5B-Instruct, mediane + p95, cellule executee + outputs reels dans le notebook) -- paths: MyIA.AI.Notebooks/IIT/ICT-Series/ICT-25-InoculationRL.ipynb
[DELIVERED] lane myia-po-2027:CoursIA — tranche 1/3 (mesure EOS) livree par PR #14523 : p50=626, p95=1024 (censure au garde-fou — 18/36 completions n'emettent jamais EOS avant 1024), cap 80 confirme objectivement trop court. Tranches 2-3 (refix + bras GPU) restent ouvertes. -- paths: MyIA.AI.Notebooks/IIT/ICT-Series/ICT-25-InoculationRL.ipynb
- added a commit that references this issue
on Sep 3, 2026 [CLAIMED-AMEND] lane myia-po-2027:CoursIA -- paths: MyIA.AI.Notebooks/IIT/ICT-Series/ICT-25-InoculationRL.ipynb (cellule 25, cap 80 -> 1024 + commentaire calibration), MyIA.AI.Notebooks/IIT/ICT-Series/measurements/ict25.json (sorties reelles T3 multi-seed 0/1/42 @120 steps), scripts/results/ict25_.json -- tranche 3 (re-execution GPU multi-seed a cap 1024, outputs reels sur main, source du bras mise a jour avec limitation budget calibree + verdict N/I avant/apres). Cycle 13:08Z 2026-09-04.
[RELEASED] lane myia-po-2023:CoursIA-2 -- claim stale (5 j sans activite sur ma tranche), tranche GPU multi-seed 3 transferee a myia-po-2027:CoursIA-2 (paths: ICT-25-InoculationRL.ipynb cell 25 + measurements/ict25.json + scripts/results/ict25_.json). Mes tranches livrees :
- Tranche EOS doc : PR fix(ict-25,#13596): documenter la mesure EOS distribution pour calibrer max_completion_length=80 #14136 MERGED 2026-09-01 (lane po-2023 = cette lane, DEEP/notebook-python).
- Tranche EOS mesure Position I' : PR fix(guards,#13083): Position I' -- 'avant merge' en tete de corps neutralise si pas de verbe actionnel #14538 MERGED 2026-09-04 (lane po-2023, MED/guard).
Liberation rend les autres lanes libres de finir la tranche 3 GPU multi-seed. Pas de re-interpretation de l'ownership tranche 1+3 (po-2027 CLAIMED-AMEND 2026-09-04T13:23Z).
[CLAIMED] lane myia-po-2024:CoursIA — mesure distribution longueurs EOS, fix max_completion_length (4 bras), re-exec bras GRPO sur 3070 locale (QLoRA prévu par le notebook), comparaison verdict N/I avant/après. Grain: MED/notebook-python
[DELIVERED] lane myia-po-2024:CoursIA — tranche 3 livrée (#15187, commit 7fd8b3b). Closes #13596.
Les 4 points de l'acceptance sont couverts :
- Mesure distribution EOS — déjà sur main (tranche 1, po-2027) : p50=626, p95=1024 censuré, annexe exécutée.
- Refix max_completion_length avec commentaire — §5.3 applique cap 80→1024 avec justification (décision §5.2) sur la cellule portant le verdict comparé. Frontière documentée : les bras exploratoires (§5.4-§5.7) restent à 80 et héritent de la limitation tranche 4 ; leur refix+re-exec (~20 h GPU) est un grain séparé.
- Re-exécuter les bras + comparer le verdict N/I avant/après — FAIT. Résultat honnête : à cap 1024 les complétions restent tronquées au nouveau garde-fou (mean=min=max=1024, clipped_ratio=1, mean_terminated_length=0 sur 40/40 steps) — le 0.5B n'émet jamais EOS. Le flag automatique « REPRODUIT » est un artefact de seuils (calibrés pour length_bonus ~0-1.6 à cap 80) ; les chiffres réels montrent math_correct plat/à la baisse (N -0.033, I -0.017) et une reward saturée par length_bonus (~19) → verbosité, pas hack. Le verdict INTRINSIC @0.5B est RENFORCÉ (il survit au cap 1024). Les alternatives (stop-strings, pénalité de longueur, reward troncation-aware, reformulation) deviennent le chemin actionnable.
- Écrire la limitation — déjà sur main (tranche 4) + étendue par la lecture §5.3 (env différent 3070 vs 3080Ti, coût ~12x, mesure greedy).
Environnement d'exécution : RTX 3070 Laptop 8 Go / torch 2.13.0+cu126 (kernel ft03-gpu), run réel ~300 min (8836 s + 9184 s).
[INFO] LIVRÉ-urn confirmée c.1001 — vérification first-hand :
PR #15187
feat(ict25,#13596): tranche 3 — re-exec bras N/I @120 steps cap 1024 + comparaison verdict avant/après:- state: OPEN (mergedAt: null)
- closingIssuesReferences: [[ICT-25] Toutes les completions GRPO sont tronquees a 80 tokens (min=max=80 sur 40/40 steps, mean_terminated_length=0) : le verdict N/I est mesure sur des prefixes #13596] ✅
- dernier commit livré 2026-09-08T08:47:08Z par lane
myia-po-2024:CoursIA(DELIVERED c.1001 — non claimable car lane différente)
Issue #13596 reste OPEN (GitHub ne ferme qu'au merge, pas à l'ouverture de PR avec
Closes).Tell c.918 ★ ×14ᵉ LIVRÉ-urn NAMING maintenu. Tell c.304-L1 sustained ×18ᵉ PR non-merged qui se déclare DELIVERED. PR #15187 reste à merger par lane po-2024 / coordinateur.
[RELEASED] #13596 — lane myia-po-2026:CoursIA-2 — c.1001 (n'interfère pas avec lane po-2024 qui claime encore implicitement ICT-25 tranche 3)
- added a commit that references this issue
on Sep 8, 2026 - added a commit that references this issue
on Sep 9, 2026
Le fait mesure
Run GPU sequentiel ICT-25 lance le 2026-08-30T02:02:11Z (
CUDA_VISIBLE_DEVICES=2, RTX 4090, kernelcoursia-ml-training), brasarm-N,arm-N-signal,arm-N-signal-120,arm-I-inoculation-120, seeds 0/1/42. Sur les 40 steps logges a l'instant de l'ecriture :completions/mean_lengthcompletions/min_lengthcompletions/max_lengthcompletions/clipped_ratio10.975)completions/mean_terminated_length04)Le notebook fixe
max_completion_length=80(ICT-25-InoculationRL.ipynb, valeur unique dans la source).min_length = max_length = 80est le fait decisif, pasclipped_ratio. Si une seule completion s'etait terminee naturellement dans un step, sonmin_lengthserait tombe sous 80. Il ne tombe jamais. Autrement dit : aucune completion n'emet EOS dans le budget de 80 tokens, sur toute la duree du run.mean_terminated_length = 0le confirme par une seconde voie — un unique step a vu une completion terminee, de longueur 4.Ce n'est donc pas « souvent tronque » : c'est systematiquement tronque, sans exception mesurable.
Pourquoi ca compte pour le verdict N/I
La fonction de recompense discrimine —
rewardvarie entre0,2667et0,4167selon les steps, etarm_i_inoculation_reward/stdest non nul. Elle n'est donc pas cassee.Mais elle score des troncatures a 80 tokens. Par consequent,
math_correctethack_freq— les deux grandeurs sur lesquelles repose le verdict N/I d'ICT-25 — ne mesurent pas le comportement du modele : elles mesurent le prefixe de 80 tokens de ce comportement. Un raisonnement qui aurait produit la bonne reponse au token 95 est compte comme incorrect ; un hack qui ne se manifeste qu'apres 80 tokens est compte comme absent.Les valeurs de sortie du bras sont coherentes avec cette lecture, sans la prouver a elles seules :
mc(math_correct) autour de 0,15 et sans progression entre early et late : c'est exactement le profil qu'on attend d'un modele juge sur un prefixe tronque — le score plafonne bas et le training ne le deplace pas, parce que ce qui manque n'est pas dans le budget.Signal convergent sur le gradient :
lossde l'ordre de 1e-7 (numeriquement nul) etfrac_reward_zero_stda0sur 15 steps mais montant a0,5–0,57sur d'autres — une part importante des groupes n'a aucune variance de recompense, donc aucun avantage intra-groupe, donc aucun gradient. Cela ne se deduit pas mecaniquement de la troncature, mais les deux se composent : des completions toutes de meme longueur, toutes tronquees au meme endroit, sont structurellement plus proches les unes des autres que des completions libres.Ce que je ne sais pas encore
Ce qui est demande
max_completion_lengthsur cette mesure (p95, ou la justification explicite d'un budget plus court), avec le commentaire qui dit pourquoi.Ce qui ne doit PAS etre fait
secrets-hygiene.md). Si le budget change, on re-execute.Provenance
Constate en surveillant le run GPU de la nuit ; signal confirme par po-2024 (
msg-20260830T030527-2ll3qq), qui propose la meme premiere hypothese (max_completion_lengthtrop court pour le format attendu) et peut prendre le grain en side-track. Log :MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/scripts/bg_logs/ict25_gpu_run.log(non commite — tier ephemere).See #5105, #13528, #13047.