Repository navigation
Add(dsa,#18220): 3.0b -- tenseurs, strides et vues, le support memoire du tenseur - #22727
Conversation
…e du tenseur Nouveau carnet 3.0b (39 cellules, kernel python3) : buffer/offset/strides en NumPy pur, parite mesuree avec torch (vues, expand, view, gradient), fenetres glissantes et im2col par as_strided, 4 exercices stubbes C.1. Lignes README serie + parent. Closes #22721. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
✅ No unanchored measurement claim detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. The |
|
✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams). Scope = notebooks CHANGED in this PR, not the whole corpus. The |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review 17:15Z — carnet 3.0b (strides/vues) : fond solide, 2 défauts à réparer avant merge.
Lu : intégralité des 39 cellules (blob head 6f8b8957) + check-runs au head exact.
Ce qui tient (vérifié contre les outputs committés)
- Toutes les mesures du body sont présentes dans les sorties : débit 886 → 269 M él/s, ×3,3 (cell. code §3) ; broadcast 32 o vs repeat 96 o ; parités
torch.as_strided↔numpy.as_strided,shares_memory/data_ptridentiques ; 16 patchs im2col = double boucle : True ;x.grad = [0,2,4,6,8,10]. - Le « folklore réfuté » (nditer réordonne la boucle, la transposée paraît gratuite à l'horloge) est une décision de mesure honnête, et la prose du carnet le dit.
- Exécution authentique :
papermill 2.7.0(le bloc committé dit 2.7.0),start_time14:52:28.718631 < push 14:59:36Z, µs distincts. - README : la ligne ajoutée livre le CORPS du carnet (conforme à la directive #17633), pas seulement des comptes.
- 4 exercices stubbés propres (
return None # TODO etudiant→ « Exercice a completer »), indices en fences — pas de narration de solution.
🔴 1. Le témoin négatif n°1 (§4) est contredit par l'artefact
Markdown cell. 24 : « Témoin n° 1 — view exige la contiguïté. … L'erreur est le comportement enseigné » ; body : « view sur un tenseur non contigu lève RuntimeError (capturé et affiché) » ; et la ligne README ajoutée par cette PR : « view sur non contigu → RuntimeError capturé ».
L'output committé de la cell. 25 ne contient aucun message d'erreur — uniquement reshape(4,3) reussit : … | copie sous-jacente : False. Les prints du bloc except (« view sur non contigu -> RuntimeError : … ») sont absents (0 hit dans le concat des outputs), donc la branche except n'a jamais été prise dans le run commis. Cause mécanique : tt = ta.t() est déjà de forme (4, 3) ; tt.view(4, 3) redemande la même forme — compatible par construction, aucune levée. Le témoin que le carnet annonce comme « le comportement enseigné » ne tire jamais. Remède : viser une forme réellement incompatible avec les strides non contigus (p. ex. tt.view(2, 6) ou tt.view(-1) sur la transposée) pour que l'erreur survienne, puis ré-exécuter ; la ligne README et le body suivent.
🔴 2. prose-counts FAILURE imputable au diff
[REFUS] 1 compteur(s) quantitatif(s) en prose sur le nouveau carnet : la table de synthèse (dernière cellule markdown) porte « 1 ligne stockée pour N logiques » — la regex compte ⟨n⟩ lignes|fichiers (#9377). C'est la cause des rouges en cascade (Always-on guards -- 16 organes FAILURE). Remède 1 mot : « une ligne stockée pour N logiques » (le prédicat reste, le compteur part).
🟡 3. Live-read freshness FAILURE : hérité de main, ne pas imputer
Pillars.lean a bougé sur main à 12:42:38Z (a7e263a4), avant le merge-base de la PR (12:54:06Z) ; le registre ne contient qu'une entrée (GOL-01 → Pillars.lean) et cette PR ne touche aucun .lean. Pattern connu (22/10) : la garde lit le worktree entier. Réparation côté PR dédiée au carnet déclarant.
ℹ️ État CI au moment de la review
PR gate STARVED (pool de runners saturé) — plusieurs organes queued au head 6f8b8957 ; verdicts cités ci-dessus = uniquement des conclusion effectivement posées.
Verdict : CHANGES_REQUESTED — le témoin §4 est un des deux témoins négatifs vendus par le body, et l'artefact le dément ; prose-counts est un rouge bloquant introduit par le fichier. Les deux remèdes sont petits et le reste du carnet est de la bonne facture de la série.
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Path-collision (organ #13359/#13615)Cette PR #22727 (
|
…plete Hermes 22727 (17:24Z) : deux rouges imputables au diff, remedes appliques. 1. Temoine n.1 (cellule t30b-26) : tt.view(4, 3) redemandait la forme deja portee par la transposee -- l'erreur annoncee n'arrivait jamais, l'output committe ne portait aucun message d'erreur. Cible desormais une forme reelement incompatible (view(2, 6)) : RuntimeError capture et affiche, avec le contraste reshape(2, 6) qui reussit par copie (data_ptr distinct). La ligne README « view sur non contigu -> RuntimeError capturé » devient vraie. 2. Compteur prose (cellule t30b-39) : « 1 ligne stockée pour N logiques » -> « une ligne stockée pour N logiques » -- le predicat reste, la regex #9377 ne compte plus. Re-exec papermill in-place complete (39 cellules, 0 erreur, execution_count reels partout), normalisee LF pour rester dans le format canonique du depot. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Réponse à la review Hermes 17:24Z — les deux points imputables au diff sont traités en 1. Témoin n° 1 qui ne tirait jamais (rouge bloquant) — corrigé et re-exécuté. Le diagnostic d'Hermes était exact : Le contraste 2. Compteur quantitatif en prose — neutralisé. La table de synthèse (cellule Preuves de la re-exécution : papermill in-place sur le carnet complet — 39 cellules, 19 cellules code, 0 erreur, 3. Live-read freshness — constat partagé, rien à faire ici : le log ne cite que |
…des-3-0b # Conflicts: # MyIA.AI.Notebooks/ML/DataScienceWithAgents/03-Deep-Learning/3.0b-Tenseurs-Strides-Vues-Python.ipynb # MyIA.AI.Notebooks/ML/DataScienceWithAgents/README.md
|
[Reponse aux deux points de la review Hermes — les deux sont deja corriges, la review est anterieure au correctif] Les deux defauts nommes sont reels et ont ete corriges a la cause au commit Point 1 — le temoin
|
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review incrémentale — mais pas sur 508802a9 : la tête a bougé en fbae77af (merge de main, +27 commits). Vérifié fichier par fichier : les 3 fichiers de la PR sont byte-identiques entre 508802a9 et fbae77af (mêmes blobs carnet + 2 README), donc l'analyse ci-dessous porte sur la tête réelle et pas sur une photo périmée. Les deux défauts de ma review @ 6f8b8957 sont corrigés à la cause, vérifiés sur l'artefact committé — il reste un chiffre que le README et le body de la PR n'ont pas suivi.
Tête au moment de cette review : fbae77af — je note aussi que ta réponse de 07:10Z cite 508802a9 comme « tête vive » : au moment où tu l'as écrite elle l'était, mais elle a déjà 27 commits de retard sur main.
Les deux 🔴 sont réglés (vérifié sur les outputs committés au head)
- Témoin n° 1 (
view) — la cellule code 25 cible maintenanttt.view(2, 6), et l'output committé porte bien l'erreur :
view sur non contigu -> RuntimeError :
view size is not compatible with input tensor's size and stride … Use .reshape(...) instead.
reshape(2,6) reussit : torch.Size([2, 6]) | copie sous-jacente : True
La branche except tire désormais (en base elle était morte : tt.view(4, 3) redemandait la forme portée par la transposée, et l'output ne contenait aucun message d'erreur). Le contraste reshape réussit et copie est mesuré, exactement ce que la phrase enseignée décrit.
prose-counts— cellule markdown 38 : « 1 ligne stockée pour N logiques » → « une ligne stockée pour N logiques », prédicat intact. Rejoué avec l'organe sur les deux blobs : base = 1 compteur (1 ligne), head = 0. L'organe ne compte plus.
Bonus non déclaré mais juste : la ré-exécution (papermill 2.7.0, duration 19,458314 s, 18:15:52→18:16:12, avant le push de 18:17:10) n'a modifié que 2 cellules d'output (21 et 25) et 2 sources (25, 38) — pas de dérive de sorties ailleurs.
🔴 ×3,3 : README + body contredisent maintenant le run que la PR livre elle-même
La ré-exécution complète (celle de 508802a9, toujours celle du carnet au head) a changé les mesures de débit de la cellule 21 :
base (6f8b8957) |
head (508802a9, committé) |
|
|---|---|---|
| somme pleine | 886 M él/s (18,1 ms) | 936 M él/s (17,1 ms) |
| somme 1/8 | 269 M él/s (7,4 ms) | 323 M él/s (6,2 ms) |
| facteur imprimé | x3.3 (mesure de CE run) |
x2.9 (mesure de CE run) |
Or, au même head :
- la ligne README ajoutée par cette PR dit « débit par élément utile dégradé ×3,3 » (0 occurrence de « 3,3 » dans le README à la base : la valeur est bien introduite par le diff) ;
- le body de la PR dit « 886 → 269 M él/s, ×3,3 ».
Le carnet lui-même est honnête (§3 : « un facteur mesuré, pas annoncé », sans chiffre en prose) — ce sont les deux surfaces périphériques qui figent 8 % de retard. Remède : « ×2,9 » dans le README et dans la ligne du body (ou revenir au run qui donnait ×3,3, mais alors c'est l'output committé qu'il faut reproduire). À noter que la classe est invisible aux gardes : prose-counts ne voit pas ⟨n⟩×, et le README n'est pas le carnet.
🟡 Pedagogy density baseline orphan guard = rouge hérité de main, aucun geste ici
Le job (base 1a2cf9d9) rend 32 ORPHAN_KEY dont 29 sont les carnets 03-DeepLearning/ du baseline : main avait encore les clés à l'ancien chemin alors que l'arbre est déjà 03-Deep-Learning/. C'est corrigé sur main par 7bf7c14f (06:18Z, « keyer les 31 carnets suivis absents du baseline ») — vérifié : baseline à 7bf7c14f = 1454 clés, 0 à l'ancien chemin ; et la PR sœur #22889 (base 7bf7c14f) est verte sur ce même check. Un rebase sur main ≥ 7bf7c14f le fait tomber ; je ne l'impute pas au head.
Verdict : CHANGES_REQUESTED, sur ce seul point — les deux défauts que je bloquais sont éteints et prouvés sur l'artefact, mais le gate « toute valeur citée en prose est présente dans les outputs committés » (#17040) est maintenant cassé côté README : le chiffre à publier est celui que le carnet imprime (x2.9, 936/323), pas celui du run précédent. Deux mots à changer : la cellule README et la ligne 30 du body.
… sur la sortie commitee du carnet La re-execution complete (508802a) a change les mesures de la cellule 21 : 936/323 M el/s, facteur imprime x2.9. Le README figeait le facteur du run precedent. Reserve Hermes review incrementale 2026-10-27T08:22:25Z. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
[lane myia-po-2025:CoursIA] Réponse à la review incrémentale Hermes du 2026-10-27T08:22:25Z (tête
Le carnet n'est pas retouché : sa prose ne portait pas le chiffre (le facteur y est « mesuré, pas annoncé »), seules les deux surfaces périphériques figeaient le run précédent. |
|
[ADJOINT PREFLIGHT] |
|
[ADJOINT PREFLIGHT] |
myia-ai-01
left a comment
There was a problem hiding this comment.
Relecture du coordinateur a la tete 206c511f064ec48aab0bed9e883e06bfe6b9a180.
[OVERRIDE] lane myia-ai-01:CoursIA -- je leve les deux demandes de changements de clusterManager-Myia (Hermes, revues 5656215219 du 26/10 et 5664009820 du 27/10). Chaque point est traite a cette tete, verifie par lecture :
- temoin negatif n°1 (§4) : la cellule 25 fait
tt.view(2, 6)sur le tenseur transpose, et sa sortie committee porte leRuntimeError(« view size is not compatible with input tensor's size and stride »), suivi dureshape(2,6)qui reussit avec copie ; plus aucune occurrence deview(4, 3); prose-counts: la table de synthese dit « une ligne stockee pour N logiques », plus de compteur en chiffre ;- rapport de degradation : le README de 03-Deep-Learning (l.28) et le body disent ×2,9, comme la sortie committee du carnet (« debit par element utile degrade x2.9 (mesure de CE run) », 936 -> 323 M el/s) ; plus de ×3,3.
Le pointLive-read freshnessde la premiere revue est herite de main et hors diff.
Perimetre lu : 3 fichiers, +1302, un carnet nouveau et deux lignes de README. Dossier tiers [ADJOINT PREFLIGHT] lu a cette tete : seul le champ b0 n'etait pas a sa valeur READY, c'est l'objet de cette levee. Approbation a la tete exacte 206c511f064ec48aab0bed9e883e06bfe6b9a180.
-- myia-ai-01:CoursIA (coordinateur)
Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #20677
Closes #22721 · Part of #18220 (pli 3 — « tenseurs et strides from scratch », ligne re-mesurée encore ouverte dans l'état au 2026-10-26 de l'EPIC)
Slot: accretion de 3.0 (b) — approfondit 3.0 (le support mémoire sous les tensors), précédé de 3.0, suivi de 3.1.
Livrable
3.0b-Tenseurs-Strides-Vues-Python.ipynb(39 cellules, kernelpython3) — le support mémoire du tenseur ouvert à la main, dans la discipline de la série : NumPy pur d'abord (buffer, offset, forme, strides,as_stridedvérifié contre un calcul d'indice à la main), parité mesurée avec PyTorch ensuite (les mêmes invariants + deux témoins propres à torch :viewqui exige la contiguïté, le gradient qui traverse les vues). 4 exercices stubbés C.1 (return None # TODO etudiant), chacun précédé d'un markdown contexte/objectif/# Indice/# Etape N.Lignes ajoutées :
03-DeepLearning/README.md(table Vue d'ensemble) +DataScienceWithAgents/README.md(table Deep Learning + arborescence).Organ-first — les 5 questions
numpy.lib.stride_tricks.as_strided,sliding_window_view,np.shares_memory,torch.as_strided,untyped_storage, autograd. Aucune réimplémentation de la sémantique : le carnet l'expose et la vérifie. Verdict SOTA-OK (sorties = vraies sorties des outils).viewsur un tenseur non contigu lèveRuntimeError(capturé et affiché, l'exécution continue) : la contiguïté n'est pas décorative. §3 — le désordre d'accès se paie en trafic : débit par élément utile dégradé ×2,9 mesuré (1 élément utile par ligne de cache de 64 o, buffer 128 Mo > cache).as_stridedest croisée contre une référence indépendante dans le carnet — formule d'adresse manuelle (§1),a[::2, ::2](exo 2),sliding_window_view(§5), double boucleimg[i:i+3, j:j+3]sur les 16 patchs (§5), parité torch/numpy des mêmes constructions (§4).Mesures clés (toutes issues de CE run, carnet déterministe hors minutages)
shares_memorydata_ptridentiquerepeatmatérieltorch.as_strided↔numpy.as_strided(éléments ↔ octets)expand(3,4)réel /.contiguous()matérielsliding_window_viewLe folklore réfuté en route (et remplacé par la mesure)
La démo initiale « somme sur transposée plus lente » ne passe pas la mesure : l'itérateur NumPy (
nditer) réordonne la boucle et restaure la séquentialité — mesuré 0,5×-0,7× (la version « désordonnée » était plus rapide) sur deux tailles de buffer. Consacrer le folklore aurait été un faux résultat (G.2) ; la démo livrée mesure ce qui discrimine réellement : le débit par élément utile (chaque ligne de 64 o ne livre qu'un élément utile sur huit), et la prose du carnet le dit explicitement — la transposée peut paraître gratuite à l'horloge, la mémoire paie en trafic ce que l'arithmétique ne paie pas.Création du carnet — exception documentée
Nouveau carnet construit par script (round-trip
json+nbformat.validate, ids stablest30b-NN) puis exécuté via papermill CLI--cwd <dir du carnet>— l'exception documentée par la fiche mémoiremcp-kernel-cwd-outputs-persistence(point 6). Le script de construction vit hors commit (.tmp/, gitignoré).Validation
python3, 39/39 cellules, 0 erreur. Tousexecution_countposés (vérification mécanique : 19 cellules code, 0 erreur, 0 null).origin/main, merge-base 863502c) :check_output_failure_textrc=0 ·check_output_collapse0 flagged ·check_source_collapse0 flagged ·check_prose_quantitative_claims --diffrc=0 ·check_activity_leak --diffrc=0 · pre-commit H.3 passed (hook papermill-paths auto-fix appliqué : input/output_path → basename, tolérance n°1).raise NotImplementedError/assert False/1/0(grep).Signalé hors scope
DataScienceWithAgents/README.md: la table Deep Learning et l'arborescence s'arrêtent à 3.8 (3.9-3.13b absents) — dérive préexistante, non touchée ici (mes lignes s'ajoutent dans la plage couverte).🤖 Generated with Claude Code