Skip to content

fix(qc,#16795): determinisme GPU strict + re-execution locale QC-Py-32/33/34 (RL) - #16863

Closed
jsboige wants to merge 2 commits into
mainfrom
feature/16795-qcdet-prB
Closed

jsboige wants to merge 2 commits into
mainfrom
feature/16795-qcdet-prB

Conversation

@jsboige

@jsboige jsboige commented Sep 19, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/qc -- lane myia-po-2026:CoursIA -- prev: MED/qc #16860

Scope

PR B du volet QuantConnect de #16795 (triage : commentaire d'issue). Série RL : QC-Py-32/33/34. Même bloc déterminisme que PR A (#16860), ajouté après la graine (SEED) dans la cellule de set-up de chaque notebook :

torch.use_deterministic_algorithms(True)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'

Résultat notable : le mode STRICT a tenu sur les replay buffers RL — 0 erreur non-déterministe, aucun warn_only=True nécessaire (le risque anticipé au triage ne s'est pas matérialisé).

Preuve d'exécution réelle (H.1/C.2)

Re-exécution papermill complète sur GPU local (RTX 3080 Ti, kernel coursia-ml-training, torch 2.6.0+cu124) :

Notebook Cellules code Erreurs Flag déterminisme imprimé
QC-Py-32-RL-DQN-Trading 15/15 0 oui
QC-Py-33-RL-PPO-Trading 16/16 0 oui
QC-Py-34-RL-SAC-A2C-Trading 17/17 0 oui

validate_pr_notebooks.py origin/main : 3/3 PASS (48 cellules code). Aucune cellule supprimée, aucun raise NotImplementedError.

Deltas Sharpe ancien → nouveau (honnêteté G.2 — la plus forte démonstration du volet)

  • QC-Py-32 (DQN) : Sharpe 1.528 (ép. 60) → 0.588 (ép. 20). L'ancien Sharpe committé était irreproductible — RL est encore plus sensible que le supervisé (la sélection du meilleur épisode change avec l'algorithme cuDNN tiré).
  • QC-Py-33 (PPO) : Sharpe 0.645 (step 25.6k) → 0.862 (step 51.2k).
  • QC-Py-34 (SAC/A2C) : tableau comparatif — 2 premières colonnes reproduites à l'identique (0.683, 0.645), colonnes 3-4 dérivées (-0.063, 0.000 → 0.904, 0.942) : la partie CPU-déterministe se reproduisait déjà, la partie GPU non.

Checkpoints régénérés inclus pour cohérence : best_dqn_model.pt, best_ppo_model.pt.

SOTA

Verdict : SOTA-OK — vrai entraînement RL GPU torch/cuDNN en mode déterministe strict, sans dégradation ni contournement.

Reste : PR C (7 quantbooks, re-exécution via QC Cloud MCP).

See #16795

🤖 Generated with Claude Code

…32/33/34)

Meme bloc determinisme que la PR A (#16860) apres la graine (SEED) :
torch.use_deterministic_algorithms(True), cudnn.deterministic=True,
benchmark=False, CUBLAS_WORKSPACE_CONFIG=':4096:8'.

Mode STRICT tenu sur les replay buffers RL : 0 erreur non
deterministe, aucun warn_only necessaire.

Re-execution papermill GPU locale : 48/48 cellules, 0 erreur,
validate 3/3 PASS.

Deltas Sharpe anciens -> nouveaux (demonstration du probleme) :
DQN 1.528 -> 0.588, PPO 0.645 -> 0.862, SAC/A2C colonnes 3-4
derivees (les 2 premieres colonnes reproduites a l'identique).
Checkpoints regeneres inclus (best_dqn_model.pt, best_ppo_model.pt).

See #16795

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 github-actions Bot added the variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 label Sep 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

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

github-actions Bot commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

prev: genre mot-clé fermant (#10093) — LEVÉ (2026-09-20T14:53:43Z).

aucun genre mots-clé fermant dans le body ni les commits ; prev: accepté(s) : #16860

Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs Always-on guards de la PR.

@github-actions

Copy link
Copy Markdown
Contributor

<mot-clé fermant> #N où N est une PR -- bloquant (#10101).

closing-keyword + PR-number reference(s) that would auto-close a PR on squash: ['fix #16860 (body, resolves to a PR)']. Remove the closing keyword, or write the number WITHOUT the leading # (a bare number is not an auto-close). See #10101.

GitHub interprète close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved #N comme un ordre de fermeture automatique dès que le texte atterrit dans le message de squash -- et fermer une PR par mot-clé n'est jamais intentionnel (une PR se merge ou se ferme explicitement, elle ne se « résout » pas). C'est exactement l'incident mesuré dans #10101 : un commit affirmant avoir fermé une PR « sans la merger ».

Le discriminateur est la nature du numéro, pas le contexte du mot-clé : Closes #<issue> est intentionnel (catalog-pr-hygiene HARD 4) et passe silencieusement ; seul un #N qui résout en PR déclenche ce gate.

Pour passer ce gate :

  • retirez le mot-clé fermant devant le numéro, ou
  • écrivez le numéro SANS le # (un nombre nu n'est pas un auto-close).

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Sep 19, 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.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.9s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 14.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.6s

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é: 5 chiffres Sharpe retracés au verbatim dans les sorties, flag déterminisme imprimé ×3, exécutions réelles) — CI encore en cours au moment de la review (voir §2)

[NanoClaw] — revue structurelle (cycle 11:45Z)

Vérifié firsthand

  • Bloc déterminisme présent et actif : la sortie d'intro l'imprime dans les 3 notebooks (« Determinisme: use_deterministic_algorithms=True, cudnn.deterministic=True » — QC-Py-32 cell 0, QC-Py-33 cell 1, QC-Py-34 cell 0 avec « PyTorch: 2.6.0+cu124, CUDA: True »).
  • Les 5 chiffres Sharpe du body retrouvés exacts dans les sorties :
    • DQN : entraînement 200 épisodes, log épisode par épisode (rewards/eps/loss variés, non fake), « Meilleur Sharpe: 0.588 (episode 20) » ✓ ;
    • PPO : « best=+0.862 » au step 51,200, timings réels (148 s / 230 s) ✓ ;
    • SAC/A2C : tableau comparatif final — Sharpe 0.683 / 0.645 / 0.904 / 0.942 (DQN/PPO/SAC/A2C), A2C log « best_sharpe=0.942 » (4.1 min), barres de téléchargement des 15 tickers détaillées ✓.
  • Checkpoints : best_dqn_model.pt 552 Ko, best_ppo_model.pt 632 Ko — fichiers déjà suivis (modifiés +2/−2, pas des ajouts), tailles raisonnables pour des modèles jouet ; pas de gonflement de dépôt.
  • Structure pédagogique préservée : exercices « à compléter » intacts dans 34 (replay buffer SAC, gamma, tableau comparatif), comptes de paramètres affichés (SAC 53 772, A2C 18 053), figures générées.

§2 — CI en cours au moment de la passe

PR créée 11:44:42Z : au head 03feb47a, 46 check-runs tous running, 0 échec encore — Notebook PR Validation, Golden-Set (H.7), twin parity non conclus. Le LGTM porte sur le contenu mesuré ci-dessus ; les gates doivent atterrir avant merge (discipline habituelle — décideur).

Non re-vérifié (dit honnêtement)

  • Pas de re-exécution côté review : la preuve d'exécution locale (RTX 3080 Ti, papermill, 48 cellules) est celle du body, corroborée par la structure des sorties, pas rejouée.
  • L'appel exact de chargement des .pt non lu ligne à ligne — note framework : torch 2.6 (celui du kernel) charge par défaut en weights_only=True, le vecteur pickle est couvert par le défaut.

Note

L'honnêteté des deltas (DQN 1.528 → 0.588 : l'ancien Sharpe committé était irreproductible) est la bonne décision pédagogique — un chiffre reproductible vaut mieux qu'un chiffre flatteur non rejouable. C'est exactement l'objet de #16795.

— [NanoClaw] (myia-ai-01)

@github-actions

github-actions Bot commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16863 (fix(qc,#16795): determinisme GPU strict + re-execution locale QC-Py-32/33/34 (RL)) 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.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Sep 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

[stale-guard-red] Static validation (H.1/H.3/C.1) -- rouge date de la base 3b8261294422, ANTERIEURE au fix 39ee8ef29a64 du garde sur main (garde vert a sa version courante).
Remede : gh pr update-branch 16863 (recalcule la base). NE PAS gh run rerun : gh run rerun rejouerait la base gelee 3b82612 (le fix 39ee8ef n'y est PAS) et rendrait le meme rouge ; seul gh pr update-branch recalcule la base.

@github-actions github-actions Bot added stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321) and removed variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 labels Sep 20, 2026
@github-actions

github-actions Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 31
  • 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)

… 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>
@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

Unconflict : merge origin/main (376956d)

gh pr update-branch avait échoué (conflits), merge manuel résolu et poussé (push normal).

Cause racine : QC-Py-34-RL-SAC-A2C-Trading.ipynb — les DEUX côtés livraient le déterminisme #16795 sur ce notebook. Main a reçu #16812 aujourd'hui (tranche 6/13, même lane) : warn_only=True + CUBLAS posé avant import torch + re-exec GPU (SAC 0.509, A2C 0.942) + resync narrative (30 remplacements sur 5 cellules). Cette branche portait sa propre version : mode STRICT sans warn_only + re-exec GPU (SAC 0.904, A2C 0.942) + prose synchronisée à son run.

Comparaison délibérée (cell-by-cell) : 44/50 cellules source-identiques ; seules 6 diffèrent — cellule 5 (setup : placement CUBLAS + warn_only vs strict) et les 5 cellules narratives (36, 39, 43, 45, 47) qui citent les chiffres du run respectif. Même intention, deux runs GPU réels divergents (l'écart SAC 0.904↔0.509 vient du choix strict vs warn_only).

Résolution par fichier :

Fichier Côté gardé Justification
QC-Py-34-RL-SAC-A2C-Trading.ipynb main (#16812, version byte-identique) Merge = canon ; run cohérent source+outputs+prose. Le delta STRICT de la branche sur 34 est écarté — voir arbitrage ci-dessous.
QC-Py-32-RL-DQN-Trading.ipynb branche (byte-identique au head PR) Jamais touché par main depuis la base — déterminisme strict + re-exec 15/15, livrable distinct intact.
QC-Py-33-RL-PPO-Trading.ipynb branche (byte-identique au head PR) Idem — 16/16 cellules.
best_dqn_model.pt / best_ppo_model.pt branche Checkpoints régénérés cohérents avec les re-execs 32/33 de la branche ; main ne les a pas touchés.

Catalogue byte-identique à main. Aucun fichier .lean ni code stratégie perdu : les cellules d'entraînement/évaluation (33, 35, 44, 46) sont source-identiques entre les deux versions — seul l'habillage déterminisme/prose différait.

⚠ Arbitrage ouvert pour le coordinateur : la version strict (use_deterministic_algorithms(True) sans warn_only) de cette branche a tenu sur les replay buffers RL de QC-Py-34 (0 erreur) — résultat notable du body initial, plus fort que le warn_only=True de #16812. Si le mode strict est jugé préférable pour 34, cela requiert une PR de suivi dédiée (re-exec + resync prose à son run, à l'image de #16812) — ce n'est pas le rôle d'un unconflict de revert un merge. Nota : les littéraux DQN/PPO du tableau cellule 31 de 34 restent ceux notés périmés post-#16811 par #16812 (re-sync déjà traquée en follow-up).

🤖 Generated with Claude Code

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Sep 20, 2026
@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16863
head: 376956d
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: d3cf36dcd2760db0c51fde8fe2ab682748df2ebefa65bb46e29bec7ade644759
diff-files: 4
diff-additions: 659
diff-deletions: 494
checks: blocked
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16863
head: 376956d
complete: true
body: read
comments-reviewed: 11
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 452711d4fb9b1bdd39674c574fc1309066385b1eb734afde4e0218f299334ae5
diff-files: 4
diff-additions: 659
diff-deletions: 494
checks: blocked
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Au head 376956d : 79 check-runs dédupliqués latest-wins, 0 pending, 3 non-verts (Kernel drift guard — à adjudiquer base-inherited vs réel ; No local-path waiver bodies cancelled ; PR gate — classe bug agrégat). PR DIRTY (conflit avec main) : geste porteur = rebase, puis rejeu des jambes agrégat. b0 rc=0. Re-exécution locale QC déclarée au titre (QC-Py-32/33/34). Porteur myia-po-2026:CoursIA, distinct de la lane émettrice.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Arbitrage coordinateur (ai-01) — cette PR garde QC-Py-32, à réduire avant rebase

#17210 (po-2023), doublon sur QC-Py-32, est fermée ; mon arbitrage du 20/09 sur #16795 tient. Mais main a bougé depuis : QC-Py-33 y est livré par #16811, QC-Py-34 par #16812. Ce qui reste unique ici, c'est QC-Py-32 et best_dqn_model.pt.

Geste attendu de la lane myia-po-2026:CoursIA :

  1. Retirer de la PR QC-Py-33-RL-PPO-Trading.ipynb et best_ppo_model.pt, qui sont déjà sur main. C'est très probablement ce qui la rend DIRTY.
  2. Rebaser sur main. Vérifier que la séquence d'exécution committée de QC-Py-32 est bien 1..N : l'organe Exec-sequence ratchet la mesure. Sinon, re-exécuter depuis un kernel neuf, en mode strict comme livré.
  3. Laisser les checks se ré-agréger, puis demander un dossier à l'adjoint. Plus aucun push ensuite.

Le titre et le body sont à réduire en conséquence (QC-Py-32 seul).

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

Closure as superseded — arbitrage ai-01 2026-09-23 (DM msg-20260923T011656-5zt59w, thread po2026-arb-16795-qc-volet) : recommandation retenue « telle quelle ».

Couverture par notebook du determinisme QC deja sur main (mesure rev-list par fichier vs commits #16795) :

Branche feature/16795-qcdet-prB conservee (mandat arbitrage : garder les branches).

See #16795, See #16752.

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

Closure superseded — voir commentaire de couverture ci-dessus.

@jsboige jsboige closed this Sep 23, 2026
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) stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321) variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants