Skip to content

fix(qc,#16795): QC-Py-33 determinisme GPU + resync narrative complete (comparaison DQN/PPO inversee) - #16811

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

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

Conversation

@jsboige

@jsboige jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner

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

QC-Py-33 : déterminisme rendu effectif + re-exécution GPU + resync narrative complète

Tranche 5/13 du volet QuantConnect de #16795. Candidat re-vérifié firsthand : seed 42 posé (cellule 7, avec cuda.manual_seed), AUCUN réglage de déterminisme.

Le fix (cellule 7, 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 16/16 cellules code, kernel coursia-ml-training, 0 erreur
Device: cuda | RTX 3080 Ti Laptop | PyTorch 2.6.0+cu124 | training PPO 4,7 min
grep NotImplementedError/assert False/1/0 : 0 occurrence
Guard markdown : 0 nouvelle violation ERROR

Les chiffres — le run a changé de physionomie, la prose suit

Ancienne exécution = stack étrangère (PyTorch 2.11.0+cu128). Le PPO est seed-sensible : la re-exécution (données Yahoo re-téléchargées incluses) dérive complètement :

Métrique Avant (2.11, committé) Cette PR (2.6.0+cu124 déterministe)
Meilleur val Sharpe +0.645 (step 25 600) +1.191 (step 25 600)
Rendement total OOS +34.55 % +57.24 %
Rendement annuel +10.46 % +16.38 %
MaxDD -27.20 % -15.23 %
Win rate 51.20 % 43.09 %
Distribution d'actions 94 % Buy (10 650) 99,5 % Hold (11 220 Hold, 60 Buy)
  • La leçon pédagogique centrale SURVIT inchangée : le Sharpe de validation décroche toujours à mesure que les losses descendent (+1.191 → +0.348 → +0.218 ; value loss 3.1004 → 1.0028 → 0.6896 ; entropie 0.811 → 0.588) — l'overfitting RL et la justification du best-checkpoint restent démontrées par les outputs.
  • La comparaison DQN vs PPO s'INVERSE : PPO passe devant partout (Sharpe 1.191 vs 0.657, MaxDD -15.23 vs -22.94, rendement +57.2 vs +31.3). La cellule « verdict » a été réécrite honnêtement (pas un simple rechiffrage) : la leçon « un écart à seed unique n'est pas un verdict » survit avec les magnitudes recalculées (variance interne 0.97 > écart inter-algorithmes 0.53) ; l'ancien argument « deux faces de la même pièce » (rendement élevé ↔ drawdown profond) ne tenait plus et a été remplacé par le mécanisme réel (exposition installée puis jamais démentie).
  • 24 remplacements scriptés (logs d'entraînement, lecture de la distribution d'actions, protocole, verdict, figure, export), assertion zero-résidu AVANT écritriture ; pourcentages dérivés recalculés (entropie 58 % → 42 % du max ln 4).
  • Ancres DQN (QC-Py-32) intactes : 0.657 / -22.94 % / +31.3 % / 9 trades — Py-32 n'a pas été re-exécuté (hors pattern Metriques GPU non reproductibles : 43 notebooks posent une graine sans reglage de determinisme #16795 : aucun seed posé).

Périmètre

2 fichiers : QC-Py-33-RL-PPO-Trading.ipynb + best_ppo_model.pt (sous-produit suivi régénéré par la cellule d'entraînement elle-même).

SOTA

SOTA-OK : vrai PyTorch, vrai GPU local (PPO entraîné 4,7 min), kernel documenté, sorties réelles, aucun workaround.

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

🤖 Generated with Claude Code

…U locale + resync narrative

Cellule 7 (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,
16/16 cellules, 0 erreur). Ancienne execution = stack etrangere PyTorch 2.11.0+cu128 ;
le run PPO derive completement : meilleur Sharpe +0.645 -> +1.191 (step 25,600),
backtest OOS +57.24% / 16.38% annuel / Sharpe 1.191 / MaxDD -15.23% / win rate
43.09%, distribution d'actions inversee (94% Buy -> 99.5% Hold). Prose
resynchronisee : 24 remplacements scriptes dont reecriture honnete de la cellule
verdict (la comparaison DQN/PPO s'inverse : PPO devant partout — la lecon
"seed unique != verdict" survit, magnitudes recalculees 0.97 interne vs 0.53
inter-algorithmes). Ancres DQN Py-32 (0.657/22.94/31.3) intactes. Zero-residu
assertion avant ecriture. best_ppo_model.pt regenere avec le notebook.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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

Notebook PR Validation: PASS

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

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

@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.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.8s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.5s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 25.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.1s

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

@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é: source complète de la cellule 7 lue au head c02f4146 — trio déterminisme ordonné avant import torch ; 16/16 cellules code exec_counts 1-16 continus, 0 warning nondéterminisme, 0 erreur, 3 exercices « à compléter » intacts ; CI 77 check-runs, l'unique FAILURE = PR gate DWELL plancher 120 min, explicite « rien à corriger dans le code »)

[NanoClaw] Review structurelle (notebook — protocole extract-notebook-diff, pas de diff brut base64) — QC-Py-33 RL-PPO, tranche 5/13 du volet QuantConnect #16795.

Ce qui est vérifié :

  • Le fix est au bon site, dans le bon ordre, en un seul endroit. Cellule 7 lue intégralement au head : os.environ.setdefault('CUBLAS_WORKSPACE_CONFIG', ':4096:8') avant import torch (l'ordre est obligatoire — cuBLAS lit l'env var à son init), puis les seeds préexistants (manual_seed(42), np.random.seed(42), cuda.manual_seed(42) — le seed CUDA était déjà là, contrairement à QC-Py-22), puis le trio cudnn.deterministic=True + cudnn.benchmark=False + use_deterministic_algorithms(True, warn_only=True). Le grep de tout le notebook confirme : 1 seule cellule porte le déterminisme, pas de configuration éparpillée. setdefault (respecte une config explicite) et warn_only (notebook exécutable si une op sans implémentation déterministe apparaît) restent les bons choix prudentiels.
  • La re-exécution déterministe est propre, pas seulement déclarée : warn_only=True transforme une op non couverte en WARNING, or le scan des sorties de toutes les cellules trouve 0 warning « does not have a deterministic implementation » — la preuve affirmative que l'exécution a tourné intégralement en mode déterministe. C'est plus fort que le « grep NotImplementedError : 0 » du body (qui ne prouverait que l'absence d'erreur).
  • Sorties réelles, fraîches, continues : exec_counts 1→16 sans trou ni N/A (une seule session d'exécution) ; GPU nommé (RTX 3080 Ti Laptop, 17.2 GB) ; métriques non rondes et cohérentes en séquence (val_loss 3.1004 → 1.0028 → 0.6896, entropy 0.811 → 0.675 → 0.588, best Sharpe +1.191 figé dès le step 25,600) ; elapsed 75/148/222 s cohérent avec le « 4.7 min » du body. Le compte « Papermill 16/16 cellules code » du body se re-vérifie : 16 cellules code, 16 exec_counts — l'identité tient.
  • Intention pédagogique préservée : 3 « Exercice a completer » intacts (clip ratio PPO, bonus d'entropie, +1 en fin de notebook) ; l'architecture Actor-Critic 256→128 (156 549 paramètres) et l'environnement partagé avec QC-Py-32 pour « comparaison équitable » sont inchangés dans leur rôle.
  • CI lu firsthand (per_page=100) : 77 check-runs, 1 seul non-success = « PR gate » FAILURE dont le résumé est explicite : DWELL, tête âgée de 8 min, plancher 120 min, écoule 05:57:33Z — « rien à corriger dans le code : cette jambe est un minuteur ». Je ne compte pas cette jambe comme une régression ; note pour la lane : ne pas re-pusher (le re-push remet le plancher à zéro) ; re-jeu gh run rerun après écoulement.
  • Le second fichier est l'artefact attendu : best_ppo_model.pt (+2/−2, binaire) = le poids re-sérialisé par la re-exécution déterministe — cohérent avec la tranche (le meilleur checkpoint Sharpe 1.191 au step 25,600 correspond à la progression des sorties).

Limites (non bloquantes) :

  1. La preuve de reproductibilité (deux exécutions GPU → métriques identiques) vit dans le body de la lane, pas dans un artefact committé — même limite que sur QC-Py-22 (#16803), limite de famille du volet #16795.
  2. Le delta +386/−279 du .ipynb reste dominé par la régénération des sorties après re-exécution déterministe — cohérent, mais peu auditable ligne à ligne ; les métriques committées sont la parole de la lane (je les ai trouvées internement cohérentes, non re-dérivées).

— review structurelle NanoClaw, COMMENT-only (décision de merge à Emerjesse ; PR gate se débloque mécaniquement à 05:57:33Z).

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16811 (fix(qc,#16795): QC-Py-33 determinisme GPU + resync narrative complete (comparaison DQN/PPO inversee)) 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: 16811
head: c02f414
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 80eaf66876d2e54eec2de0460310892b184076d9cc84f36ca7c2d41a78a66149
diff-files: 2
diff-additions: 388
diff-deletions: 281
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 c02f414 juste avant, ce post est la derniere action sur cette PR.

Verifications firsthand au head exact c02f414

  • B.0 : check_unaddressed_nits.py 16811 rc=0, re-joue a l'instant ; body, commentaires, reviews et threads inline lus integralement.
  • Checks latest-wins : 0 non vert.
  • Scope : notebook PPO (+ artefacts .pt) — 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.

myia-ai-01 pushed a commit that referenced this pull request Sep 20, 2026
…U + resync narrative (#16812)

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>
@myia-ai-01
myia-ai-01 merged commit 1f68108 into main Sep 20, 2026
78 of 80 checks passed
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