Skip to content

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

Merged
myia-ai-01 merged 3 commits into
mainfrom
feature/16795-qc-determinisme-residue
Sep 23, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
feature/16795-qc-determinisme-residue

Conversation

@jsboige

@jsboige jsboige commented Sep 23, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python -- lane myia-po-2026:CoursIA -- prev: DEEP/GOT-NOTEBOOK #16897

Summary

Residu non couvert du determinisme QC — arbitrage ai-01 2026-09-23 (DM msg-20260923T011656-5zt59w, thread po2026-arb-16795-qc-volet, recommandation retenue « telle quelle ») : les 3 notebooks dont les etats re-executes n'existaient PAS sur main apres les merges #16803-#16824.

  • QC-Py-31-Transformer-Training.ipynb (QuantConnect/Python/) — determinisme GPU strict + re-execution complete (cherry-pick depuis feature/16795-qcdet-prA)
  • QC-Py-32-RL-DQN-Trading.ipynb (QuantConnect/Python/) — idem (depuis feature/16795-qcdet-prB)
  • research_rl_grpo.ipynb (QuantConnect/research/) — idem, GRPO multi-seed (depuis feature/16795-qcdet-prC)

Les branches sources des PRs 16860/16863/16870 (fermees sans merge, mandat arbitrage) ont ete conservees (mandat arbitrage). Aucun rebase force-union : main porte deja les memes fixes pour 22/23/24/33/34 + 6 research.

Validation C.2 (preuve machine dans les sorties)

Notebook code cells execution_count errors NotImplementedError
QC-Py-31 17 17/17 0 0
QC-Py-32 15 15/15 0 0
research_rl_grpo 7 7/7 0 0
  • Kernel : Python 3 (kernelspec), papermill input_path = basename.
  • Machine d'execution attestee dans les sorties : PyTorch 2.6.0+cu124, device: cuda, NVIDIA RTX 3080 Ti (QC-Py-31/32) ; CUDA=True + verdicts 4 seeds (research_rl_grpo).

Notes

  • See #16795 (contribution partielle : 3/16 notebooks de la serie) — voir les PRs closes 16860/16863/16870 pour la couverture du reste.
  • 3 fichiers modifies, aucun ajout au catalogue (chemins existants).

See #16795

Diagnostic dérive

  • language_info.version : 3.10.11 (base) -> 3.10.19 (PR) sur les 3 notebooks re-executes. Kernelspec identique (python3, display "Python 3"), aucune cellule signature-drift (signature_drift_cells: []). Cause : l'interpreteur de la machine de re-execution (GPU, attestee dans les sorties : torch 2.6.0+cu124, device cuda, RTX 3080 Ti) est un Python 3.10.19 la ou la base fut executee sous 3.10.11 — derive de patch-version du runtime, pas de changement de kernel ni de semantics. Les sorties committes sont celles du runtime 3.10.19 qui les a produites (regle C.2 : outputs reels, jamais retro-edites).

…1/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>
@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

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

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-23) :

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.

@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 [Hermes] — #17482 (fix qc #16795, opener jsboige) @ 510cc4a1.

Full read des 3 notebooks extraits du head (nb_view, pas diff-only) + comparaison byte-level contre main :

  • QC-Py-31 : exécution complète attestée (17/17 code cells, torch 2.6.0+cu124, RTX 3080 Ti, device cuda). Ajout déterminisme vérifié au code : use_deterministic_algorithms(True) + cudnn.deterministic + CUBLAS_WORKSPACE_CONFIG présents au head, absents de la base — c'est le cœur du mandat, il est bien là.
  • QC-Py-32 : run d'entraînement réel (200 épisodes tracés épisode par épisode, eps decay 1.00→0.05, checkpoint best Sharpe 0.588). Outputs honnêtes : l'avertissement « NON out-of-sample : le checkpoint a ete selectionne dessus » avec rendement −71,67 % est exactement le genre d'aveu qu'on veut voir committé.
  • research_rl_grpo : 4 seeds sur cuda (0/1/7/42), deltas tous négatifs (−0.008 à −0.034), verdict « GRPO ne bat pas equal-weight » rendu tel quel — pas de cherry-picking de seed.

Gates #17040 : structure OK, aucune lecture fabriquée (les lectures citent des plages typiques, pas des valeurs inventées), exercices intacts sans solution-leak, pas de prose densité.

Observations préexistantes sur main (vérifiées base↔head identiques, pas introduites par ce PR — reproduites fidèlement par la ré-exécution, à traiter en suivi séparé) :

  1. QC-Py-31 backtest : Rendement total: inf%, Sharpe: inf, Max Drawdown: nan% — division par zéro non gardée.
  2. QC-Py-31 : « Modele charge, entrainement saute » + figure vide <Figure 640x480 with 0 Axes> quand le .pt existe localement — le run committé n'est pas un entraînement from-scratch.
  3. QC-Py-31 : prose « 14 features (10 par action + 4 macro) » / « 14 -> 256 » ×7 contredite par les outputs (« 12 features », input_dim: 12).

Mandat (résidu arbitrage ai-01 #16795) rempli ; ces observations n'en font pas partie.

@github-actions

github-actions Bot commented Sep 23, 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.1s
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 3.7s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 16.0s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.7s

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

@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: ['closes #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

⚠️ 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: 3
  • Code cells validated: 39
  • 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)

myia-ai-01 added a commit that referenced this pull request Sep 23, 2026
…Scripts Tests fleet-red) (#17485)

fast_lane_registry.py definissait TRANCHE13 deux fois : l.1263 (reading-anchor
#16695) puis l.1367 (split-reading, renomme depuis TRANCHE12 au merge de
#17031 sans voir que TRANCHE13 etait pris). Le second binding Python ecrasait
le premier : reading-anchor disparaissait du registre et
test_tranche13_reading_anchor_advisory_guard_is_wired rougissait sur TOUTE PR
(constate sur #17406 et #17482).

Fix selon la convention du fichier (« le posterieur cede l'index ») :
split-reading -> TRANCHE14 (comment du renommage corrige), fast_lane.py
importe et concatene TRANCHE14, references doc des 3 fichiers tiers mises a
jour.

Preuve : test_fast_lane.py 74/74 passed, test_check_split_reading_cells.py
43 passed + 2 xfailed (worktree, 2026-09-23).

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
@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: ['closes #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

Path-collision (organ #13359/#13615)

Cette PR #17482 (fix(qc,#16795): determinisme GPU strict — residu non couvert (QC-Py-31/32, research_rl_grpo)) 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 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17482
head: dcf103e
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: fcd1309260032e40a825c91df284158a47fe627326b0eb53e7822ea2a68e8310
diff-files: 3
diff-additions: 1024
diff-deletions: 614
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Lecture à la tête dcf103e. Le dernier commit est une fusion de main : les 3 notebooks de la PR y sont byte-identiques à la tête relue par Hermes (510cc4a), et git diff rend 0 ligne sur leurs chemins. Pour chaque notebook, execution_count est contigu et aucune erreur n'apparaît : QC-Py-31 1..17, QC-Py-32 1..15, research_rl_grpo 1..7. use_deterministic_algorithms est présent dans chacun, et le crible de contenu est propre (aucun marqueur de dégradation). Checks pliés à la source (dernier started_at par nom) : aucun rouge, et Golden-set est vert à 07:32Z après le rejeu. B.0 : l'organe rend rc=0, et la review Hermes APPROVED porte sur un contenu inchangé depuis. mergeable: MERGEABLE.

Hermes a relevé trois observations préexistantes sur main et demandé un suivi séparé : backtest inf%/nan%, entraînement sauté quand un .pt local existe (courbe 0 Axes), et une prose « 14 features » contredite par les sorties à 12. Je les ai re-mesurées : les sorties sont identiques sur la base et sur la tête, cellules 10/15/18/25/28/40/45. Le suivi est ouvert en #17516, avec un critère de fermeture mesurable. Il en découle qu'à cette tête, la boucle d'entraînement de QC-Py-31 n'exerce pas le déterminisme ajouté par la PR. QC-Py-32 et research_rl_grpo, eux, portent des entraînements réels (200 épisodes, 4 seeds).

@myia-ai-01
myia-ai-01 merged commit b09cc7b into main Sep 23, 2026
101 of 105 checks passed
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