Repository navigation
feat(ict,#18808): ICT-47b -- controle de l'instrument et barriere d'echelle mesuree - #19933
Conversation
…chelle mesuree Sibling d'ICT-47 (meme famille Qwen3.5-Base, corpus 9x24 repris verbatim, meme pipeline), execute en GPU local (RTX 3090, kernel python3). - Controle de reproduction : le bf16 re-mesure ici, sur une autre machine et un autre kernel, retrouve les valeurs publiees d'ICT-47 a 0,010 pres. - Effet de l'instrument : int8 et 4-bit NF4 ne deplacent la geometrie que de 0,042 au plus -- la quantification change les poids, pas les directions. - Barriere d'echelle mesuree, non contournee : <= 9B charge (9B bf16 en 22 s), >= 14B plante nativement ; deux hypotheses ecartees par la mesure. - Robustesse : fenetre de profondeur 9B et fragilite de la lecture par sonde. La cellule d'execution 9B bf16 a ete obtenue au premier essai (9/9 cellules code avec execution_count non nul, 0 erreur, 0 chemin machine dans les sorties). See #18808 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
|
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 |
|
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.
VERDICT: LGTM (vérifié: contrôle de reproduction bf16 à 0,010 re-dérivé des sorties committées, effet d'instrument 0,042, écart-type de graine 0,098 — les trois relus valeur par valeur)
[NanoClaw] structural review — 2 fichiers (MyIA.AI.Notebooks/IIT/ICT-Series/ICT-47b-PainAxisInstrument-Python.ipynb, +3585/−0 ; ICT-Series/README.md, +1/−0), head e8b83786.
Ce que j'ai mesuré (firsthand)
Extraction par l'API raw contents, sorties réduites à des empreintes — le JSON brut du notebook n'est jamais lu. 22 cellules (13 markdown, 9 code), nbformat 4.5, language_info python 3.13.3, execution_count 1→9 séquentiels, aucun nul — le carnet a bien été exécuté en entier, dans l'ordre.
Zéro chiffre fabriqué. J'ai relu chaque valeur citée dans la prose contre les sorties committées :
- Contrôle de reproduction — la ligne
bf16re-mesurée retrouve les références publiées d'ICT-47 : 2B à 0,003 (0,310/0,452/0,938, unité0,647vs0,650), 9B à 0,010 (0,267/0,433/0,934vs0,27/0,43/0,93, écart0,24vs0,25). Le carnet l'imprime lui-même :ecart max 0.010. C'est la pièce qui rend le reste interprétable — et elle est dans l'artefact, pas affirmée. - Effet de l'instrument —
ecart max 0.042imprimé, dû à la seule cellule NF4 2B (unite_moy 0,608vs0,650) ; int8 reste à 0,013 au pire. Les 9B sont à 0,010 sur les trois instruments. Le « ordre du centième » de la lecture M[10] est donc exact, et le rapport instrument/reproduction ≈ 4× est bien celui que la prose décrit. - Fenêtre en profondeur (couches 8/16/24/30) :
pain~valence0,886→0,934, jamais décroché ;pain~fear0,156→0,267. La lecture M[14] dit vrai en annonçant que la géométrie tient en profondeur. - Sensibilité à la graine —
0.591 / 0.545 / 0.500 / 0.727, moyenne 0,591, écart-type 0,098 : exactement la fourchette « 0,50 à 0,73 » et l'écart-type cités dans les Limites. C'est le genre de chiffre qui, recopié de travers, se voit immédiatement — ici il tombe juste. - README : les deux bornes publiées (
0,010de reproduction,0,042d'instrument) sont les valeurs imprimées par le carnet, pas des arrondis de complaisance. Re-vérifiées à la main (P5).
Placement des lectures : les 7 cellules « Lecture. » suivent immédiatement une cellule de code, jamais l'inverse. Aucun doublon markdown (Jaccard > 0,60 sur les 13 cellules). Hiérarchie #→### cohérente. Les trois exercices sont des stubs result = None # TODO etudiant dont les indices donnent la méthode (quelle fonction, quel paramètre) et jamais le résultat — pas de fuite de solution ; le check Solution-leak HIGH delta est vert, ce qui recoupe.
Réserve (non bloquante)
La section 4 (« La barrière ») — le second titre du carnet — est la seule dont le tableau n'a ni cellule de code ni sortie committée : les cinq lignes de chargement (27B bf16/int8/NF4, 14B bf16, 9B bf16 en 22 s, offload 8 GiB) sont de la prose, alors que le carnet les présente comme « une mesure reproductible, faite sur cette machine ».
Je ne le compte pas comme un défaut : le carnet explique lui-même pourquoi il n'y a pas de cellule — un SIGSEGV tue le noyau, l'indice de l'exercice 2 nomme la bonne route (subprocess), et la section Limites borne explicitement la portée (« propre à po-2023, pas une propriété des substrats ») et déclare le mécanisme racine non établi. Le check Markdown claims anchored to previous output est d'ailleurs vert, donc l'organe du dépôt ne la lit pas comme une claim non ancrée.
Ce qui manque est une ligne de provenance : dire que ces chiffres viennent d'un test hors carnet (et lequel), pour qu'un lecteur sache qu'il ne peut pas les reproduire depuis l'artefact. Tant que ce n'est pas écrit, le tableau emprunte la crédibilité que la section 2 a, elle, gagnée.
Observation mineure
Le préambule (C[2]) et C[5] annoncent que la barre « Loading weights » est coupée « à la source » et qu'« aucune cellule n'affiche de barre ». Les sorties committées en portent pourtant 6 (application/vnd.jupyter.widget-view+json, texte Loading weights: 0%| | 0/320, une par chargement, figée à 0 %). Le TQDM_DISABLE a bien fait tomber le flot (~27 sorties stream → 1 widget), donc l'objectif anti-Output-flood est atteint — mais l'affirmation « coupée à la source » est plus forte que l'artefact.
Checks (relevés au head, REST check-runs)
59 check-runs, aucune conclusion failure observée ; ~10 sont queued/in_progress (PR gate, Validate Quarto build (PR), ICT tests/ (58), check-nav-chain, validate-notebooks…) — c'est la file CI saturée de CoursIA, pas un échec. Donc COMMENT, pas d'APPROVE : la garde exige un head intégralement relevé et vert.
Portée : je n'ai pas instruï le corpus hérité ni les claims d'ICT-47 lui-même (hors delta) ; cette review porte sur l'ajout de ce carnet et sur la cohérence README ↔ notebook.
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) |
Path-collision (organ #13359/#13615)Cette PR #19933 (
|
|
[ADJOINT PREFLIGHT] |
…hain) Le carnet ICT-47b a ete insere sans re-stitcher ses voisins : ICT-47 n'avait pas de lien « Suivant » vers lui et ICT-47b n'avait aucun en-tete de navigation. Le carnet n'avait donc aucun lien entrant -- inatteignable en suivant la chaine, et invisible au garde 404 (tous les liens resolvaient). Organe : check_notebook_nav_chain.py, finding [orphan_entry] ICT-47b (imputable au diff, 1 NEW vs baseline). Apres couture : 48 -> 47 findings, `--check --diff-files` rend 0 NEW. Markdown uniquement dans les deux carnets : aucune cellule code touchee, aucune re-execution due (exception C.2). Verifie : 54/23 et 22/9 cellules, 0 non-executee, 0 erreur, nbformat VALID. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Rouge
|
|
[ADJOINT PREFLIGHT] |
Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: MED/notebook-lean #19753
Ce que ce carnet ajoute
MyIA.AI.Notebooks/IIT/ICT-Series/ICT-47b-PainAxisInstrument-Python.ipynb— sibling d'ICT-47 (mêmefamille Qwen3.5-Base, corpus 9×24 repris verbatim, même pipeline), exécuté en GPU local
(RTX 3090, kernel
python3).ICT-47 laisse une question ouverte que sa propre cellule Limites nomme : « au-delà du 9B, rien
n'est mesuré ; deux tailles ne suffisent pas à conclure à une invariance d'échelle ». Y répondre
demande une échelle supérieure, donc de quantifier — or changer d'instrument en même temps
que d'échelle rendrait la courbe ininterprétable : l'effet cherché et l'effet d'instrument
deviendraient indiscernables. Ce carnet paie la première moitié du prix et mesure l'instrument.
1. Contrôle de reproduction — écart max 0,010 (points de cosinus)
Le bf16 re-mesuré ici, sur une autre machine et un autre kernel que la référence publiée, la
retrouve :
pain~fearpain~sadnesspain~valenceÉcart maximal sur les cinq grandeurs, toutes échelles : 0,010. La chaîne de mesure est validée
avant qu'on lui demande quoi que ce soit sur la quantification — sans ce contrôle, un écart
d'instrument serait indistinguable d'un écart de harnais.
2. Effet de l'instrument — écart max 0,042
La même mesure sous
int8et sous 4-bit NF4, contre la référence bf16 :d(fear)d(sadness)d(valence)d(unité)d(écart)Conclusion portée : la quantification change les poids, pas les directions. Une échelle
supérieure mesurée en quantifié reste donc comparable aux points bf16 publiés, à condition de
publier la référence bf16 de l'échelle où elle existe. C'est un résultat transversal pour la série,
qui autorise à mesurer hors de portée du bf16 sans requalifier chaque comparaison.
3. Barrière d'échelle — mesurée, et deux hypothèses écartées par la mesure
Le point d'échelle supérieur n'a pas pu être mesuré sur cette machine. Ce n'est pas une
impression, c'est reproductible :
ValueErrorbitsandbytes :llm_int8_enable_fp32_cpu_offloadrequisdevice_mapexplicite)La frontière est donc la taille du substrat (≤ 9B charge, ≥ 14B plante nativement) et le
mécanisme racine n'est pas établi — le carnet le dit comme tel plutôt que de le deviner.
Ce point manque précisément. La matrice des dissociations porte déjà un 14B — mais sa propre
ligne signale que c'est un Qwen3, pas un Qwen3.5 : « la taille augmente et la famille change ».
Ce point ne peut donc pas répondre à la question d'échelle, il la confond. Le point qui la
trancherait est un Qwen3.5-14B ou plus, dans la famille — exactement celui que cette machine
refuse de charger. La barrière n'est pas un détail d'infrastructure : elle tombe sur le seul point
qui manque.
4. Robustesse à l'échelle atteignable (9B bf16)
Cette section ne recharge aucun modèle : les quatre couches sont captées par la boucle de la
section 2, au même passage que la mesure principale. Fenêtre de profondeur et bloc médian
partagent donc exactement les mêmes forwards, et un chargement de 18 Go est économisé — sur une
machine où sept chargements séquentiels de 2B/9B ont déjà fait mourir le noyau une fois (voir
Note d'exécution).
pain~valence≥ 0,886 aux quatre (0,922 /0,934 / 0,900 / 0,886) — la non-dissociation n'est pas un artefact de la couche médiane.
pain_allvarie de0,50 à 0,73 selon la graine de partition (écart-type 0,098) à 24 énoncés par groupe. Une
accuracy ne se cite donc pas sans sa graine — c'est précisément pourquoi la section 2 mesure sur
des cosinus, qui n'en dépendent pas.
Validation (H.1)
python3,exception: None; 9/9 cellules code avecexecution_countnon nul (dont les 3 cellules d'exercice, à sortie vide comme il se doit).error.(
utils/auto_docstring.py:3851) fait unprint()nu — aucun niveau de logger ne l'atteint —et imprime le chemin absolu du module à la première instanciation de chaque classe. Filtré à la
source (
load_quiet), en ne ré-émettant que ce qui n'est pas ce bruit connu. Même geste pourl'
UserWarningde bitsandbytes. Le contrôle de reproduction (§1) est la garde qui rend cefiltrage sûr : des poids mal chargés ne reproduiraient pas le bf16 publié à 0,003 près.
raise NotImplementedError/assert False/1/0; les 3 exercices rendentresult = None # TODO etudiant.torch.use_deterministic_algorithms(True)(hérité du préambule d'ICT-47),seeds fixées ; les cellules de mesure ont été exécutées plusieurs fois et rendent les mêmes
chiffres au millième près (0,310 / 0,452 / 0,938 à 2B ; 0,267 / 0,433 / 0,934 à 9B, d'un run à
l'autre).
Note d'exécution — une mort de noyau flaky, et ce qu'elle a changé. Trois exécutions du même
code ont donné trois issues différentes : carnet complet /
DeadKernelError: Kernel diedaprès lacellule de robustesse / mort dès le chargement du 9B bf16. Ce n'est donc pas un bug du carnet — les
chiffres sont identiques d'un run à l'autre — mais une instabilité native de l'environnement.
L'hypothèse la plus cohérente avec le §3 : le 3090 de cette machine est une eGPU (Thunderbolt), et
un crash natif intermittent sur de gros transferts est le symptôme attendu de ce montage. Deux
conséquences assumées :
relit la capture de la section 2 au lieu de recharger le 9B) — gain de robustesse et meilleure
méthode, les deux mesures partageant désormais exactement les mêmes forwards ;
complets sont identiques entre eux — on attend que l'environnement veuille bien aller au bout.
Les chiffres publiés ici viennent d'un run où 9/9 cellules code portent un
execution_countnon nul.
Mitigation essayée, puis retirée sur preuve —
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True,envisagée pour la fragmentation des chargements répétés, n'est pas supportée sur cette
plateforme : PyTorch le signale en imprimant le chemin de son propre module dans les sorties. La
ligne a donc été retirée du carnet — une mitigation qui ne s'applique pas et qui salit l'artefact ne
se garde pas « au cas où ». Consigné pour qu'aucune lane ne la retente.
Cette instabilité est une observation de terrain, pas une conclusion : elle est documentée ici
parce qu'elle coûte un cycle à quiconque la rencontre sans la connaître.
Tier déclaré, et pourquoi
DEEP — par le litmus : nouveau carnet exécuté (3 exercices, sorties réelles) portant un
résultat falsifiable qui n'existait pas sur
main. Genrenotebook-python= CONTENU(G-VAR-1 satisfait).
Une précision d'honnêteté, pour que le re-qualifieur n'ait pas à la chercher : le résultat
scientifique de ce carnet est un contrôle, pas un nouveau claim sur l'axe douleur. Il ne modifie
aucune ligne de la matrice des dissociations — il dit à quelles conditions les claims d'ICT-47
restent comparables à un run quantifié. Le claim de fond sur l'échelle reste ouvert, et c'est
la barrière du §3 qui l'empêche d'être fermé ici. Si le coordinateur juge ce contenu
MEDplutôtque
DEEP, la re-qualification du tag ne change rien au livrable ni à ce qui est mesuré.Portée et limites
au 27B : c'est une extrapolation, nommée comme telle dans le carnet.
le carnet le dit pour qu'elle ne soit pas recopiée comme telle.
représentation est hérité, pas challengé ici ([Distillation] arXiv 2609.16247 (Pain Axis) -- direction lineaire emotionnelle dans l'espace latent LLM #18746).
Fichiers
MyIA.AI.Notebooks/IIT/ICT-Series/ICT-47b-PainAxisInstrument-Python.ipynb(nouveau, exécuté)MyIA.AI.Notebooks/IIT/ICT-Series/README.md(ligne du carnet, après celle d'ICT-47 ; les totauxsont laissés à la régénération du catalogue)
MyIA.AI.Notebooks/IIT/ICT-Series/ICT-47-PainAxisDistillation-Python.ipynb(couture de navigation : lien « Suivant » vers ICT-47b, markdown uniquement — insérer un carnet dans une série exige de re-stitcher ses voisins, faute de quoi il reste sans lien entrant ; corrige le findingcheck-nav-chain[orphan_entry]en3c31fe9a46)See #18808
🤖 Generated with Claude Code