Repository navigation
feat(ict,#17740): F-Lens/S-Lens sur capture dense — contraste quadri-instruments (volet outillage) - #18837
Conversation
…-instruments - ict/flens_traces.py : chargeur dense + NC@p, alignement top-k intra/inter jeux contre nulle appariee (paires de sous-espaces aleatoires, forme prescrite par l'avertissement de null_overlap_distribution) - ict/slens_traces.py : probe ridge de self-location positionnelle sur le banc reel (organes ict.slens reutilises), pooled + extrapolation par prompt, controle shuffle - ict/geometry_contrast.py : --dense -> F-Lens/S-Lens mesures sous garde d'alignement (model/layer/seed/variant + tokens egaux), per_set_summary ; retrocompatible sans capture dense (absences explicites) - scripts/extract_dense_traces.py : extracteur GPU (bench PROMPT_SETS importee, couche 16, --check-align exige l'egalite des tokens vs ICT-21) - tests : 31 nouveaux (structure factorielle recuperee, decodage positionnel, nulle sans PCA, bruit isotrope, integration contraste) Serie ICT complete : 1280 passed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
[Hermes] — review du head 7c7e0e9e (volet outillage quadri-instruments #17740, +925/−11, 7 fichiers). Deep review avec exécution firsthand.
Tests exécutés au head (staging complet : 8 modules ict/ + les 2 traces npz réelles ict21_sae_layer16_trained.npz / ict24_jlens_layer16_trained.npz téléchargées au SHA) : 31/31 passés (pytest tests/test_flens_traces.py tests/test_slens_traces.py tests/test_geometry_contrast.py), 1 warning rétro-compat attendu (manifeste SAE historique sans instrument). Le premier échec de run était un artefact de staging (npz absents de mon arbre), pas de la PR.
Lecture intégrale des 3 modules — points vérifiés :
- Contrat d'alignement fail-loud :
_aligned_denserefuse (ValueError) model/layer/seed/variant divergents, jeux de prompts différents, et tokens non strictement égaux (np.array_equalpar prompt) — la PR fait ce que son body promet : « refuse plutôt que de présenter un substrat différent comme le même run ». - Nulle appariée à chemin partagé :
null_pairspasse les bases QR par le même_basis_statisticsque les paires réelles — la statistique observée et la nulle ne peuvent pas diverger de calcul ; le docstring documente aussi le piège PCA-sur-base-orthonormale évité (R²≡1 systématique). - S-Lens sans réimplémentation :
ridge_probe/probe_metricsimportés deict.slensexistant au head (vérifié contents API), shuffle-control qui ne permute que le train, held-out intact. Les deux échelles (pooled interpolatif / par-prompt extrapolatif) rapportées séparément, jamais fusionnées — conforme au contrat « quatre lectures, jamais un score composite ». extract_dense_traces.py: prompts importés d'extract_sae_traces(source unique, pas de copie),--check-alignexige l'égalité des__tokenscontre ICT-21 avant d'écrire, torch confiné dansscripts/, garde GPU unique réutilisée.- Rétro-compat : sans capture dense,
f_lens/s_lensrestent des absences explicites (not_comparableavec raison) — le comportement des consommateurs existants est inchangé.
Sécurité : 0 ajout au grep credentials. PR gate fail = jambe DWELL documentée (tête 10:55:54Z, plancher 120 min — minuteur, rien à corriger), tous les autres organes verts au head.
Le grain de mesure (beyond_null = moyenne vs q95 de la nulle appariée, verdict faux ≠ absence de structure) est correctement rapporté comme lecture et non comme preuve. Rien à corriger.
[Hermes hermes-pr-review, cycle :11 02/10, host f6be46d1b7a3, sig=f11fb7ed]
|
[ADJOINT PREFLIGHT] |
Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #18829
See #17740 (KEEP path 1, volet outillage — le rapport mesuré quadri-instruments suit dans une PR fille, après la passe GPU).
Ce que la PR livre
Le volet outillage du contraste quadri-instruments #17740 : F-Lens et S-Lens deviennent mesurables sur le même substrat que SAE (ICT-21) et J-Lens (ICT-24), sous le même contrat d'alignement.
ict/flens_traces.pyfactor_geometry), alignement des top-k sous-espaces intra-jeu vs inter-jeux contre nulle appariée (paires de sous-espaces aléatoires — la forme prescrite par l'avertissement denull_overlap_distribution, pas la primitive-artefact)ict/slens_traces.pyict.slens.ridge_probe/probe_metricsréutilisé tel quel), lecture pooled + extrapolation par prompt, contrôle shuffle des étiquettesict/geometry_contrast.pycontrast()étendu :--dense(ou autodécouvertetraces/ict25_dense_layer16_trained.npz) → F-Lens/S-Lens mesurés après garde d'alignement (model/layer/seed/variant + tokens strictement égaux) ;per_set_summary= table de lecture croisée par jeu, jamais un score composite. Sans capture dense : absences explicites inchangées (rétrocompatible)scripts/extract_dense_traces.pyPROMPT_SETSimporté d'extract_sae_traces, source unique), même couche 16, même tokenisation, hookCaptureHookréutilisé ;--check-alignexige l'égalité exacte des tokens contre ICT-21 avant d'écrire ; variant control = permutation seedée des embeddings (convention ICT-21)Validation
python -m pytest tests/ -q(série ICT complète, post-dernier-commit) : 1280 passed, 8 warnings — dont 31 nouveaux ; 0 échec.python -m ict.geometry_contrast --traces-dir traces→ comptes SAE/J-Lens inchangés (colocalized 0, dissociated 0, chance 4, undefined 16),f_lens/s_lensrestentnot_comparable, pas deper_set_summary.scripts/extract_dense_traces.py: AST-parse OK ; l'exécution exige torch+CUDA (ci-dessous), ruff F821/F401/F841 à zéro sur les 7 fichiers touchés.Verdict SOTA — RECOVERABLE-MACHINE (stated, pas maquillé)
La capture dense elle-même (9B bf16 ≈ 18-19 GiB) ne tient pas sur le GPU local 16 Go : routée vers GPU 2 d'ai-01 (convention
extract_sae_traces: vLLM tient GPU 0-1), RECOVERABLE-MACHINE :Les modules de mesure sont eux validés dès maintenant sur fixtures synthétiques à vérité connue (tests ci-dessus) : structure factorielle → verdict same-set au-delà de la nulle ; position linéaire → R² > 0.95. Le rapport mesuré sur le banc 9B réel (et le commit du npz ~20 Mo avec décision de dépôt vs GDrive) vit dans la PR fille — cette PR ne prétend aucune mesure réelle non exécutée.
Décisions de conception (pièges mesurés, consignés dans le code)
frobenius_alignment = ‖B₁ᵀB₂‖_F/√k, pas la moyenne des |cos| : celle-ci vaut 1/k pour des bases identiques (seule la diagonale est non nulle) et passe SOUS le hasard quand k grandit — mesuré sur le fixture (0.125 identiques vs 0.2 aléatoires à k=8)._basis_statisticsque les paires réelles, sans l'étape PCA.🤖 Generated with Claude Code