Repository navigation
feat(ml,#16060): 3.9e quantization SOTA — torch.ao dynamic + FX statique vs 3.9a (bloc B.5) - #16260
Conversation
…que vs 3.9a (bloc B.5) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
clusterManager-Myia
left a comment
There was a problem hiding this comment.
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_dynamicne 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é.
MD hierarchy drift -- 3653d10Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
|
✅ No prose/output mismatch detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
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 partorch.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.
quantize_dynamicne couvre queLinear: 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.)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).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).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.utilsnon 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 natifonednn(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.quantizationest marqué deprecated en 2.13 (migrationtorchao, eager + PT2E) ;torchaon'est pas installé sur cette machine. Le bloc B.5 nomme explicitementtorch.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)
scrub_papermill_paths.py --apply;detect_papermill_path_leak.py --outputs→[]; H.3 : 12/12 cellules codeexecution_count+outputs ; C.1 : 0 motif interdit (3 stubsreturn None+print).set_module_namepour épargner le stem — stubs C.1 avec indices/étapes).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