Skip to content

Metriques GPU non reproductibles : 43 notebooks posent une graine sans reglage de determinisme #16795

Description

@myia-ai-01

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

  1. 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.
  2. 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

  1. 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.
  2. 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.
  3. 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

  • Chacun des 43 notebooks porte un verdict écrit : CORRIGE_ET_REEXECUTE / PAS_CONCERNE (aucune métrique committée) / BLOQUE:<raison> (op non déterministe, GPU indisponible).
  • Tout notebook classé CORRIGE_ET_REEXECUTE porte le flag et des sorties issues d'une re-exécution fraîche — jamais d'édition manuelle de sortie.
  • Les notebooks classés BLOQUE nomment l'opération fautive, pas « ça ne marche pas ».
  • Le compte des trois classes est publié et somme à 43.
  • Un garde est proposé (ou explicitement écarté avec motif) pour que la classe ne revienne pas : un check qui signale une graine posée sans réglage de déterminisme dans un notebook GPU qui committe un nombre.

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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions