Skip to content

fix(notebook): rendre DL 3.1 reproductible - #16199

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/13504-dl31-quant-drain
Sep 16, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/13504-dl31-quant-drain

Conversation

@jsboige

@jsboige jsboige commented Sep 14, 2026

Copy link
Copy Markdown
Owner

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

Résumé

  • rend explicite la reproductibilité du notebook avec np.random.seed(SEED) et torch.manual_seed(SEED), en conservant les RandomState(SEED) déjà injectés dans les calculs ;
  • remplace deux observations dépendantes de l'environnement dans l'en-tête par un contrat portable (Python, durée selon la machine) ;
  • ré-exécute intégralement le notebook sous le vrai kernel python3 et committe les sorties obtenues ;
  • normalise uniquement les chemins metadata.papermill.input_path et output_path vers le basename, sans modifier manuellement aucune sortie.

Périmètre : une source, MyIA.AI.Notebooks/ML/DataScienceWithAgents/03-DeepLearning/3.1-Retropropagation.ipynb.

See #13504

Diagnostic dérive

Verdict : CAUSE_FIXED.

Le classifieur trouvait 15 valeurs drainables : 2 ENV-DEP et 13 STOCHASTIQUE-NON-SEEDEE. Les calculs NumPy utilisaient déjà des générateurs locaux RandomState(SEED), mais le contrat global de reproductibilité n'était ni déclaré ni visible dans les sorties ; PyTorch n'avait pas non plus de seed globale explicite. La cause est corrigée dans les cellules source, puis le notebook a été entièrement ré-exécuté. Les deux observations d'environnement de l'en-tête ont été reformulées sans ré-épingler une version ou un temps machine.

Mesure canonique scan_quant_classify.py :

Classe Avant Après
MACHINE-DEP 0 0
ENV-DEP 2 0
STOCHASTIQUE-NON-SEEDEE 13 0
Total drainable 15 0

Les 139 constats restants sont tous STRUCTUREL et constituent du contenu pédagogique stable.

Exécution réelle

Exécution Jupyter/Papermill en place sous kernel python3 :

status: success
execution time: 34.47430419921875 s
cells executed: 11
cells succeeded: 11
cells failed: 0

Les 11 cellules code portent chacune un execution_count non nul (1 à 11) et au moins une sortie. Le validateur PR conclut :

passed: true
errors: []
forensic_verdict: EXEC_PROVED

Extraits des nouvelles preuves de reproductibilité :

Reproductibilite : seed globale NumPy = 42
Reproductibilite : seed globale PyTorch = 42

Les résultats centraux restent cohérents :

Loss premier forward : NumPy 0.616485204453 | PyTorch 0.616485204453 | ecart 1.11e-16
Apres 1 pas : ecart max de poids NumPy vs PyTorch = 2.78e-17
Trajectoire 3000 iters : ecart max de loss NumPy vs PyTorch = 1.11e-16
Ecart max global : 1.286e-11 (seuil 1e-6)
Loss : 0.6165 -> 0.1054
Accuracy train 0.967 | test 0.967

Aucune sortie n'a été éditée manuellement.

Validation

  • scan_quant_classify.py --notebook … --check : 15 → 0 drainable ;
  • validate_pr_notebooks.py origin/main --json : 11/11, EXEC_PROVED ;
  • check_output_failure_text.py origin/main --json : 1 notebook changé, 0 régression, TOOL_FAILURE 0→0, MACHINE_PATH 0→0 ;
  • check_source_output_ratchet.py origin/main --json : les deux cellules source modifiées sont EXECUTED, 0 régression ;
  • check_papermill_ratchet.py origin/main --json : BLOCK_ADDED, 0 régression ;
  • output/source collapse et output flood : 1 notebook changé, 0 régression ;
  • detect_papermill_path_leak.py --scan … --outputs --nonpii --check --summary : 0 défaut après normalisation des deux champs de métadonnées ;
  • scan_machine_path_outputs.py --check sur le dossier : 14 notebooks scannés, 0 occurrence ;
  • perte markdown : 23→23 cellules, 0 finding ; perte de plan : 16→16 titres, 0 finding ;
  • rendu markdown ERROR, liens, parsing source, ordre des cellules et cellules code consécutives : 0 finding ;
  • exercices : 4, seuil ≥3 ;
  • git diff --check : succès.

Le validateur générique signale encore six warnings lexicaux « possible unbalanced LaTeX » sur des cellules de formules inchangées. Ils préexistaient à cette tranche ; les organes bloquants latex-control-chars/rendu markdown n'ont aucune nouvelle violation.

Verdict SOTA

SOTA-OK : le notebook exécute réellement NumPy, scikit-learn et PyTorch sur CPU ; aucune réimplémentation de substitution, sortie fabriquée ou contournement d'environnement n'est introduit.

🤖 Generated with Claude Code

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 11
  • 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

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

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

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

@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

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2025:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-14) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

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.

@jsboige

jsboige commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

L’advisory prose/output a été reproduit sur la tête et sur origin/main avec le même organe : 19 détections sur la base, 19 sur la tête, zéro nouvelle détection ; les deux rapports portent les mêmes cellules et les mêmes chaînes. Il ne contient aucune relation CONTRADICTED ni UNPROVEN (0/0).

Les détections héritées mélangent notamment des numéros de sections (2.2, 2.5, 3.2), des hyperparamètres d’exercice (0.4, 0.15, 0.01, 10.0) et des notations scientifiques dont le normaliseur ne rapproche pas la mantisse arrondie de l’output. Les valeurs affectées par cette ré-exécution ont été vérifiées directement : 1,3 × 10⁻¹¹ correspond à 1.286e-11, 2,8 × 10⁻¹⁷ à 2.78e-17, et 0,873 est présent dans la sortie de la régression logistique. Verdict : advisory préexistant, aucune régression introduite par #16199.

@jsboige

jsboige commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

Diagnostic du check requis \PR gate\ : l’agrégateur a attendu puis confirmé 76 checks verts. Son unique motif d’échec est le plancher automatique DWELL : tête créée le 14 septembre 2026 à 18:46:55 UTC, âge 9 min au verdict, plancher 120 min, échéance 20:46:55 UTC. Le workflow indique qu’un balayage horaire ré-agrégera automatiquement le gate après l’échéance et qu’aucun geste manuel n’est requis. Aucun défaut de contenu, rerun aveugle, changement de SHA ni waiver d’urgence n’est donc justifié ; la PR reste honnêtement bloquée jusqu’au balayage post-dwell.

@myia-ai-01 myia-ai-01 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.

Exact-head review of 0b8282a80bd3e7b4bb7623bfadb322478b63d84c complete.

APPROVE — the notebook reproducibility repair is narrow and honestly re-executed. The only source changes are global NumPy/PyTorch seeding plus portable execution metadata; 11/11 code cells execute sequentially without errors, papermill metadata is coherent, exercise count remains 4, and every metric quoted in the PR body matches the committed outputs. The small gradient-check drift remains orders of magnitude below its threshold and is consistent with the seeded rerun.

Verified: latest checks green after dwell, no open collision, no unresolved thread or closing issue reference, and nits clear. See #13504 correctly leaves the umbrella open.

@myia-ai-01
myia-ai-01 merged commit df0cd62 into main Sep 16, 2026
78 of 80 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants