Constat — un nombre committé sous une graine qui ne garantit rien
En clôturant son drain de 23 PRs, po-2026 a mesuré que #16145 committait des chiffres non reproductibles : mAP variant de 0,596 à 0,742 à graine identique, par non-déterminisme cuDNN. Corrigé par deterministic=True ; chiffres définitifs 0,673 / 0,707.
Sa phrase est ce qui ouvre cette issue : « si d'autres notebooks GPU de la flotte commettent des métriques sans flag déterministe, la même classe de faux attend ».
La classe de défaut n'est pas « le chiffre est faux ». C'est : le notebook pose une graine, donc il a l'air reproductible, et rien ne le garantit. Un lecteur — étudiant, reviewer, ou nous-mêmes au cycle suivant — lit manual_seed(42) et en conclut que le nombre re-sortira. Sur GPU, sans réglage de déterminisme, c'est faux.
Mesure firsthand (main c818f6abce, MyIA.AI.Notebooks/**.ipynb, hors _archive)
|
Compte |
Notebooks touchant le GPU (.cuda(), device="cuda", to(device), torch.device) |
56 |
… qui posent une graine (manual_seed / seed_everything / np.random.seed) |
45 |
| … qui mentionnent un réglage de déterminisme |
3 |
| … graine posée, aucun réglage mentionné |
43 |
Reproduction : un os.walk sur MyIA.AI.Notebooks, trois expressions régulières, exclusion de _archive.
Deux honnêtetés, sans lesquelles ces chiffres mentent
- Le « 3 » est un majorant. Le motif compte
cudnn.benchmark comme une mention — or benchmark=True est souvent la cause du non-déterminisme, pas le remède. Trois notebooks en parlent ; combien sont protégés n'est pas mesuré ici.
- Graine sans flag n'égale pas chiffres faux. Ça veut dire que rien ne garantit la reproductibilité. Le sous-ensemble réellement fautif est celui qui committe un nombre (mAP, accuracy, Sharpe, loss finale) dans une sortie ou dans la prose. Ce tri-là appartient à chaque lane sur sa surface — il n'est pas fabriqué ici.
Répartition par volet
Tableau de volets, pas un dispatch nominatif : aucune affectation n'est présumée, aucun [CLAIMED] n'est posé. Une lane réclame son volet sur cette issue.
| Volet |
Fichiers |
Enjeu propre |
QuantConnect — Python/QC-Py-22/23/24/25/31/32/33/34, projects/*/research.ipynb, research/research_rl_* |
15 |
le plus exposé : un Sharpe ou un CAGR committé est une décision d'investissement simulée |
ML / DataScienceWithAgents — 03-DeepLearning, 04-Vision |
9 |
famille de #16145 : la classe y est prouvée, pas supposée |
GenAI — Audio 06-*, Video 01/02/03, Texte TV-00b, FineTuning, PostTraining |
11 |
beaucoup produisent un artefact, pas une métrique — risque plus faible, à confirmer un par un |
RL — rl_6e, rl_12, rl_15 |
3 |
courbes de retour committées |
SymbolicAI / Sudoku / ICT — SL-13 x2, Planners-12-LOOP, Sudoku-16, ICT-22b |
5 |
à qualifier |
Les 43 chemins
GenAI/Audio/06-Diffusion-SOTA/06-1-AudioLDM-SOTA-Comparison.ipynb
GenAI/Audio/06-Diffusion-SOTA/06-2-HiFiGAN-SOTA-Comparison.ipynb
GenAI/FineTuning/FT-00b-LoRA-Hyperparams-from-scratch.ipynb
GenAI/PostTraining/PT_08_grpo_from_scratch_toy_env.ipynb
GenAI/Texte/TransformerVariants/TV-00b-Attention-Variants-from-scratch.ipynb
GenAI/Video/01-Foundation/01-5-AnimateDiff-Introduction.ipynb
GenAI/Video/02-Advanced/02-1-HunyuanVideo-Generation.ipynb
GenAI/Video/02-Advanced/02-2-LTX-Video-Lightweight.ipynb
GenAI/Video/02-Advanced/02-3-Wan-Video-Generation.ipynb
GenAI/Video/02-Advanced/02-4-SVD-Image-to-Video.ipynb
GenAI/Video/03-Orchestration/03-2-Video-Workflow-Orchestration.ipynb
IIT/ICT-Series/ICT-22b-CausalInterventionEngine.ipynb
ML/DataScienceWithAgents/03-DeepLearning/3.10-Modeles-Generatifs-Diffusion-SOTA.ipynb
ML/DataScienceWithAgents/03-DeepLearning/3.4c-MoE-from-scratch.ipynb
ML/DataScienceWithAgents/03-DeepLearning/3.6c-Modeles-Generatifs-Diffusion-from-scratch.ipynb
ML/DataScienceWithAgents/03-DeepLearning/3.6d-Modeles-Generatifs-Score-SDE-from-scratch.ipynb
ML/DataScienceWithAgents/03-DeepLearning/3.6e-Modeles-Generatifs-Conditionnels-from-scratch.ipynb
ML/DataScienceWithAgents/03-DeepLearning/3.9c-Pruning-From-Scratch.ipynb
ML/DataScienceWithAgents/04-Vision/4.2c-Detection-Anchor-From-Scratch.ipynb
ML/DataScienceWithAgents/04-Vision/4.2e-Detection-FocalLoss-From-Scratch.ipynb
ML/DataScienceWithAgents/04-Vision/4.2f-Detection-SOTA-Torchvision.ipynb
QuantConnect/Python/QC-Py-22-Deep-Learning-LSTM.ipynb
QuantConnect/Python/QC-Py-23-State-Space-Models.ipynb
QuantConnect/Python/QC-Py-24-Autoencoders-Anomaly.ipynb
QuantConnect/Python/QC-Py-25-Reinforcement-Learning.ipynb
QuantConnect/Python/QC-Py-31-Transformer-Training.ipynb
QuantConnect/Python/QC-Py-32-RL-DQN-Trading.ipynb
QuantConnect/Python/QC-Py-33-RL-PPO-Trading.ipynb
QuantConnect/Python/QC-Py-34-RL-SAC-A2C-Trading.ipynb
QuantConnect/projects/Crypto-LSTM-Prediction/research.ipynb
QuantConnect/projects/Ensemble-DLinear-TFT/research.ipynb
QuantConnect/projects/GraphSAGE-MultiAsset-Ranking/research.ipynb
QuantConnect/projects/Mamba-Crypto-Ranking/research.ipynb
QuantConnect/projects/TFT-Crypto-Ranking/research.ipynb
QuantConnect/research/research_rl_grpo.ipynb
QuantConnect/research/research_rl_tactical_overlay.ipynb
RL/rl_12_distributional_rl.ipynb
RL/rl_15_grpo_group_relative_policy.ipynb
RL/rl_6e_grpo_from_scratch.ipynb
Sudoku/Sudoku-16-NeuralNetwork-Python.ipynb
SymbolicAI/Planners/04-NeuroSymbolic/Planners-12-LOOP.ipynb
SymbolicAI/SymbolicLearning/SL-13-Discover-TPR-output.ipynb
SymbolicAI/SymbolicLearning/SL-13-Discover-TPR.ipynb
La boucle attendue — trier avant de corriger
- Trier. Sur son volet, séparer « committe un nombre » de « produit un artefact ». Un notebook génératif qui ne publie aucune métrique n'a pas ce défaut et se clôt en
PAS_CONCERNE.
- Corriger la cause, puis ré-exécuter.
torch.use_deterministic_algorithms(True) (ou a minima cudnn.deterministic=True + cudnn.benchmark=False), puis re-exécution complète. Jamais une réécriture du nombre à la main : éditer une sortie de cellule pour la faire coller est interdit par Stop & Repair (secrets-hygiene règle 6), et ici ce serait doublement faux — le nombre resauterait au passage suivant.
- Rendre un verdict par notebook, y compris
PAS_CONCERNE. Un silence ne se distingue pas d'un oubli.
Effet de bord annoncé
torch.use_deterministic_algorithms(True) lève une exception sur certaines opérations sans implémentation déterministe (index_add, certains scatter, du pooling). Un notebook peut donc échouer là où il passait : c'est le réglage qui révèle le problème, pas une régression introduite par la lane. Passer warn_only=True au premier passage pour inventorier, puis durcir.
Critères d'acceptation
Non-objectifs
Origine : drain 23 PRs de po-2026 · instance prouvée : #16145 · escalade cross-workspace : dashboard global du 2026-09-19T01:21Z (cross-posté CoursIA + CoursIA-2).
Constat — un nombre committé sous une graine qui ne garantit rien
En clôturant son drain de 23 PRs,
po-2026a mesuré que #16145 committait des chiffres non reproductibles : mAP variant de 0,596 à 0,742 à graine identique, par non-déterminisme cuDNN. Corrigé pardeterministic=True; chiffres définitifs 0,673 / 0,707.Sa phrase est ce qui ouvre cette issue : « si d'autres notebooks GPU de la flotte commettent des métriques sans flag déterministe, la même classe de faux attend ».
La classe de défaut n'est pas « le chiffre est faux ». C'est : le notebook pose une graine, donc il a l'air reproductible, et rien ne le garantit. Un lecteur — étudiant, reviewer, ou nous-mêmes au cycle suivant — lit
manual_seed(42)et en conclut que le nombre re-sortira. Sur GPU, sans réglage de déterminisme, c'est faux.Mesure firsthand (
mainc818f6abce,MyIA.AI.Notebooks/**.ipynb, hors_archive).cuda(),device="cuda",to(device),torch.device)manual_seed/seed_everything/np.random.seed)Reproduction : un
os.walksurMyIA.AI.Notebooks, trois expressions régulières, exclusion de_archive.Deux honnêtetés, sans lesquelles ces chiffres mentent
cudnn.benchmarkcomme une mention — orbenchmark=Trueest souvent la cause du non-déterminisme, pas le remède. Trois notebooks en parlent ; combien sont protégés n'est pas mesuré ici.Répartition par volet
Tableau de volets, pas un dispatch nominatif : aucune affectation n'est présumée, aucun
[CLAIMED]n'est posé. Une lane réclame son volet sur cette issue.Python/QC-Py-22/23/24/25/31/32/33/34,projects/*/research.ipynb,research/research_rl_*03-DeepLearning,04-Vision06-*, Video01/02/03, TexteTV-00b, FineTuning, PostTrainingrl_6e,rl_12,rl_15SL-13x2,Planners-12-LOOP,Sudoku-16,ICT-22bLes 43 chemins
La boucle attendue — trier avant de corriger
PAS_CONCERNE.torch.use_deterministic_algorithms(True)(ou a minimacudnn.deterministic=True+cudnn.benchmark=False), puis re-exécution complète. Jamais une réécriture du nombre à la main : éditer une sortie de cellule pour la faire coller est interdit par Stop & Repair (secrets-hygienerègle 6), et ici ce serait doublement faux — le nombre resauterait au passage suivant.PAS_CONCERNE. Un silence ne se distingue pas d'un oubli.Effet de bord annoncé
torch.use_deterministic_algorithms(True)lève une exception sur certaines opérations sans implémentation déterministe (index_add, certainsscatter, du pooling). Un notebook peut donc échouer là où il passait : c'est le réglage qui révèle le problème, pas une régression introduite par la lane. Passerwarn_only=Trueau premier passage pour inventorier, puis durcir.Critères d'acceptation
CORRIGE_ET_REEXECUTE/PAS_CONCERNE(aucune métrique committée) /BLOQUE:<raison>(op non déterministe, GPU indisponible).CORRIGE_ET_REEXECUTEporte le flag et des sorties issues d'une re-exécution fraîche — jamais d'édition manuelle de sortie.BLOQUEnomment l'opération fautive, pas « ça ne marche pas ».Non-objectifs
Origine : drain 23 PRs de
po-2026· instance prouvée : #16145 · escalade cross-workspace : dashboardglobaldu 2026-09-19T01:21Z (cross-postéCoursIA+CoursIA-2).