Skip to content

feat(ml,#16060): 3.9e quantization SOTA — torch.ao dynamic + FX statique vs 3.9a (bloc B.5) - #16260

Merged
jsboige merged 1 commit into
mainfrom
feature/16060-39e-quant-sota
Sep 15, 2026
Merged

jsboige merged 1 commit into
mainfrom
feature/16060-39e-quant-sota

Conversation

@jsboige

@jsboige jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2026:CoursIA-2 — prev: DEEP/notebook-python #16249

See #16060 (bloc B.5 — A.1 #16127 OPEN, A.2 livré par 3.9a #16094 MERGED, A.3/A.4 couverts par #16190/#16192/#16219 OPEN ; B.6 dépend du merge A.3)

3.9e — Quantification SOTA : la même INT8, par l'écosystème torch.ao

Nouveau notebook MyIA.AI.Notebooks/ML/DataScienceWithAgents/03-DeepLearning/3.9e-Compression-Quantization-SOTA.ipynb (29 cellules, 12 code) : le pendant industriel de 3.9a (bloc A.2, mergé) — la même physique de la quantification INT8, cette fois exécutée par torch.ao.quantization, l'API SOTA de PyTorch.

Méthode : une seule variable expérimentale

Même terrain que 3.9a, protocole repris à l'identique : ResNet-20 (~271 k poids), CIFAR-10, SGD momentum lr 0.08 cosine, seed 42, batch 256. Seule différence : l'auteur de la quantification — la main de 3.9a ou l'écosystème.

Recette CPU : 3.9a a été committé sur GPU (40 epochs, torch 2.8, sorties device=cuda). Ce run s'exécute sur CPU — avec exactement la recette réduite que le code de 3.9a applique quand aucun GPU n'est présent (EPOCHS = 6 if cpu, cellule 2 de 3.9a). Les repères 3.9a cités dans le notebook (0.9019 témoin, 0.9017 static min/max, 0.9012 KL) sont labellisés « outputs committés de 3.9a, run GPU 40 ep » partout où ils apparaissent ; chaque écart de ce notebook se mesure contre son propre témoin FP32.

Ce que le notebook mesure (exécution réelle committée)

Témoin FP32 (CPU, 6 epochs) : 0.7896.

  1. quantize_dynamic ne couvre que Linear : sur ResNet-20, 1 couche sur 22 (le fc, 640 poids = 0,18 % du réseau, 1,9 Ko économisés) — exactitude 0.7898 (+0.0002). Le mot « dynamique » ne garantit pas la couverture ; la liste des types éligibles, si. (Contraste honnête avec le « dynamique » de 3.9a, qui posait des hooks sur les convs.)
  2. FX graph mode statique en 4 appels (prepare_fx → calibration 8 batchs → convert_fx) : fusion conv-bn-relu (10 modules), échelles per-channel symétrique, packing — MinMax 0.7900 (+0.0004), Histogramme 0.7901 (+0.0005) (cousin moteur de la KL de 3.9a §6 : les deux observateurs à égalité, comme 3.9a le constatait entre KL et min/max).
  3. Taille et vitesse : les trois promesses tiennent sur ce run — taille 4,0× plus petite (1071 → 267 Ko state_dict), exactitude intacte, latence 1,8× plus rapide (21,4 → 12,1 ms médiane batch 64, moteur onednn) — les kernels INT8 s'amortissent sur les 22 couches. Garde-fous mesurés : le facteur dépend du moteur/profil (pas le 10× d'un DSP), et 3.9a ne pouvait pas mesurer la latence (ses arrondis étaient simulés en flottants, sans kernels INT8).
  4. Récapitulatif écosystème vs main : ~15 lignes contre ~150 ; la fusion et les kernels offerts ; la main garde le contrôle (percentile, INT4, couche par couche).

Réparation d'environnement (règle F), documentée dans le notebook

Sous torch 2.13.0+cpu, get_native_backend_config() échoue par bug d'import paresseux du paquet (backend_config.utils non chargé : AttributeError: module ... has no attribute 'utils'). Réparé par import explicite du sous-module — vérifié par smoke test (194 patterns de fusion construits) — et documenté dans la cellule concernée. Aucun contournement : la chaîne FX tourne sous le moteur natif onednn (seul engine du build CPU Windows ; fbgemm/qnnpack absents — constat d'environnement, pas un choix de dégradation).

Note d'écosystème mesurée : torch.ao.quantization est marqué deprecated en 2.13 (migration torchao, eager + PT2E) ; torchao n'est pas installé sur cette machine. Le bloc B.5 nomme explicitement torch.quantization/torch.ao — l'API sous laquelle 3.9a a été écrit et que ce bloc spécifie. La migration est pointée en « Pour aller plus loin », bannières filtrées pour la lisibilité, aucun appel contourné.

Validation (5 points)

  1. Scope : 1 fichier créé, aucun autre fichier touché. Résiduel assumé : ligne README de la série non ajoutée (atomique ; catalogue = automatisation).
  2. Validation automatisée post-fix : Papermill end-to-end 29/29 cellules, 0 erreur ; scrub_papermill_paths.py --apply ; detect_papermill_path_leak.py --outputs → [] ; H.3 : 12/12 cellules code execution_count+outputs ; C.1 : 0 motif interdit (3 stubs return None+print).
  3. Cohérence pédagogique : structure 3.9a mirrorée (contrat à 4 questions, « Lecture » après chaque cellule interprétée, 3 exercices progressifs — QAT, observateur percentile, set_module_name pour épargner le stem — stubs C.1 avec indices/étapes).
  4. Exécution réelle : outputs committés = sortie Papermill de ce run CPU (tableaux et métriques ci-dessus en proviennent).
  5. Regression check : nouveau fichier, zéro symbole existant touché ; grep 3.9e → aucun référencement préexistant.

Diagnostic dérive

Nouveau notebook : n/a. Les valeurs 3.9a citées sont celles de ses outputs committés, sourcées et labellisées run/matériel dans le tableau.

🤖 Generated with Claude Code

…que vs 3.9a (bloc B.5)

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)

@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] Review #16260 (bloc B.5 de #16060) — notebook 3.9e, 1041+, 1 fichier.

Vérifications réelles :

  • Outputs authentiques sur 12/12 cellules code : timings d'entraînement variables (79.6–90.0 s/epoch), pas de prints statiques. Garde CI H.4 (outputs-required) PASS, dans le périmètre (workflow notebooks, fichier = notebook).
  • Cohérence arithmétique vérifiée : 1071/267 Ko = 4.0x ✓ ; 21.4/12.1 ms = 1.77x ✓ ; deltas exactitude 0.7898−0.7896 = +0.0002 ✓, 0.7900 = +0.0004 ✓, 0.7901 = +0.0005 ✓.
  • Conformité au body : 29 cellules / 12 code annoncées = constatées ✓. Structure fidèle au protocole 3.9a (une seule variable expérimentale : le moteur d'export).
  • Justesse conceptuelle : quantize_dynamic ne ciblant que le fc (1/22 modules, 0.18% des poids) sur un convnet est exact et pédagogiquement bien amené — contraste honnête avec le 4.0x du FX statique.
  • Les 3 cellules « TODO étudiant » (Exercice a completer, exactitude None) sont le pattern pédagogique assumé, non du code inachevé.
  • Security scan : clean. Pas de contamination rebase (1 fichier added).

CoursIA : verdict en COMMENT (cap #15511 tenu). Relais vers siège qualifiant effectué.

@github-actions

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- 3653d10

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion f8bff4e re-scannee.
Nouveaux defauts imputables au diff :

reference: merge base f8bff4eb75c41c374dcbbb2038990cf534f13837 re-scanned (0 of 1 changed notebook(s) existed at base; others are additions; 0 had findings at base)
  +19  MyIA.AI.Notebooks/ML/DataScienceWithAgents/03-DeepLearning/3.9e-Compression-Quantization-SOTA.ipynb
        +15 H1-DEEP
        +3 HINT-AS-HEADING
        +1 MULTI-H1

=== drift: +19 across 1 notebook(s), 0 burned down ===

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 7.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 8.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 12.8s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 8.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 6.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 5.2s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 58.0s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 7.6s

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

@jsboige
jsboige merged commit ab4736c into main Sep 15, 2026
78 of 79 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants