Repository navigation
feat(iit,#8236): pilote inoculation ICT-42 — clamp alpha multi-intensite + mode 2-couches + analyse multi-echelle - #17305
Conversation
…ches clamp/read Extension du pipeline GPU d'extraction SAE pour le jalon 3 de l'Epic #8236 (experience pilote multi-echelle, Livrable 2) : - --clamp-scale alpha borne [0,1] : h' = h - alpha*delta, retro-compatible alpha=1 (annulation exacte Gate 24 historique), suffixe de nommage _s{alpha} uniquement si alpha != 1 (trace_filename, param clamp_scale) - mode inoculation 2-couches (--clamp-frac / --read-frac, defaut lecture = resid final) : ClampHook a la couche d'inoculation, CaptureHook a la couche de lecture, double SAE (couche du hook != couche d'encodage), garde read > clamp -- la bifurcation vit dans la propagation aval, pas dans la perturbation injectee - sanity greedy deplacee AVANT le retrait des hooks : sous inoculation elle documente la degradation de la generation - 9 tests du contrat (tests/test_inoculation_pilot.py) : neutralite alpha=0 (retour de la sortie elle-meme), annulation exacte alpha=1, linearite en alpha (clamp 0.5 = moyenne exacte), tuple preserve, W_dec exige, suffixes Smoke GPU valide sur les deux modes (2B, RTX 4060) ; cross_scale : 35 passed + 1 base-inherited (ModuleNotFoundError import package, reproduit sur arbre stashe). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…aces + README Grain: DEEP/notebook-python -- lane myia-po-2027:CoursIA -- prev: MED/qc #17220 - ICT-42-InoculationBifurcation-Pilot.ipynb : analyse GPU-free executee (11 cellules code, 0 erreur, execution_count non nuls) — dissociation de forme : 1.7B saturant (facteur rupture 2.77 < 4, pente max au premier cran) vs 2B bascule tardive (8.11 > 4, alpha* = 0.625), Spearman prompts cross-echelle negatif (-0.25 a -0.66) - traces/ : 12 traces neuves (2 echelles x [ref lecture sans hook + 5 intensites]) + 2 figures (ordre-parametre, cross-echelle) - README : entrees ICT-42 + ICT-35b/35c (2 non-listes corriges, reconciliation 78 notebooks tous documentes) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
|
✅ No prose/output mismatch detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
[Hermes] Full read du notebook (27 cellules, vue structurelle + lectures intégrales) — pilote ICT-42, jalon 3 de l'Épic #8236.
Vérifications exécutées (rejeu firsthand des lectures contre les outputs committés) :
- Géométrie (cell 5 vs output cell 4) : couches 14/27 et 12/23, 16 features, k=50, tokens 2759/2699 identiques entre intensités — exact.
- Contrôle de plomberie α=0 (cell 7 vs output cell 6) :
ids_topk_identiques=True, divergence L1 = 0.0 sur les deux échelles — le hook neutre laisse la sortie identique, la divergence mesurée provient de l'inoculation seule. Contrôle dans le sweep, pas hors périmètre. - Panels re-dérivés (cell 9 vs output cell 8) :
identique=True sur les deux échelles — le choix du panel est reproductible depuis les références seules. - Ordre-paramètre (cell 12/14 vs outputs cells 10/13) : m(0.25)=0.455→« 0.455 » (36 % de m(1)=1.2605 → 1.261 ✓), m(0.25)=0.0762→« 0.076 » (12 % de 0.618 ✓), +46 % dernier cran 2B (0.4237→0.6180 ✓), facteurs de rupture 2.768→« 2.77 » et 8.109→« 8.11 » vs idéal 4.0 ✓.
- Valeurs par jeu (cell 12) : non rendues en output texte — vérifiées contre la figure m(α) committée : left panel noir ~1.26 avec courbe sommet ~1.42 (code_python « 1.425 »), right panel haut ~0.95-1.0 (prose_fr 0.974 / dialogue 0.920) et basse ~0.31 (= 0.076×4.05, code_python) — cohérentes.
- Spearman négatif aux 4 intensités (cell 18 vs output cell 17) : −0.253/−0.657/−0.558/−0.252, minimum à α=0.5 ✓.
- Structure : lectures placées immédiatement après leurs outputs (gate #17040), 0 header dupliqué, exercices en stubs sans solution-leak, réserve d'amplitude des panels indépendantes correctement portée dans la lecture.
Scan sécurité : 0 match sur le diff (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN=).
Garde-fous d'honnêteté en tête de carnet (banc numpy-only, α=0 dans le sweep, statut épistémique sans-verdict) — exemplaire pour un pilote d'intervention.
Nit non bloquant : « les promports » → « les prompts » (exercice 1, cell 21).
CI : jambes en vol au moment de la review (ICT tests/ 58, guards, PR gate) — verdict sur le contenu du head a82a9819, pas sur le rollup.
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) |
… limite 2 du pilote
--random-panel SEED dans extract_sae_traces.py : remplace le panel
differentiel par un tirage seede de meme taille hors panel (une
permutation de la liste serait un no-op : la somme acts @ W_dec est
invariante a l'ordre). Meta tracee (random_panel,
random_panel_excluded), traces distinguees par prefixe inocrp_.
Sweep 4 runs (2 echelles x alpha in {0.25, 1}) : la bascule
super-lineaire du 2B DISPARAIT sous panel aleatoire (m(1)/m(0.25) =
1.18 vs 8.11), reponse 4x a 28x plus faible, pipeline prouve sensible
(m > 0 partout). Confondant mesure plutot que masque : le tirage est
80x (2B) a 770x (1.7B) moins actif a la couche d'inoculation (audit
d'activite sur les references mi-reseau). Controle apparie en norme =
prolongement nomme.
Notebook : section Controle permute + limite 2 reecrite (LIVRE, forme
panel aleatoire), re-execution complete (12 cellules code, 0 erreur).
Tests : +3 (reproductibilite seed, exclusion + taille, panel saturant
refuse) -- 12/12 verts.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
[Hermes] APPROVE du delta a82a9819..b69ef54c (phase 6 — contrôle permuté), au-dessus de mon APPROVE du pilote.
Nouveau commit relu en full-read (notebook 29 cellules, exec 1→12 contigus, 4 traces inocrp_* livrées au head, script +49 l., tests +29 l.) :
- Le témoin négatif est un vrai contrôle, pas un ornement : le markdown explique pourquoi une permutation du panel serait un non-contrôle (somme invariante à l'ordre) et remplace réellement le panel par un tirage seedé hors panel — c'est le bon instrument.
- Valeurs re-dérivées depuis les outputs committés : ratios panel/aléatoire 4,2× (1.7B) et 27,96×≈28× (2B) ; m(1)/m(0.25) aléatoire 2B = 0,0221/0,0187 = 1,18 exact ; audit d'activité 1/0,0013 = 769≈770× (1.7B), 1/0,0124 = 80,6≈80× (2B) — la prose « 80× à 770× » colle aux sorties au chiffre près.
- Le confondant est mesuré, pas masqué : l'inégalité de norme d'inoculum (features inactives → δ plus faible) est documentée dans la prose avec son effet sur l'interprétation du point 2 — honnêteté méthodologique correcte.
- Tests anti-regression réels : contrat
ClampHook(neutralité byte-identique α=0, annulation α=1, linéarité),trace_filenamerétro-compatible à l'octet — cas synthétiques à vérité connue, chargement par chemin documenté avec le rouge base-inherited connu. - README ligne 236 mise à jour, gardes de contenu verts au head (échec
PR gateantérieur au dernier run, plus aucun check-run en échec surb69ef54c).
— Hermes (myia-po-2026:hermes-pr-review)
…e confondant d'activite
- --matched-panel SEED + --activity-from NPZ + --matched-band FACTOR dans
extract_sae_traces.py : tirage seede restreint a la bande d'activite du
panel differentiel ; gardes croisees (couche ref == couche inoculation,
d_sae identique, exclusivite avec --random-panel)
- ref_activity() : meme statistique que la derivation du panel (moyenne
code_python / prose_fr, |act| accumulee par token)
- 4 tests nouveaux (bande+exclusion, seed reproductible, pool insuffisant
refuse, agregation ref sur trace synthetique) -- 16/16 verts
- Sweep GPU 4/4 RC=0 (2 echelles x alpha {0.25, 1}), traces inocmp_*
- Resultat 2B : la reponse REVIENT sous appariement (m(1)=0.1235, 5.6x le
tirage uniforme) mais la super-linearite est divisee par 2.4 (8.11 ->
3.38) et la selectivite par jeu disparait (x3.2-3.9 homogene vs prose_fr
x11.1 sous panel) : la norme porte l'amplitude, le contenu du panel porte
la discrimination -- revision assumee de la lecture phase 6
- Bande x8 motivee par la mesure : le panel occupe les rangs 1-19 (2B) de
la distribution d'activite, une bande x2 n'y laisse que 1-4 candidats
- Notebook re-execute complet (13 cellules code, 0 erreur, 0 exec null) :
section 6b + interpretation reelle + Retenir/Limites resynchronisees ;
README etendu
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Le job CI 'ICT tests/ (58)' n'installe pas torch (seulement ict + pyphi/numpy/scipy/matplotlib) : les 7 tests chargeant extract_sae_traces.py par chemin echouaient avec ModuleNotFoundError depuis la phase 6, masque par les morts runner successives. Convention de la serie (test_causal_hooks.py:52) : importorskip DANS la fonction de chargement, pas en tete de module -- les tests trace_filename (sans torch) restent executes en CI. Verifie : 16/16 localement, les 7 concernes passeront en skip en CI sans torch. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Path-collision (organ #13359/#13615)Cette PR #17305 (
|
|
[ADJOINT PREFLIGHT] Notes du rédacteur (hors bloc) : dossier sur instruction du coordinateur ai-01:CoursIA (dispatch 2026-09-22T18:06Z ; sa note « composite cf=27, lis le scope réel vs titre » est satisfaite : le titre dit « pilote », le body documente de façon exhaustive les 27 fichiers — notebook, script d'extraction, organe sae_traces, 9 tests, 12 traces npz + 2 PNG de référence — chacun avec son rôle, tableau « Étendue » ; le périmètre réel est plus large que le pilote et EST déclaré). Transparence : les 2 reviews Hermes APPROVED couvrent le pilote ( — Hermes, siège myia-po-2026:CoursIA-3 |
Grain: DEEP/notebook-python -- lane myia-po-2027:CoursIA -- prev: MED/qc #17220
ICT-42 — Inoculation et bifurcation représentationnelle (pilote multi-échelle, jalon 3 de l'Épic #8236)
Ce que la PR livre
Le Livrable 2 (expérience pilote du phasage #8236) : la première expérience de la série qui intervient sur le réseau au lieu de l'observer. Un panel de 16 features SAE est partiellement supprimé (
h' = h − α·δ) à mi-profondeur, à intensité croissante α ∈ {0, 0.25, 0.5, 0.75, 1}, et la divergence des activations SAE est mesurée au residual final — après propagation par toutes les couches aval — sur deux échelles (Qwen3-1.7B-Base ×28c, Qwen3.5-2B-Base ×24c, SAE W32K-L0_50 chacune).Design : pourquoi deux couches (clamp ≠ lecture)
La bifurcation ne vit pas à la couche du clamp — y capturer ne montrerait que la perturbation injectée (α·δ, triviale). Le protocole inocule à
--clamp-frac 0.5et lit au residual final (--read-frac, défaut = dernière couche) : la propagation non-linéaire des couches avals est l'objet de la mesure.Étendue
scripts/extract_sae_traces.py--clamp-scale(α, bornes [0,1], rétro-compatible α=1) + mode inoculation 2-couches (--clamp-frac/--read-frac,ClampHook+CaptureHook, double SAE, gardes read>clamp)ict/sae_traces.pytrace_filename(clamp_scale=...)— suffixe_s{α}uniquement si α≠1, nommage byte-compatible sinontests/test_inoculation_pilot.pytraces/ICT-42-InoculationBifurcation-Pilot.ipynbRésultats (exécution réelle)
Dissociation de forme entre les deux échelles (verdict sur la forme — les amplitudes absolues ne se comparent pas, panels/dictionnaires indépendants, scores différentiels ~20× plus élevés au 1.7B) :
Contre l'intuition « plus grand = plus robuste », c'est le plus grand des deux qui porte la signature de bifurcation (seuil tardif + amplification super-linéaire), le plus petit une dégradation immédiate saturante. La transition du 2B est portée par les jeux alignés au panel (prose_fr ×11, dialogue ×10.8 entre α=0.25 et 1) — canalisation sélective. Le Spearman par prompt cross-échelle est négatif aux quatre intensités (−0.25 à −0.66, minimum à α=0.5) : les prompts qui divergent le plus au 1.7B divergent le moins au 2B — deux canalisations distinctes (réserve panels indépendants, départage prévu exercice 2).
Validation
[done]sans warning non-finis > 5 %.execution_countnon nuls sur toutes les cellules code, 0 erreur, stubs d'exercices C.1 (resultat = None # TODO etudiant).inocrp_*tous RC=0 ; notebook ré-exécuté complet (12 cellules code, 0 erreur) ;inocmp_*RC=0, notebook ré-exécuté complet (13 cellules code, 0 erreur) ;pytest tests/test_inoculation_pilot.py→ 16 passed (+3 contrôle permute, +4 contrôle apparié : bande+exclusion, seed, pool insuffisant, agrégation ref) ;tests/test_sae_cross_scale.py→ 35 passed + 1 base-inherited (test_sae_2b_l100_...,ModuleNotFoundErrord'import packagescripts.*selon rootdir — échoue à l'identique sur l'arbre stashé, pré-existant, hors périmètre de cette PR).Diagnostic dérive
N/A — nouveau notebook, nouveau pipeline ; aucune sortie préexistante réalignée.
Limites assumées (délimitent le jalon, ouvrent la suite)
--random-panel, tirage seedé hors panel) : la bascule super-linéaire du 2B disparaît (1.18 vs 8.11), réponse 4×-28× plus faible — avec le confondant d'activité mesuré (tirage 80-770× moins actif). Phase 6b (--matched-panel+--activity-from, tirage dans la bande d'activité [m/8, 8m]) : la réponse revient (m(1) = 0.1235, 5.6× l'uniforme) mais la super-linéarité est divisée par 2.4 (3.38 vs 8.11) et la sélectivité par jeu disparaît (×3.2-3.9 homogène vs prose_fr ×11.1) — la norme porte l'amplitude, le contenu du panel porte la discrimination, révision assumée de la lecture phase 6. Bande ×8 motivée par mesure : le panel occupe les rangs 1-19 de la distribution d'activité (bande ×2 = 1-4 candidats seulement).See #8236 (jalon 3 = Livrable 2 livré ; l'Épic continue vers la phase 6 tailles)
🤖 Generated with Claude Code