Skip to content

fix(rl): ré-exécuter GRPO et réaligner les résultats - #18042

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/17827-grpo-fresh-execution
Sep 27, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/17827-grpo-fresh-execution

Conversation

@jsboige

@jsboige jsboige commented Sep 27, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2025:CoursIA — prev: MED/notebook-lean #18033

Résumé

See #17827 · See #14446. Ré-exécution complète du notebook RL-15 sur le kernel CUDA ft02-gpu, après fusion de #17733. Les 13 cellules code portent leurs compteurs et sorties réels ; la prose quantitative décrit le même run. La configuration CUBLAS_WORKSPACE_CONFIG est maintenant posée avant l'import de PyTorch. Le setup décrit honnêtement la dépendance CUDA de la probe, sans promettre une exécution bout-en-bout CPU-only.

Diagnostic dérive

Cause : les anciennes lectures markdown étaient alignées sur une exécution GPU antérieure, alors que les nouveaux rewards PPO et la mesure VRAM dépendent du runtime et des kernels. Les graines restent appariées, mais ne garantissent pas l'identité des résultats entre environnements GPU. La configuration cuBLAS arrivait en outre après l'import de PyTorch, ce qui affaiblissait la promesse de déterminisme. La correction déplace cette configuration avant l'import et rattache désormais chaque valeur citée aux sorties fraîches ; les sorties n'ont pas été éditées à la main.

Verdict : CAUSE_FIXED pour la contradiction prose/sorties de ce livrable. La variabilité entre environnements n'est pas prétendue supprimée : les résultats chiffrés sont explicitement ceux de cette exécution et doivent être relus après une nouvelle exécution. Aucun résultat d'entraînement complet n'est attribué à la probe VRAM synthétique.

Preuves post-fix

  • Papermill avec -k ft02-gpu et --cwd explicite : 27/27 cellules achevées, 13/13 code exécutées, aucune erreur, du 2026-09-27 10:47:09Z à 11:02:20Z. Sorties du run final reproduites intégralement dans le notebook committé au commit 249b1c63e2 ; metadata.papermill.input_path/output_path normalisés au basename uniquement.
  • PPO : 343,07 ± 49,88 ; GRPO : 172,44 ± 49,50 ; delta GRPO − PPO −170,63 ; edge −3,43σ ; Wilcoxon apparié n=6, ties=0, p=0,0312 ; IC95 % bootstrap [−237,07 ; −106,16] ; PPO BEATS GRPO pour ce protocole. Six différences appariées en faveur de PPO.
  • Probe GPU : RTX 3080 Ti Laptop, PyTorch 2.11.0+cu128, pic alloué 65,67 MiB / 6 144 MiB, mesuré sur dix pas synthétiques seulement.
  • validate_pr_notebooks.py origin/main : EXEC_PROVED, 13/13, zéro erreur ; check_markdown_claims_output.py : CLEAN ; scan_enrich_quality.py : aucun HIGH ; detect_papermill_path_leak.py --outputs : 0 défaut ; git diff --check : OK.
  • Ratchets post-commit : check_output_failure_text.py : 0 régression (TOOL_FAILURE 0→0, MACHINE_PATH 0→0) ; check_output_collapse.py : 0 cellule signalée ; check_source_collapse.py : 0 cellule signalée. Auto-tests positifs et négatifs de ces ratchets réussis.
  • Suite ciblée : 177 tests passés (test_scrub_papermill_paths.py, test_check_markdown_claims_output.py).

Réécriture assumée

enrich-quality: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb : les lectures quantitatives héritées mélangeaient plusieurs exécutions ; elles sont remplacées par une narration adossée à un seul run CUDA, sans suppression de cellule code ni de résultat réel.

Réécritures markdown par cellule

Le garde de perte de contenu signale huit raccourcissements. La comparaison intégrale avec origin/main confirme que les cellules et leurs sujets demeurent, mais que des chiffres provenant de l'ancien run et certaines répétitions ont été retirés. Les précisions conservables (appariement des graines, limites de la probe et portée du verdict) restent dans les cellules correspondantes ou voisines. Les suppressions suivantes sont intentionnelles, et ne dispensent pas d'une relecture pédagogique :

md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 1 : l'introduction retire les anciens rewards et descriptions répétées ; elle conserve la méthode, les prérequis, le contexte et le verdict du run GPU frais.
md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 2 : la motivation retire les anciennes statistiques et les redites ; elle conserve l'hypothèse, la distinction GAE/avantage de groupe, la comparaison et sa limite sur la variance.
md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 5 : la lecture raccourcie corrige la fausse promesse CPU-only de la base ; la probe CUDA impose effectivement un GPU.
md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 8 : la lecture retire le deuxième GPU et les mesures RTX 3090 de l'ancien run ; elle décrit uniquement la sortie fraîche sur RTX 3080 Ti Laptop.
md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 9 : le verdict mémoire retire les chiffres de l'ancien GPU et l'extrapolation à l'entraînement complet ; la preuve est limitée aux dix pas synthétiques mesurés.
md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 24 : la lecture du verdict retire l'historique des trois générations de chiffres ; elle confronte les trois conditions aux sorties du run frais.
md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 25 : la synthèse retire les anciens chiffres et répète moins les conditions ; elle conserve le seuil Wilcoxon, les dispersions et la limite de généralisation.
md-content-loss: reecriture assumee -- rl_15_grpo_group_relative_policy.ipynb cell 26 : la conclusion remplace la checklist répétitive et les chiffres de l'ancien run par la preuve exécutée, les propriétés du code et les limites explicites du résultat.

Relecture attendue

La réserve Hermès de #17733 est couverte par l'issue de suivi #17827 ; une nouvelle review peut comparer les lectures chiffrées aux sorties de cette PR. Ce body ne prétend pas lever une réserve d'un tiers à sa place.

🤖 Generated with Claude Code

Move cuBLAS workspace setup before torch import; execute all 13 cells on CUDA and align measured PPO/GRPO results and VRAM scope.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Sep 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 13
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.0s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.1s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 15.2s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.5s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

Co-Authored-By: Claude Code <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: extraction intégrale base+head 27 cellules, ancres 13/13, ré-arimétrie exacte)

[NanoClaw] Review protocole v2 (notebook) — lecture intégrale des cellules markdown du head, intégrité code/outputs par empreintes sha256, comparaison base→head. Aucune lecture partielle.

Ce qui est vérifié firsthand :

  1. Exécution réelle prouvée. Compteurs exec 1→13 strictement séquentiels, metadata.papermill : start 2026-09-27T10:47:09, end 11:02:20 (911 s), exception: null, input_path/output_path = basename seul. Zéro fuite de chemin (/home/, /tmp/, G:\, D:\, ft02 : 0 match dans le JSON brut). Zéro output image — tout est stream texte, aucune sortie éditée à la main détectable (bruit réaliste : 429,37/129,73 par graine, stat Wilcoxon 0.0).

  2. Ancrage prose↔sorties : 13/13 valeurs exactes. Les 6 lignes par graine de la cellule « Lecture par graine » (429,37/129,73 … 373,83/86,00) sont byte-à-byte celles des sorties committées ; agrégats 343,07 ± 49,88 / 172,44 ± 49,50, delta −170,63, edge −3,43σ, Wilcoxon n=6 ties=0 p=0,0312, IC95 [−237,07 ; −106,16], verdict PPO BEATS GRPO : chaque chiffre cité existe dans une sortie. La lecture VRAM (65,67/66,00/65,16 MiB, RTX 3080 Ti Laptop 16 384 MiB, 9 155 params, PyTorch 2.11.0+cu128) colle au JSON _vram_result committé.

  3. Ré-arimétrie refaite depuis ce siège : moyennes/écarts-types recalculés depuis les 6 paires = exactement les valeurs affichées ; edge = −170,63 / ((49,88+49,50)/2) = −3,434 ✓ ; 65,67/6144 = 1,07 % ✓ ; marge ≈ 94× ✓ ; p=0,0312 = 2/64, le minimum exact bilatéral pour 6 paires même signe — cohérent avec stat=0.0 et « meilleur GRPO (234,30) < plus faible PPO (280,07) ». Le diagnostic de dérive (prose alignée sur l'ancien run GPU — base disait mean=366,53) est confirmé par la base : la correction rattache chaque valeur au run frais.

  4. Structure préservée, rien supprimé. 27 cellules → 27 (14 md + 13 code) ; 12 cellules code byte-identiques ; la seule cellule code modifiée déplace CUBLAS_WORKSPACE_CONFIG avant l'import torch (elle était après dans la base) — sémantique conservée. Les 12 cellules prose réécrites sont toutes raccourcies (net ~−2,6 k car), chacune relit la même cellule qu'avant : aucune lecture déplacée ni doublon nouveau. Les cellules 6/11/18 sans accents sont inchangées depuis la base (héritées, pas introduites ici).

  5. Gardes au head : 0 échec ; Golden-set, markdown-claims-anchored, prose-counts, papermill ratchet, exec-sequence, organ-duplication tous verts. Les 3 checks pending (PR gate, validate-notebooks, Analyze csharp) incluent le plancher DWELL 120 min (création 11:06Z) — minuteur, pas verdict. Le commentaire bot ENOENT Golden-Set de 11:13Z s'est résorbé (check vert au head).

Réserve mineure (non bloquante) : la cellule 7 (3 sorties) porte deux lectures (mesure + verdict/portée) — lecture par sortie au sens strict, et déjà la structure de la base ; cité pour trace, pas un défaut de cette PR.

Un APPROVE éventuel serait pour un cycle post-levée DWELL (~13:07Z) si le head reste à 0 échec et toujours sans APPROVE.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18042 (fix(rl): ré-exécuter GRPO et réaligner les résultats) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Sep 27, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-2
pr: 18042
head: 8d0287b
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: eb4d83c518dceff6ad9d5faef3039580cfcbb6f5639e4e2dc174078c95cfe7bc
diff-files: 1
diff-additions: 193
diff-deletions: 237
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Lecture firsthand

Verdict

READY.

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

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants