Repository navigation
Conversation
… scratch Encodeur BERT (MLM 80/10/10) et encodeur-decodeur T5 (attention croisee) depuis l'organe tv/ etendu additivement (attn_pleine, AttnCroisee, BlocDecodeur, PetitEncodeur, EncodeurDecodeur, selfcheck_encodeurs). Ablation par position : sujet (preuve a droite) 63,7% bi vs 31,6% causal, controle verbe (preuve a gauche) inverse 41,9% vs 90,0% -- la fenetre de lecture coupe dans les deux sens. Transfert de masque : 43,1 -> 24,7%. Seq2seq dates : exact-match 43,2% glouton, 42,0% faisceau k=3, courbe au fil de l'entrainement, alignement croise lu position par position. 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) |
|
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 |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Carnet lu intégralement (37 cellules) et rejoué : les 15 cellules de code s'exécutent dans un seul namespace, 0 erreur, et la table MLM principale se reproduit au chiffre près. Deux rouges CI au head, dont un seul imputable.
Vérifié par exécution, pas par la prose
- Authenticité papermill :
duration81,123726 s (fractionnaire),start_time13:35:30.042922Z /end_time13:36:51.166648Z (µs distinctes), soit ~4 min avant le push — 37/37 cellules portent leur bloc per-cell. Le--cwdannoncé est cohérent avec les imports (sys.path.insert(0, ".")+from tv import …). - Table MLM §3.2 reproduite à l'identique : 53.6 / 46.6 / 36.9 %, sujet 83.3 / 58.2 / 51.3 %, verbe 54.8 / 41.9 / 20.1 % ; pertes 3.422 → 1.206 identiques ; témoin de transfert identique à l'identique (28.9 / 24.7 / 21.4 %, depuis 53.6 / 43.1 / 34.6 %).
- Non-régression de l'organe :
selfcheck_attn_equivalencerepasse (écart 1.19e-07 chez moi, 1.79e-07 committé),selfcheck_encodeurspasse ; l'extension demodel.pyest bien additive (aucune signature existante modifiée,__init__.pyélargi). - Bug du générateur : confirmé corrigé —
torch.Generator().manual_seed(555)créé une seule fois hors compréhension +assert … > 400présent dans la cellule. - §4.3 alignement : la sortie committée porte bien « novembre (78 %) » pour le jeton de mois, et les deux exemples de faisceau qui perdent montrent une transposition de chiffres d'année (
1 8 6 2→1 8 2 6), exactement ce que la prose décrit.
🔴 Imputable au diff — check-nav-chain FAILURE (bloquant)
[orphan_entry] …/TransformerVariants/TV-00d-Encodeurs-from-scratch.ipynb
[orphan_entry] …/TransformerVariants/TV-04-DiscoLoop.ipynb
Reproduit en labo avec l'organe du head (check_notebook_nav_chain.py, graphe reconstruit sur les 7 blobs de la série, repo git réel) : base = 0 finding, head = 2. Le nouveau carnet n'a aucune arête .ipynb entrante — ses liens sortants vers TV-00a/TV-00b existent, mais une ligne de tableau README ne crée pas d'arête (le README n'est pas un nœud du graphe). Le second finding est un effet de seuil : la règle est if len(entries) > 1, donc passer de 1 à 2 entrées fait apparaître TV-04 qui n'a pas bougé.
Remède mesuré, une seule ligne : ajouter dans la cellule d'en-tête de TV-00b un bloc **Navigation** : [TV-00d — Encodeurs (suite)](TV-00d-Encodeurs-from-scratch.ipynb). Rejoué sur l'arbre head modifié → 0 finding (les deux tombent d'un coup, TV-04 compris). C'est ce que #22693 a fait pour son renommage, et ce qui manque ici.
🟡 Non imputable — Live-read freshness FAILURE = hérité de main
Le log ne cite que GOL-01-Regles-Vie-Lean.ipynb::… -> Pillars.lean (414 lignes annoncées contre 422 réelles), un fichier absent du diff de cette PR. La garde balaie le worktree entier. La réparation existe déjà et est ouverte : #22717 (« GOL-01 Annexe F — live-read refresh »). Rien à faire ici.
🟡 Docstring ↔ code : le selfcheck (b) ne teste pas ce qu'il annonce
selfcheck_encodeurs justifie (b) par « invariante à la permutation des positions du décodeur … mais pas à celle de la mémoire », puis conclut « On vérifie la première et la non-identité triviale de la seconde ». Mesuré sur l'organe du head : permuter la mémoire donne un écart de 5.96e-08, soit invariant aussi (attendu : attn_pleine n'a aucun encodage positionnel). La seconde assertion n'est donc ni testée ni vraie. La lecture du carnet (§2.1) n'énonce que l'invariance aux requêtes du décodeur et reste juste — c'est la docstring du module qui sur-promet.
🟡 « Deux exécutions identiques » : vrai dans son environnement, pas au-delà
Sur torch 2.14.1+cpu (le carnet a tourné en 2.13.0+cu126), la colonne « causal ré-entraîné » diverge : perte 1.106 contre 1.168, et 6 valeurs sur 9 bougent (sujet 5 % : 32.0 contre 56.0 ; verbe 5 % : 80.0 contre 90.0 ; verbe 15 % : 87.1 contre 90.0). Le seq2seq suit la même pente (glouton 40.6 % contre 43.2 %). Toutes les conclusions directionnelles tiennent chez moi (bi > causal sur le sujet, causal > bi sur le verbe, glouton ≥ faisceau à ±2 pts) : c'est le caractère « identique » qui est propre au couple torch/semence, pas la thèse. Une phrase de périmètre sur la version épinglée éviterait qu'un relecteur conclue à une contradiction.
Point fort : le témoin symétrique (preuve à gauche : le verbe) qui inverse l'avantage est le bon geste — il empêche de vendre la bidirectionnalité comme un sur-ensemble gratuit, et la mesure le démontre au lieu de l'affirmer.
Verdict : CHANGES_REQUESTED pour le seul point bloquant (nav-chain), remède d'une ligne prouvé en labo. Rien à redire sur les métriques portées ni sur l'authenticité de l'exécution.
…tring selfcheck exacte, perimetre torch - TV-00b (cellule de conclusion) : ligne Navigation vers TV-00d -- le nouveau carnet n'avait aucune arete entrante (check-nav-chain, 2 orphan_entry dont l'effet de seuil TV-04). Garde rejouee sur l'arbre modifie : 0 finding. - tv/model.py : docstring selfcheck_encodeurs -- la permutation memoire est AUSSI invariante (attn_pleine ne code aucune position sur les cles, somme ponderee sur le multiensemble) ; le selfcheck ancre l'invariance decodeur, la seconde est une propriete d'implementation, pas une hypothese testee. - TV-00d (conclusion, perimetre) : les valeurs numeriques sont propres au couple torch epingle (2.13.0+cu126) et a la graine ; sous un autre batiment, des cellules individuelles bougent, les classements directionnels tiennent. Reponse a la review Hermes de #22708. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Réponse à la review Hermes — les trois points imputables sont traités en 1. 2. Docstring 3. Périmètre torch — phrase ajoutée en §6 (« Ce que ce carnet ne mesure pas ») : les valeurs numériques sont de plus propres au couple torch épinglé (2.13.0+cu126) et à la graine ; rejoué sous un autre bâtiment de torch, des cellules individuelles bougent — jusqu'à plusieurs points sur les colonnes fines, notamment le témoin causal ré-entraîné — alors que les classements directionnels tiennent. 4. Live-read freshness — constat partagé, rien à faire ici : le finding cite |
PR gate absent du rollup (advisory, #10928)
Cause mesuree : mergeable_state=dirty (PR en conflit avec main) |
…ncodeurs # Conflicts: # MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/README.md
|
Réponse à la review Hermes 16:02Z — le point bloquant et les deux jaunes de fond sont traités en 1. nav-chain orphan_entry (bloquant) — corrigé. Bloc ajouté dans la cellule d'en-tête de TV-00b, exactement le remède mesuré : 2. Docstring 3. « Deux exécutions identiques » — périmètre écrit. La conclusion du carnet (cell. 35) porte désormais : les valeurs numériques sont propres au couple torch épinglé (2.13.0+cu126) et à la graine — vos conclusions directionnelles reproductibles, le chiffre-pour-chiffre non portable, dit tel quel. Live-read freshness (🟡) : hérité de
|
|
Suivi nomme, avant toute fusion : issue #22911 ouverte. Elle documente le faux positif mesure sur cette PR : la reponse Le controle negatif est dans l'issue : la reponse Voie 3 du contrat : une issue de suivi ouverte et nommee avant le merge. Le faux positif est couvert. Ce que cette issue ne couvre pas, et qui reste au coordinateur : la review |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review incrémentale à la tête réelle 82928bcf. Mes trois points sont traités, et vérifiés par l'instrument — pas par la prose. J'ai rejoué l'organe de navigation et diffé le carnet cellule par cellule.
1. 🔴 check-nav-chain — corrigé, prouvé en labo sur la tête
J'ai reconstruit le graphe des 7 carnets de la série aux deux refs (blobs réels, dépôt git) et exécuté check_notebook_nav_chain.py du head dans les deux arbres :
- base
21ad9a48→ FAIL, 2 NEW :[orphan_entry] TV-00d-Encodeurs-from-scratch.ipynb+[orphan_entry] TV-04-DiscoLoop.ipynb; - tête
82928bcf→OK: 0 NEW finding vs baseline (0 connus, 7 notebook(s) au graphe).
La ligne ajoutée est bien celle du remède mesuré, dans la cellule 31 de TV-00b : **Navigation** : [TV-00d — Encodeurs (suite)](TV-00d-Encodeurs-from-scratch.ipynb). Les deux findings tombent d'un coup, TV-04 compris (c'était bien l'effet de seuil len(entries) > 1, pas un défaut de TV-04). Réserve honnête : au moment de cette review les 36 jambes du head sont encore pending/queued (pool de runners saturé, PR gate cancelled) — je ne certifie donc pas un CI vert, je certifie le rejeu local de l'organe du head sur les blobs du head.
2. 🟡 Docstring selfcheck_encodeurs — corrigée, et le texte est maintenant exact
Le head dit : l'invariance à la mémoire « est une propriété de l'implémentation (aucun encodage positionnel sur la mémoire), pas une hypothèse testée ». C'est précisément ce que j'avais mesuré (écart 5,96e-08, donc invariant, mais non asserté). J'ai réexécuté le selfcheck du head chez moi : {'a_ecart_bi_vs_causal_pos0': 1.0553, 'a_passe': True, 'b_ecart_permutation_decodeur': 0.0, 'b_passe': True, 'passed': True} — les deux assertions réelles tirent, et la sortie committée de la cellule 7 (1.30e+00 / 0.00e+00) est du même ordre. La sur-promesse de la docstring a disparu.
3. 🟡 Périmètre torch — ajouté, et à l'endroit juste
Cellule 35 : « propres au couple torch épinglé (2.13.0+cu126) et à la graine : rejoué sous un autre bâtiment de torch, des cellules individuelles bougent — jusqu'à plusieurs points sur les colonnes fines, notamment le témoin causal ré-entraîné — alors que les classements directionnels tiennent. » C'est mot pour mot la distinction que j'avais observée sous 2.14.1+cpu (colonnes fines qui bougent, thèses qui tiennent). Le lecteur ne peut plus lire « identique » comme une promesse inter-versions.
Authenticité : le commit de correctif n'a pas menti sur son périmètre
Diff f71d9d66 → 82928bcf du carnet : 37 → 37 cellules, 0 cellule code modifiée, 0 output modifié, une seule cellule markdown changée (35). metadata.papermill byte-identique (duration 81,123726 s, start_time 13:35:30.042922Z) : aucun re-run n'a été fabriqué ni simulé pour accompagner un changement de prose. C'est exactement ce que le message de commit annonçait (« markdown + docstring uniquement, aucune cellule code touchée, donc pas de re-exec due »).
Gate #17040 sur la cellule 35 réécrite : toute valeur citée y est présente dans les outputs committés — 63,7 / 31,6 / 41,9 / 90,0 % (cellule 20), et le « solde −1 point » correspond au delta -1.2% imprimé par la cellule 24. Les deux seuls écarts sont des arrondis légitimes de lecture (0,75 ← 0,749 ; 0,28 ← 0,283) et des identifiants de section.
Verdict : APPROVE. Les trois points de ma review @ f71d9d66 sont éteints ; le carnet livre ce qu'il annonce, l'organe de navigation est réparé à la cause et l'authenticité de l'exécution est intacte. Reste à faire tourner le CI sur la tête quand le pool reprend, mais aucun de mes constats n'en dépend.
Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: MED/test #22285
Closes #22699 · Part of #18220 (pli 3, bloc NLP/LLM — « Encodeur seul et encodeur-décodeur from scratch »)
Livrable
TV-00d-Encodeurs-from-scratch.ipynb(37 cellules, bloc A, contrat CPU de la série) — les deux familles Transformer absentes du corpus : encodeur seul (BERT, MLM 80/10/10) et encodeur-décodeur (T5, attention croisée). 3 exercices stubbés sans erreur volontaire (C.1), sorties réelles commitées (C.2). Ligne Parcours ajoutée au README de la série.Organ-first — les 5 questions
TransformerVariants/tv/(organe extrait de TV-00b) possède l'attention multi-tête vectorisée et le bloc pré-norm.VariantAttn,Bloc,attn_masked,selfcheck_attn_equivalencedepuistv; l'attention multi-tête de base n'est pas re-dérivée.tv/model.pyétendu additivement —attn_pleine,AttnCroisee,BlocDecodeur,PetitEncodeur,EncodeurDecodeur,selfcheck_encodeurs, tous exportés danstv/__init__.py. Aucune signature existante modifiée ;selfcheck_attn_equivalenceinchangé et repassé dans le carnet (1.79e-07).attn_pleineetAttnCroiseecontre une boucle par tête écrite à la main (écarts 1.19e-07 / 5.96e-08) ; §4 — exact-match jeton par jeton contre les cibles canoniques.Mesures clés (toutes mesurées dans ce run, graines fixées)
Création du carnet — exception documentée
Nouveau carnet construit par script (round-trip
json+nbformat.validate, ids stablestv00d-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é).Bug trouvé et corrigé pendant le développement
Les jeux de test initiaux étaient dégénérés :
torch.Generator().manual_seed(s)recréé dans la compréhension de liste → 512 phrases de test identiques. Toutes les métriques d'évaluation des premières exécutions mesuraient une seule phrase. Corrigé : générateur créé une seule fois hors de la compréhension +assertde distinctité (> 400 éléments distincts) laissés dans le carnet comme garde.Validation
python3, 37/37 cellules, 0 erreur, ~80 s. Deux exécutions complètes successives : sorties identiques (déterminisme —CUBLAS_WORKSPACE_CONFIG, cudnn deterministic, graine 20261026).check_output_failure_text origin/mainrc=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.raise NotImplementedError/assert False/1/0(grep sur carnet + organe).selfcheck_attn_equivalence(TV-00b) repassé vert dans le carnet.🤖 Generated with Claude Code