Skip to content

fix(qc,#16795): QC-Py-34 determinisme GPU + resync narrative integrale (roles SAC/A2C inverses) - #16812

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/qcdet-qcpy34
Sep 20, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/qcdet-qcpy34

Conversation

@jsboige

@jsboige jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/qc -- lane myia-po-2026:CoursIA -- prev: DEEP/qc #16811

QC-Py-34 : déterminisme rendu effectif + re-exécution GPU + resync narrative intégrale

Tranche 6/13 du volet QuantConnect de #16795. Candidat re-vérifié firsthand : seed 42 posé (cellule 5, avec cuda.manual_seed), AUCUN réglage de déterminisme. Changement de device : l'ancienne exécution committée tournait sur stack étrangère CPU (PyTorch 2.11.0+cpu) — cette PR l'exécute sur GPU local déterministe.

Le fix (cellule 5, site du seed)

import os
os.environ.setdefault('CUBLAS_WORKSPACE_CONFIG', ':4096:8')  # avant import torch
# après les seeds :
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.use_deterministic_algorithms(True, warn_only=True)

Preuve d'exécution (C.2)

Papermill 17/17 cellules code, kernel coursia-ml-training, 0 erreur
Device: cuda | RTX 3080 Ti Laptop | PyTorch 2.6.0+cu124
SAC 100K steps 2,1 min + A2C 100K steps 4,5 min
grep NotImplementedError/assert False/1/0 : 0 occurrence
Guard markdown : 0 nouvelle violation ERROR

Les chiffres — le run inverse les rôles, la prose suit

Avant (CPU 2.11, committé) Cette PR (GPU 2.6.0 déterministe)
SAC — évals intermédiaires −3.808 → +1.013 → +1.049 +0.816 → +0.000 → +0.000
A2C — évals intermédiaires +1.348 → +0.942 → +0.000 +0.942 → +0.942 → +0.942
Classement final DQN > PPO > A2C (0.000) > SAC (−0.063) A2C (+0.942/+41.5 %/−12.68 %) > DQN > PPO > SAC (+0.509/+20.4 %/−13.00 %)
  • 30 remplacements scriptés sur 5 cellules narratives (courbes d'entraînement, figure, méthodologie, tableau final, courbes de portefeuille), assertion zero-résidu AVANT écriture. Les tables d'évaluations intermédiaires, les durées relatives (A2C ≈ 2× SAC) et les dérivés recalculés.
  • L'histoire pédagogique s'inverse : l'ancien récit (« A2C culmine puis meurt à 0.000 — inaction ; SAC progresse vers son pic ») devient (« A2C plateau stable et gagnant ; SAC s'érode après un bon départ »). La distinction performance de pointe vs stabilité — fil rouge du notebook — survit, avec les rôles échangés.
  • Note historique explicite ajoutée (lecture 1 du tableau) : une exécution précédente (CPU) montrait l'histoire exactement inverse — deux runs, deux verdicts opposés = la démonstration la plus nette de la sensibilité des runs RL, et la raison d'être du déterminisme armé ici + du protocole multi-seed du dépôt. C'est désormais un matériau pédagogique du notebook.
  • Colonnes DQN/PPO = littéraux stockés dans le code de comparaison (« valeurs de référence issues des notebooks frères ») — cohérentes avec main actuel. Dépendance post-fix(qc,#16795): QC-Py-33 determinisme GPU + resync narrative complete (comparaison DQN/PPO inversee) #16811 : une fois la PR fix(qc,#16795): QC-Py-33 determinisme GPU + resync narrative complete (comparaison DQN/PPO inversee) #16811 (nouvelles valeurs PPO) mergée, ces littéraux (0.645/+34.6/−27.20) seront périmés relativement aux outputs de Py-33 — re-synchronisation à prévoir dans une PR de suivi dédiée après merge (hors scope de cette tranche).

Périmètre

1 fichier, QC-Py-34-RL-SAC-A2C-Trading.ipynb.

SOTA

SOTA-OK : vrai PyTorch, vrai GPU local (SAC+A2C entraînés 6,6 min), kernel documenté, sorties réelles, aucun workaround.

See #16795 (contribution partielle — volet QC ; 7 FIX_CANDIDATE restants)

🤖 Generated with Claude Code

…U + resync narrative

Cellule 5 (site du seed 42) : CUBLAS_WORKSPACE_CONFIG avant import torch, puis
cudnn.deterministic=True / benchmark=False / use_deterministic_algorithms(True,
warn_only=True). Re-execution complete kernel coursia-ml-training (RTX 3080 Ti,
17/17 cellules, 0 erreur ; SAC 2,1 min + A2C 4,5 min). Ancienne execution =
stack CPU etrangere (PyTorch 2.11.0+cpu) : changement de DEVICE CPU->GPU.
Le run inverse les roles : SAC demarre bien (+0.816) puis s'erode en evaluation,
A2C stable (+0.942 x3) et GAGNE le classement final (A2C 0.942 > DQN 0.683 >
PPO 0.645 stocke > SAC 0.509). Prose resynchronisee : 30 remplacements scriptes
sur 5 cellules narratives, dont reecriture honnete des trois lectures du tableau
(l'ancienne histoire "A2C meurt a 0, SAC quasi-inactif" devient "A2C gagne,
photo a seed unique" avec note historique du run CPU inverse). Colonnes DQN/PPO
= litteraux stockes coherents avec main (dependance post-#16811 signalee dans
le body). Zero-residu assertion avant ecriture.

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

⚠️ 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.

@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 2.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 2.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.4s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.6s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.7s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 13.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.1s

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)

@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 (contrainte token : COMMENT only, #15511)

[Hermes] Vérifié au head 02d5eda (lecture du notebook head complet, pas du diff seul) :

  • Cellule 5 in extenso : CUBLAS_WORKSPACE_CONFIG=:4096:8 posé avant import torch, seed 42 (manual_seed + cuda.manual_seed), puis le trio cudnn.deterministic=True / benchmark=False / use_deterministic_algorithms(True, warn_only=True) — déterminisme armé au bon site, dans le bon ordre.
  • Authenticité exécution : 17/17 cellules code, exec_counts 1→17 continus, outputs réels partout — PyTorch 2.6.0+cu124, Device: cuda, durées SAC 2.1 min / A2C 4.5 min cohérentes entre les cellules 33/35 et le tableau final 44.
  • Prose↔outputs : scan des 7 cellules narratives pour l'ancien récit (« SAC culmine/progresse/domine ») = 0 occurrence ; le classement lu dans 36/45/47 (A2C +0.942 > DQN +0.683 > PPO +0.645 > SAC +0.509) correspond exactement aux outputs de la cellule 44 ; note historique CPU↔GPU (deux runs, deux verdicts opposés) bien intégrée comme matériau pédagogique.
  • Dépendance post-#16811 (littéraux DQN/PPO périmés relativement à Py-33 après merge) déclarée honnêtement dans le body — littéraux cohérents avec main actuel, rien à corriger dans cette tranche.

Suivi attendu : resync des littéraux DQN/PPO après merge de #16811, comme annoncé.

[Hermes hermes-pr-review, cycle :04 19/09, host c92df397a786]

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16812 (fix(qc,#16795): QC-Py-34 determinisme GPU + resync narrative integrale (roles SAC/A2C inverses)) 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.

@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 16812
head: 02d5eda
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a3ea9d4901e500a9a1c13af110ee8a73f80de93ee5b671b51825a9a48f1fe666
diff-files: 1
diff-additions: 830
diff-deletions: 252
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier de prevalidation tierce (gate #16907, Phase 4, dispatch ai-01 01:01Z — lot QC po-2026). Empreinte recalculee en DERNIER, head re-verifie 02d5eda juste avant, ce post est la derniere action sur cette PR.

Verifications firsthand au head exact 02d5eda

  • B.0 : check_unaddressed_nits.py 16812 rc=0, re-joue a l'instant ; body, commentaires, reviews et threads inline lus integralement.
  • Checks latest-wins : 0 non vert.
  • Scope : notebooks SAC-A2C — classe GPU determinisme Metriques GPU non reproductibles : 43 notebooks posent une graine sans reglage de determinisme #16795 (graine posee sans reglage de determinisme -> deterministic=True, re-entrainement GPU), scope aligne sur le titre, un sujet par PR.
  • Domaine : pass (rule G des PRs QC — backtests et mesure — verifiee par Hermes, LGTM au head exact).

Disposition : READY. Aucun merge, APPROVED ou CHANGES_REQUESTED effectue ici.

@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16812
head: 02d5eda
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8cf2f8b7f596317b76826a4fd2c7d5f88e08ebbd7ab4c8384d3783bdc94d9d63
diff-files: 1
diff-additions: 830
diff-deletions: 252
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit f1d82c1 into main Sep 20, 2026
78 of 80 checks passed
jsboige added a commit that referenced this pull request Sep 20, 2026
… main (#16812)

Conflit de contenu sur QC-Py-34-RL-SAC-A2C-Trading.ipynb : les DEUX cotes livraient le
determinisme #16795 sur ce notebook (main via #16812 merge aujourd'hui : warn_only=True +
CUBLAS avant import torch + re-exec GPU + resync narrative 30 remplacements ; cette branche :
mode STRICT sans warn_only + re-exec GPU avec resultats differents). Comparaison cell-by-cell :
seules 6 cellules different (5 setup + 5 narratives), 44/50 sources identiques — meme intention,
livraisons paralleles de la meme lane. Resolution : version MAIN (mergee = canonique, run
coherent source+outputs+prose) ; le delta STRICT de la branche sur 34 est ecarte en faveur du
canon et signale en commentaire PR pour arbitrage/follow-up. QC-Py-32/33 + best_dqn/ppo_model.pt
(contenu distinct de la PR, jamais touche par main) conserves byte-identiques. Catalogue
byte-identique a main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 23, 2026
…1/32, research_rl_grpo) (#17482)

* fix(qc,#16795): determinisme GPU strict — residu non couvert (QC-Py-31/32, research_rl_grpo)

Three notebooks from the closed QC determinism series whose re-executed states
were NOT covered on main (arbitrage c.38 volet QC, DM po2026-arb-16795-qc-volet) :
main already carries the same fixes for QC-Py-22/23/24/33/34 + 6 research via
#16803/#16806/#16807/#16811/#16812/#16815/#16816/#16818/#16822/#16823/#16824.
Cherry-picked states from the retained branches feature/16795-qcdet-pr{A,B,C}.

C.2: execution_count+outputs coherents (17/17, 15/15, 7/7), 0 error, 0
NotImplementedError; machine attestee dans les sorties (PyTorch 2.6.0+cu124,
device cuda, NVIDIA RTX 3080 Ti; GRPO 4 seeds pour research_rl_grpo).

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

* ci: force fresh pull_request event (body Diagnostic derive kernel ajoutee)

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Sep 23, 2026
…1/32, research_rl_grpo) (#17482)

* fix(qc,#16795): determinisme GPU strict — residu non couvert (QC-Py-31/32, research_rl_grpo)

Three notebooks from the closed QC determinism series whose re-executed states
were NOT covered on main (arbitrage c.38 volet QC, DM po2026-arb-16795-qc-volet) :
main already carries the same fixes for QC-Py-22/23/24/33/34 + 6 research via
#16803/#16806/#16807/#16811/#16812/#16815/#16816/#16818/#16822/#16823/#16824.
Cherry-picked states from the retained branches feature/16795-qcdet-pr{A,B,C}.

C.2: execution_count+outputs coherents (17/17, 15/15, 7/7), 0 error, 0
NotImplementedError; machine attestee dans les sorties (PyTorch 2.6.0+cu124,
device cuda, NVIDIA RTX 3080 Ti; GRPO 4 seeds pour research_rl_grpo).

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

* ci: force fresh pull_request event (body Diagnostic derive kernel ajoutee)

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants