From 093f341f3fa8b943354aff227d94bd8e468b3cd9 Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 22 Sep 2026 02:02:13 +0200 Subject: [PATCH 1/3] feat(iit,#8236): ICT-43 Phase 0 -- inventaire SAE multi-echelle mesure au Hub Ouverture du Livrable 1 (calibration) de l'Epic #8236 : verite-terrain des artefacts avant toute experience. Balayage live de l'org Qwen : 7 tailles effectives (pas de 0.7B ni 4B), 2 regimes de sparsite par depot, 27B instruct-only, W32K 30B-A3B retire (404), toutes couches couvertes, hook resid_post. Appariement mesure : expansion 16x (5 denses) vs 64x (2 A3B W128K), ancrage mi-reseau entier partout. Notebook execute end-to-end (7 cellules code, 0 erreur, kernel python3), outputs committes (C.2), 3 exercices stubbes C.1, limites declarees (fidelite MSE = Phase 0c GPU-2 ; heterogeneite expansion ; Qwen3.5 hybrides lin/full 3:1). Co-Authored-By: Claude Sonnet 5 --- .../ICT-43-Calibration-MultiEchelle.ipynb | 827 ++++++++++++++++++ MyIA.AI.Notebooks/IIT/ICT-Series/README.md | 2 + 2 files changed, 829 insertions(+) create mode 100644 MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb diff --git a/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb b/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb new file mode 100644 index 0000000000..e43abacc60 --- /dev/null +++ b/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb @@ -0,0 +1,827 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ict43c00", + "metadata": {}, + "source": [ + "# ICT-43 — Calibration multi-échelle, Phase 0 : inventaire des SAE\n", + "\n", + "**Épique #8236** (SAE + J-lens multi-échelle : forme et dynamique des catastrophes sous perturbations appariées). Cette série calibration précède le notebook d'expérience : elle rend la comparaison cross-échelle **valide** en contrôlant, avant toute expérience, ce qui doit l'être.\n", + "\n", + "**La Phase 0 établit la vérité-terrain des artefacts.** Le body de l'issue annonçait des SAE pour « 0.7B, 2B, 4B, 8B, 27B, 35B-A3B » ; rien n'est supposé en amont — on mesure ici ce qui existe réellement sur le Hub, avec quelles largeurs, quelles couches couvertes, quel point d'accrochage. Les écarts mesurés contre l'annonce sont un **résultat**, pas un incident : ils redessinent le plan d'expérience (quelles tailles sont réellement comparables).\n", + "\n", + "Conventions de la série : sorties committées (C.2), aucune erreur volontaire (C.1), documentation en français." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ict43c01", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-22T00:00:52.067447Z", + "iopub.status.busy": "2026-09-22T00:00:52.067270Z", + "iopub.status.idle": "2026-09-22T00:00:54.935303Z", + "shell.execute_reply": "2026-09-22T00:00:54.934188Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "helper HF pret\n" + ] + } + ], + "source": [ + "import json\n", + "import os\n", + "import re\n", + "import urllib.request\n", + "\n", + "import pandas as pd\n", + "\n", + "# Toutes les requetes passent par ce helper : un User-Agent explicite et,\n", + "# si present dans l'environnement, le token HF (repos eventuellement gated).\n", + "# Le token ne s'affiche jamais (regle secrets : env uniquement).\n", + "\n", + "def hf_get(url, as_json=True):\n", + " headers = {\"User-Agent\": \"ict43-phase0\"}\n", + " tok = os.environ.get(\"HF_TOKEN\")\n", + " if tok:\n", + " headers[\"Authorization\"] = f\"Bearer {tok}\"\n", + " req = urllib.request.Request(url, headers=headers)\n", + " with urllib.request.urlopen(req, timeout=30) as r:\n", + " raw = r.read()\n", + " return json.loads(raw.decode(\"utf-8\")) if as_json else raw\n", + "\n", + "print(\"helper HF pret\")" + ] + }, + { + "cell_type": "markdown", + "id": "ict43c02", + "metadata": {}, + "source": [ + "## Phase 0a — Balayage du Hub : quels SAE existent vraiment ?\n", + "\n", + "Le balayage énumère les dépôts de l'organisation `Qwen` dont l'identifiant contient `sae` (insensible à la casse), puis récupère pour chacun son `config.json` et la liste de ses fichiers. Les dépôts sont nommés `SAE-Res--W-L0_` : deux régimes de sparsité (L0_50, L0_100) par dépôt." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ict43c03", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-22T00:00:54.937731Z", + "iopub.status.busy": "2026-09-22T00:00:54.937461Z", + "iopub.status.idle": "2026-09-22T00:01:05.299141Z", + "shell.execute_reply": "2026-09-22T00:01:05.298668Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14 repos SAE mesures sur le Hub\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
modelelargeurl0_cibled_saen_layers_cfghookcouchestoutes_couches
0Qwen3-1.7B-Base32K1003276828resid_post0..27 (28)True
1Qwen3-1.7B-Base32K503276828resid_post0..27 (28)True
2Qwen3-30B-A3B-Base128K10013107248resid_post0..47 (48)True
3Qwen3-30B-A3B-Base32K503276848resid_post0..47 (48)True
4Qwen3-8B-Base64K1006553636resid_post0..35 (36)True
5Qwen3-8B-Base64K506553636resid_post0..35 (36)True
6Qwen3.5-27B80K1008192064resid_post0..63 (64)True
7Qwen3.5-27B80K508192064resid_post0..63 (64)True
8Qwen3.5-2B-Base32K1003276824resid_post0..23 (24)True
9Qwen3.5-2B-Base32K503276824resid_post0..23 (24)True
10Qwen3.5-35B-A3B-Base128K10013107240resid_post0..39 (40)True
11Qwen3.5-35B-A3B-Base32K503276840resid_post0..39 (40)True
12Qwen3.5-9B-Base64K1006553632resid_post0..31 (32)True
13Qwen3.5-9B-Base64K506553632resid_post0..31 (32)True
\n", + "
" + ], + "text/plain": [ + " modele largeur l0_cible d_sae n_layers_cfg hook \\\n", + "0 Qwen3-1.7B-Base 32K 100 32768 28 resid_post \n", + "1 Qwen3-1.7B-Base 32K 50 32768 28 resid_post \n", + "2 Qwen3-30B-A3B-Base 128K 100 131072 48 resid_post \n", + "3 Qwen3-30B-A3B-Base 32K 50 32768 48 resid_post \n", + "4 Qwen3-8B-Base 64K 100 65536 36 resid_post \n", + "5 Qwen3-8B-Base 64K 50 65536 36 resid_post \n", + "6 Qwen3.5-27B 80K 100 81920 64 resid_post \n", + "7 Qwen3.5-27B 80K 50 81920 64 resid_post \n", + "8 Qwen3.5-2B-Base 32K 100 32768 24 resid_post \n", + "9 Qwen3.5-2B-Base 32K 50 32768 24 resid_post \n", + "10 Qwen3.5-35B-A3B-Base 128K 100 131072 40 resid_post \n", + "11 Qwen3.5-35B-A3B-Base 32K 50 32768 40 resid_post \n", + "12 Qwen3.5-9B-Base 64K 100 65536 32 resid_post \n", + "13 Qwen3.5-9B-Base 64K 50 65536 32 resid_post \n", + "\n", + " couches toutes_couches \n", + "0 0..27 (28) True \n", + "1 0..27 (28) True \n", + "2 0..47 (48) True \n", + "3 0..47 (48) True \n", + "4 0..35 (36) True \n", + "5 0..35 (36) True \n", + "6 0..63 (64) True \n", + "7 0..63 (64) True \n", + "8 0..23 (24) True \n", + "9 0..23 (24) True \n", + "10 0..39 (40) True \n", + "11 0..39 (40) True \n", + "12 0..31 (32) True \n", + "13 0..31 (32) True " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def scan_sae_repos():\n", + " \"\"\"Enumere les repos SAE de l'org Qwen avec config + couches couvertes.\"\"\"\n", + " repos = [m[\"modelId\"] for m in hf_get(\n", + " \"https://huggingface.co/api/models?author=Qwen&limit=1000\")\n", + " if \"sae\" in m[\"modelId\"].lower()]\n", + " rows = []\n", + " for repo in sorted(repos):\n", + " try:\n", + " cfg = hf_get(f\"https://huggingface.co/{repo}/resolve/main/config.json\")\n", + " info = hf_get(f\"https://huggingface.co/api/models/{repo}\")\n", + " layers = sorted(int(m.group(1)) for s in info.get(\"siblings\", [])\n", + " if (m := re.match(r\"layer(\\d+)\\.sae\\.pt$\", s[\"rfilename\"])))\n", + " m = re.match(r\"Qwen/SAE-Res-(.+)-W(\\d+K)-L0_(\\d+)$\", repo)\n", + " rows.append({\n", + " \"modele\": m.group(1) if m else repo, \"largeur\": m.group(2) if m else \"?\",\n", + " \"l0_cible\": int(m.group(3)) if m else None,\n", + " \"d_sae\": cfg.get(\"d_sae\"), \"n_layers_cfg\": cfg.get(\"num_layers\"),\n", + " \"hook\": cfg.get(\"hook_point\"),\n", + " \"couches\": f\"{min(layers)}..{max(layers)} ({len(layers)})\",\n", + " \"toutes_couches\": len(layers) == cfg.get(\"num_layers\"),\n", + " })\n", + " except Exception as e:\n", + " rows.append({\"modele\": repo, \"erreur\": f\"{type(e).__name__}\"})\n", + " return pd.DataFrame(rows)\n", + "\n", + "inventaire = scan_sae_repos()\n", + "print(f\"{len(inventaire)} repos SAE mesures sur le Hub\")\n", + "inventaire" + ] + }, + { + "cell_type": "markdown", + "id": "ict43c04", + "metadata": {}, + "source": [ + "**Lecture du balayage** — quatre écarts mesurés contre l'annonce de l'issue :\n", + "\n", + "1. **Pas de SAE 0.7B ni 4B** : la liste annoncée (0.7B, 2B, 4B, 8B, 27B, 35B-A3B) ne correspond pas au terrain. Les tailles réellement couvertes forment un ensemble **différent mais comparable** : 1.7B et 8B (Qwen3) ; 2B, 9B, 27B, 35B-A3B (Qwen3.5) ; 30B-A3B (Qwen3). Soit **7 tailles** effectives au lieu de 6 annoncées.\n", + "2. **Deux régimes de sparsité** (L0_50 et L0_100) existent pour chaque dépôt — l'issue ne les mentionnait pas ; le choix du régime devient un paramètre d'expérience à documenter.\n", + "3. **Le 27B n'existe qu'en version instruct** (`Qwen3.5-27B`, sans suffixe `-Base`) : un mismatch base/instruct à inscrire dans les limites de la comparaison.\n", + "4. **Le dépôt W32K du 30B-A3B répond 404** (retiré ou jamais publié) : seule la variante W128K est disponible à cette taille.\n", + "\n", + "Point positif inattendu : **chaque dépôt couvre toutes les couches** du modèle (`layer0.sae.pt` … `layer{N-1}.sae.pt`), pas seulement le mi-réseau — l'appariement de profondeur n'est pas contraint par la disponibilité." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ict43c05", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-22T00:01:05.301590Z", + "iopub.status.busy": "2026-09-22T00:01:05.301272Z", + "iopub.status.idle": "2026-09-22T00:01:09.389992Z", + "shell.execute_reply": "2026-09-22T00:01:09.389287Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
modeled_modeln_layers
0Qwen3-1.7B-Base204828
1Qwen3-8B-Base409636
2Qwen3-30B-A3B-Base204848
3Qwen3.5-2B-Base204824
4Qwen3.5-9B-Base409632
5Qwen3.5-27B512064
6Qwen3.5-35B-A3B-Base204840
\n", + "
" + ], + "text/plain": [ + " modele d_model n_layers\n", + "0 Qwen3-1.7B-Base 2048 28\n", + "1 Qwen3-8B-Base 4096 36\n", + "2 Qwen3-30B-A3B-Base 2048 48\n", + "3 Qwen3.5-2B-Base 2048 24\n", + "4 Qwen3.5-9B-Base 4096 32\n", + "5 Qwen3.5-27B 5120 64\n", + "6 Qwen3.5-35B-A3B-Base 2048 40" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# d_model des modeles de base : les configs Qwen3.5 sont omni (champ text_config imbrique),\n", + "# les configs Qwen3 planes. On mesure les deux formes sans rien supposer.\n", + "BASES = {\n", + " \"Qwen3-1.7B-Base\": \"Qwen/Qwen3-1.7B-Base\",\n", + " \"Qwen3-8B-Base\": \"Qwen/Qwen3-8B-Base\",\n", + " \"Qwen3-30B-A3B-Base\": \"Qwen/Qwen3-30B-A3B-Base\",\n", + " \"Qwen3.5-2B-Base\": \"Qwen/Qwen3.5-2B-Base\",\n", + " \"Qwen3.5-9B-Base\": \"Qwen/Qwen3.5-9B-Base\",\n", + " \"Qwen3.5-27B\": \"Qwen/Qwen3.5-27B\",\n", + " \"Qwen3.5-35B-A3B-Base\": \"Qwen/Qwen3.5-35B-A3B-Base\",\n", + "}\n", + "\n", + "def d_model_de(repo):\n", + " cfg = hf_get(f\"https://huggingface.co/{repo}/resolve/main/config.json\")\n", + " t = cfg.get(\"text_config\", cfg) # omni -> text_config ; classique -> plat\n", + " return t[\"hidden_size\"], t[\"num_hidden_layers\"]\n", + "\n", + "bases = pd.DataFrame(\n", + " [{\"modele\": k, \"d_model\": d_model_de(v)[0], \"n_layers\": d_model_de(v)[1]}\n", + " for k, v in BASES.items()])\n", + "bases" + ] + }, + { + "cell_type": "markdown", + "id": "ict43c06", + "metadata": {}, + "source": [ + "## Phase 0b — Appariement des échelles : facteur d'expansion et profondeur relative\n", + "\n", + "Deux quantités conditionnent la validité de la comparaison cross-échelle :\n", + "\n", + "- **le facteur d'expansion** `d_sae / d_model` : s'il diffère d'une taille à l'autre, les dictionnaires n'ont pas la même résolution relative et les ordres-paramètres ne sont pas directement comparables ;\n", + "- **la profondeur relative d'ancrage** `round(0.5 · n_layers)` : l'issue impose un ancrage à mi-réseau apparié (le pilote ICT-42 utilisait déjà `layer12of24` au 2B et `layer14of28` au 1.7B — la même règle, avant la lettre)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ict43c07", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-22T00:01:09.392268Z", + "iopub.status.busy": "2026-09-22T00:01:09.392022Z", + "iopub.status.idle": "2026-09-22T00:01:09.415455Z", + "shell.execute_reply": "2026-09-22T00:01:09.414588Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
modeled_modeln_layersd_saeexpansioncouche_ancrecoucheshook
0Qwen3-1.7B-Base2048283276816140..27 (28)resid_post
1Qwen3-30B-A3B-Base20484813107264240..47 (48)resid_post
2Qwen3-8B-Base4096366553616180..35 (36)resid_post
3Qwen3.5-27B5120648192016320..63 (64)resid_post
4Qwen3.5-2B-Base2048243276816120..23 (24)resid_post
5Qwen3.5-35B-A3B-Base20484013107264200..39 (40)resid_post
6Qwen3.5-9B-Base4096326553616160..31 (32)resid_post
\n", + "
" + ], + "text/plain": [ + " modele d_model n_layers d_sae expansion couche_ancre \\\n", + "0 Qwen3-1.7B-Base 2048 28 32768 16 14 \n", + "1 Qwen3-30B-A3B-Base 2048 48 131072 64 24 \n", + "2 Qwen3-8B-Base 4096 36 65536 16 18 \n", + "3 Qwen3.5-27B 5120 64 81920 16 32 \n", + "4 Qwen3.5-2B-Base 2048 24 32768 16 12 \n", + "5 Qwen3.5-35B-A3B-Base 2048 40 131072 64 20 \n", + "6 Qwen3.5-9B-Base 4096 32 65536 16 16 \n", + "\n", + " couches hook \n", + "0 0..27 (28) resid_post \n", + "1 0..47 (48) resid_post \n", + "2 0..35 (36) resid_post \n", + "3 0..63 (64) resid_post \n", + "4 0..23 (24) resid_post \n", + "5 0..39 (40) resid_post \n", + "6 0..31 (32) resid_post " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Jointure inventaire (regime L0_100, une ligne par taille) x d_model.\n", + "# Les lignes d'erreur du balayage n'ont pas de l0_cible : le filtre les ecarte.\n", + "l0100 = inventaire[inventaire[\"l0_cible\"] == 100]\n", + "\n", + "appariement = (\n", + " l0100.drop_duplicates(subset=[\"modele\"])\n", + " .merge(bases, on=\"modele\", how=\"inner\")\n", + " .assign(expansion=lambda d: d[\"d_sae\"] // d[\"d_model\"],\n", + " couche_ancre=lambda d: (0.5 * d[\"n_layers\"]).round().astype(int))\n", + " [[\"modele\", \"d_model\", \"n_layers\", \"d_sae\", \"expansion\",\n", + " \"couche_ancre\", \"couches\", \"hook\"]]\n", + " .reset_index(drop=True)\n", + ")\n", + "appariement" + ] + }, + { + "cell_type": "markdown", + "id": "ict43c08", + "metadata": {}, + "source": [ + "**Lecture de l'appariement.** Trois familles se dégagent :\n", + "\n", + "- **expansion 16×** partout sauf **64× pour les deux A3B en W128K** (30B-A3B et 35B-A3B) — les deux seules tailles MoE à grande largeur portent un dictionnaire 4× plus résolu par dimension. Une comparaison qui mélange 16× et 64× doit le déclarer (le pilote 2-tailles était homogène 16×).\n", + "- **l'ancrage mi-réseau tombe toujours sur un entier** (12, 14, 16, 18, 20, 24, 32) et chaque dépôt couvre toutes les couches : la règle `round(0.5 · n_layers)` est applicable partout sans exception.\n", + "- **l'architecture hybride des Qwen3.5** (attention linéaire : pleine = 3:1 sur toutes leurs couches) diffère structurellement des Qwen3 denses — la profondeur *relative* contrôle la position dans le réseau, pas l'homogénéité du mécanisme d'attention traversé. À inscrire dans les limites.\n", + "\n", + "Le pilote suivant (Phase 1) fittera la J-lens par taille à cette couche appariée ; la fidélité de reconstruction des SAE (MSE, variance expliquée — l'autre moitié de la Phase 0) exige des passes avant GPU et fait l'objet de la Phase 0c." + ] + }, + { + "cell_type": "markdown", + "id": "ict43c09", + "metadata": {}, + "source": [ + "## Exercices\n", + "\n", + "Trois exercices préparent la Phase 1. Ils se complètent sans dépendre l'un de l'autre ; les squelettes s'exécutent (C.1)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ict43c10", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-22T00:01:09.417302Z", + "iopub.status.busy": "2026-09-22T00:01:09.417135Z", + "iopub.status.idle": "2026-09-22T00:01:09.420137Z", + "shell.execute_reply": "2026-09-22T00:01:09.419452Z" + } + }, + "outputs": [], + "source": [ + "# Exercice 1 : URL d'artefact verifiee.\n", + "# Ecrire couche_url(modele, couche) qui construit l'URL du .sae.pt de la couche\n", + "# demandee pour le depot L0_100, et verifie sa disponibilite par une requete HEAD\n", + "# (code 200). Retourner (url, disponible). Attention : le 30B-A3B n'existe qu'en W128K.\n", + "# Indice : appariement contient d_sae par modele, le nom du depot suit\n", + "# SAE-Res--W-L0_100 avec largeur = d_sae en K (32768 -> 32K, ...).\n", + "\n", + "def couche_url(modele, couche):\n", + " # TODO etudiant\n", + " print(\"Exercice a completer\")\n", + " return None\n", + "\n", + "# TEMOIN attendu : couche_url(\"Qwen3.5-2B-Base\", 12) doit rendre une URL disponible.\n", + "resultat_ex1 = None # TODO etudiant\n", + "resultat_ex1" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ict43c11", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-22T00:01:09.421871Z", + "iopub.status.busy": "2026-09-22T00:01:09.421666Z", + "iopub.status.idle": "2026-09-22T00:01:09.424783Z", + "shell.execute_reply": "2026-09-22T00:01:09.424204Z" + } + }, + "outputs": [], + "source": [ + "# Exercice 2 : grille de comparaison homogene en expansion.\n", + "# Construire grille_16x() : le sous-ensemble d'appariement ou toutes les tailles\n", + "# portent expansion == 16 (comparaison homogene), trie par n_layers croissant,\n", + "# avec la colonne couche_ancre. Verifier que la grille compte 5 tailles.\n", + "# Etape 1 : filtrer sur expansion. Etape 2 : trier. Etape 3 : verifier le compte.\n", + "\n", + "def grille_16x(tableau):\n", + " # TODO etudiant\n", + " print(\"Exercice a completer\")\n", + " return None\n", + "\n", + "resultat_ex2 = None # TODO etudiant\n", + "resultat_ex2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ict43c12", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-22T00:01:09.427053Z", + "iopub.status.busy": "2026-09-22T00:01:09.426767Z", + "iopub.status.idle": "2026-09-22T00:01:09.430134Z", + "shell.execute_reply": "2026-09-22T00:01:09.429476Z" + } + }, + "outputs": [], + "source": [ + "# Exercice 3 : cout de telechargement d'une experience.\n", + "# Pour la grille 16x, estimer le nombre d'artefacts SAE a telecharger pour la\n", + "# Phase 1 (J-lens) si l'on veut, par taille, la couche d'ancrage ET ses deux\n", + "# voisines (ancre-1, ancre, ancre+1). Retourner un DataFrame (modele, couches_voulues,\n", + "# n_artefacts). bornes : la couche 0 et la couche n_layers-1 existent, jamais hors bornes.\n", + "# Indice : appariement[\"n_layers\"] donne la borne haute par modele.\n", + "\n", + "def cout_phase1(tableau):\n", + " # TODO etudiant\n", + " print(\"Exercice a completer\")\n", + " return None\n", + "\n", + "resultat_ex3 = None # TODO etudiant\n", + "resultat_ex3" + ] + }, + { + "cell_type": "markdown", + "id": "ict43c13", + "metadata": {}, + "source": [ + "## Limites de la Phase 0\n", + "\n", + "1. **Fidélité de reconstruction non mesurée ici** : l'inventaire établit l'*existence* et la géométrie des dictionnaires (largeurs, couches, hook), pas leur qualité (MSE, variance expliquée). Cette mesure exige des passes avant sur GPU-2 (garde-fous #8236 : `CUDA_VISIBLE_DEVICES=2`, un job sérialisé, abort thermique > 85 °C) — c'est l'objet de la Phase 0c, à livrer avant toute expérience.\n", + "2. **27B en instruct seulement** : le dépôt `Qwen3.5-27B` n'a pas de jumeau `-Base`. Toute comparaison impliquant le 27B mélange un modèle post-entraîné avec des modèles de base — à déclarer dans le plan d'expérience ou à exclure cette taille des comparaisons sensibles au post-training.\n", + "3. **Hétérogénéité d'expansion** : 16× (5 tailles denses) contre 64× (2 tailles A3B en W128K). La comparaison stricte se fait en expansion homogène ; l'analyse d'échelle A3B est un régime séparé.\n", + "4. **Qwen3.5 hybrides (attention linéaire 3:1)** : la profondeur relative n'égalise pas le mécanisme traversé. Le facteur de structure (dense vs MoE vs hybride) est un covariant à tracer, pas à ignorer.\n", + "5. **Inventaire daté** : mesuré au Hub tel qu'il existe au moment de l'exécution (le W32K du 30B-A3B a ainsi été trouvé retiré — 404). Toute re-exécution re-mesure.\n", + "\n", + "*Suite (Phase 1) : fit J-lens par taille à `couche_ancre`, report qualité de sonde (accuracy/AUC `control` vs `trained`). See #8236.*" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/MyIA.AI.Notebooks/IIT/ICT-Series/README.md b/MyIA.AI.Notebooks/IIT/ICT-Series/README.md index ce5bb7366b..2a80e23f87 100644 --- a/MyIA.AI.Notebooks/IIT/ICT-Series/README.md +++ b/MyIA.AI.Notebooks/IIT/ICT-Series/README.md @@ -232,6 +232,8 @@ La **strate 5 commence ici** : le substrat mesuré n'est plus un système dynami | [ICT-38-SLens-SelfLocation](ICT-38-SLens-SelfLocation.ipynb) | **S-Lens — la représentation porte-t-elle la bonne référence ?** *(strate 5, GPU requis, POC expérimental)* : quand la valeur à produire se trouve à une position déterminée par le **contenu** (et non par la position absolue du token), bancs synthétiques à vérité terrain exacte — lecture par tête et intervention causale appariée | [#15814](https://github.com/jsboige/CoursIA/issues/15814) | | [ICT-39-CompositionRegards](ICT-39-CompositionRegards.ipynb) | **Composition de regards** *(opération 12 « Composer des regards »)* : distinguer la lecture avant (`get`/`play`) de la demande arrière (`put`/`coplay`), les composer réellement, et construire le témoin falsifiable où deux regards composés divergent de leurs lectures isolées — prérequis légers (fonctions, composition, modulo 3) | [#12204](https://github.com/jsboige/CoursIA/issues/12204) | +| [ICT-43-Calibration-MultiEchelle](ICT-43-Calibration-MultiEchelle.ipynb) | **Calibration multi-échelle, Phase 0 — inventaire des SAE** *(ouverture Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) : SAE + J-lens multi-échelle, strate 5)* : la vérité-terrain des artefacts mesurée au Hub avant toute expérience — le body de l'Epic annonçait « 0.7B, 2B, 4B, 8B, 27B, 35B-A3B », le balayage live de l'org `Qwen` mesure autre chose : **7 tailles effectives** (1.7B, 8B en Qwen3 ; 2B, 9B, 27B, 35B-A3B en Qwen3.5 ; 30B-A3B), **aucune 0.7B ni 4B**, **deux régimes de sparsité** (L0_50/L0_100) par dépôt, le **27B en instruct seulement** (pas de jumeau `-Base`), le **W32K du 30B-A3B retiré** (404), et **toutes les couches couvertes** partout (`layer{0..N-1}.sae.pt`, hook `resid_post`). L'appariement mesuré : expansion **16×** sur les 5 tailles denses contre **64×** sur les deux A3B W128K (la comparaison stricte se fait en expansion homogène), ancrage mi-réseau `round(0.5·n_layers)` entier et disponible partout (12/14/16/18/20/24/32 — le pilote ICT-42 appliquait déjà cette règle). Fidélité de reconstruction (MSE, variance expliquée) = Phase 0c sur GPU-2, non mesurée ici | Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) | + ### Distillation externe — hors strates Les grains de **distillation externe** (veille → notebook) s'ajoutent aux strates sans en faire partie : ils opérationnalisent en monde jouet des préprints récents, avec la discipline de la série (garde-fous d'honnêteté, bancs falsifiables, déterminisme complet par graine). From 328ffd41e2ed6e39a27cf0b7a5b3031fbd76c854 Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 22 Sep 2026 03:23:13 +0200 Subject: [PATCH 2/3] fix(iit,#8236): ICT-43 point 4 reformule -- pattern croise L0/largeur des A3B, pas un retrait ; 3:1 marque a priori Review NanoClaw #17338 : le 404 mesure porte sur le depot W32K-L0_100 du 30B-A3B, pas sur la largeur W32K (son regime L0_50 est vivant dans la table). Pattern croise {L0_50->W32K, L0_100->W128K} identique sur les deux A3B = structure de publication du Hub. Nit depot->modele (cell 2 + README), nit 3:1 marque a priori (cell 8 + Limites). Markdown-only, pas de cellule code touchee (exception C.2). Co-Authored-By: Claude Sonnet 5 --- .../IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb | 8 ++++---- MyIA.AI.Notebooks/IIT/ICT-Series/README.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb b/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb index e43abacc60..667bd179f8 100644 --- a/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb +++ b/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb @@ -67,7 +67,7 @@ "source": [ "## Phase 0a — Balayage du Hub : quels SAE existent vraiment ?\n", "\n", - "Le balayage énumère les dépôts de l'organisation `Qwen` dont l'identifiant contient `sae` (insensible à la casse), puis récupère pour chacun son `config.json` et la liste de ses fichiers. Les dépôts sont nommés `SAE-Res--W-L0_` : deux régimes de sparsité (L0_50, L0_100) par dépôt." + "Le balayage énumère les dépôts de l'organisation `Qwen` dont l'identifiant contient `sae` (insensible à la casse), puis récupère pour chacun son `config.json` et la liste de ses fichiers. Les dépôts sont nommés `SAE-Res--W-L0_` : deux régimes de sparsité (L0_50, L0_100) par modèle — chaque dépôt porte un seul régime." ] }, { @@ -360,7 +360,7 @@ "1. **Pas de SAE 0.7B ni 4B** : la liste annoncée (0.7B, 2B, 4B, 8B, 27B, 35B-A3B) ne correspond pas au terrain. Les tailles réellement couvertes forment un ensemble **différent mais comparable** : 1.7B et 8B (Qwen3) ; 2B, 9B, 27B, 35B-A3B (Qwen3.5) ; 30B-A3B (Qwen3). Soit **7 tailles** effectives au lieu de 6 annoncées.\n", "2. **Deux régimes de sparsité** (L0_50 et L0_100) existent pour chaque dépôt — l'issue ne les mentionnait pas ; le choix du régime devient un paramètre d'expérience à documenter.\n", "3. **Le 27B n'existe qu'en version instruct** (`Qwen3.5-27B`, sans suffixe `-Base`) : un mismatch base/instruct à inscrire dans les limites de la comparaison.\n", - "4. **Le dépôt W32K du 30B-A3B répond 404** (retiré ou jamais publié) : seule la variante W128K est disponible à cette taille.\n", + "4. **En régime L0_100, les deux A3B (30B et 35B-A3B) n'existent qu'en W128K** — pattern croisé {L0_50→W32K, L0_100→W128K} strictement identique sur les deux tailles : une structure de publication du Hub, pas un retrait spécifique. Le fait mesuré derrière ce point : le dépôt `W32K-L0_100` du 30B-A3B répond 404 (jamais publié ou retiré) — la ligne W32K de la table ci-dessus est son régime L0_50, bien vivant.\n", "\n", "Point positif inattendu : **chaque dépôt couvre toutes les couches** du modèle (`layer0.sae.pt` … `layer{N-1}.sae.pt`), pas seulement le mi-réseau — l'appariement de profondeur n'est pas contraint par la disponibilité." ] @@ -681,7 +681,7 @@ "\n", "- **expansion 16×** partout sauf **64× pour les deux A3B en W128K** (30B-A3B et 35B-A3B) — les deux seules tailles MoE à grande largeur portent un dictionnaire 4× plus résolu par dimension. Une comparaison qui mélange 16× et 64× doit le déclarer (le pilote 2-tailles était homogène 16×).\n", "- **l'ancrage mi-réseau tombe toujours sur un entier** (12, 14, 16, 18, 20, 24, 32) et chaque dépôt couvre toutes les couches : la règle `round(0.5 · n_layers)` est applicable partout sans exception.\n", - "- **l'architecture hybride des Qwen3.5** (attention linéaire : pleine = 3:1 sur toutes leurs couches) diffère structurellement des Qwen3 denses — la profondeur *relative* contrôle la position dans le réseau, pas l'homogénéité du mécanisme d'attention traversé. À inscrire dans les limites.\n", + "- **l'architecture hybride des Qwen3.5** (attention linéaire : pleine = 3:1 sur toutes leurs couches, lu dans `layer_types` des configs publiées — a priori d'architecture, non mesuré dans ce notebook) diffère structurellement des Qwen3 denses — la profondeur *relative* contrôle la position dans le réseau, pas l'homogénéité du mécanisme d'attention traversé. À inscrire dans les limites.\n", "\n", "Le pilote suivant (Phase 1) fittera la J-lens par taille à cette couche appariée ; la fidélité de reconstruction des SAE (MSE, variance expliquée — l'autre moitié de la Phase 0) exige des passes avant GPU et fait l'objet de la Phase 0c." ] @@ -796,7 +796,7 @@ "1. **Fidélité de reconstruction non mesurée ici** : l'inventaire établit l'*existence* et la géométrie des dictionnaires (largeurs, couches, hook), pas leur qualité (MSE, variance expliquée). Cette mesure exige des passes avant sur GPU-2 (garde-fous #8236 : `CUDA_VISIBLE_DEVICES=2`, un job sérialisé, abort thermique > 85 °C) — c'est l'objet de la Phase 0c, à livrer avant toute expérience.\n", "2. **27B en instruct seulement** : le dépôt `Qwen3.5-27B` n'a pas de jumeau `-Base`. Toute comparaison impliquant le 27B mélange un modèle post-entraîné avec des modèles de base — à déclarer dans le plan d'expérience ou à exclure cette taille des comparaisons sensibles au post-training.\n", "3. **Hétérogénéité d'expansion** : 16× (5 tailles denses) contre 64× (2 tailles A3B en W128K). La comparaison stricte se fait en expansion homogène ; l'analyse d'échelle A3B est un régime séparé.\n", - "4. **Qwen3.5 hybrides (attention linéaire 3:1)** : la profondeur relative n'égalise pas le mécanisme traversé. Le facteur de structure (dense vs MoE vs hybride) est un covariant à tracer, pas à ignorer.\n", + "4. **Qwen3.5 hybrides (attention linéaire 3:1)** : la profondeur relative n'égalise pas le mécanisme traversé. Le facteur de structure (dense vs MoE vs hybride) est un covariant à tracer, pas à ignorer. Le ratio 3:1 est lui-même un a priori (config `layer_types`), pas une mesure de ce notebook.\n", "5. **Inventaire daté** : mesuré au Hub tel qu'il existe au moment de l'exécution (le W32K du 30B-A3B a ainsi été trouvé retiré — 404). Toute re-exécution re-mesure.\n", "\n", "*Suite (Phase 1) : fit J-lens par taille à `couche_ancre`, report qualité de sonde (accuracy/AUC `control` vs `trained`). See #8236.*" diff --git a/MyIA.AI.Notebooks/IIT/ICT-Series/README.md b/MyIA.AI.Notebooks/IIT/ICT-Series/README.md index 2a80e23f87..1606fe820a 100644 --- a/MyIA.AI.Notebooks/IIT/ICT-Series/README.md +++ b/MyIA.AI.Notebooks/IIT/ICT-Series/README.md @@ -232,7 +232,7 @@ La **strate 5 commence ici** : le substrat mesuré n'est plus un système dynami | [ICT-38-SLens-SelfLocation](ICT-38-SLens-SelfLocation.ipynb) | **S-Lens — la représentation porte-t-elle la bonne référence ?** *(strate 5, GPU requis, POC expérimental)* : quand la valeur à produire se trouve à une position déterminée par le **contenu** (et non par la position absolue du token), bancs synthétiques à vérité terrain exacte — lecture par tête et intervention causale appariée | [#15814](https://github.com/jsboige/CoursIA/issues/15814) | | [ICT-39-CompositionRegards](ICT-39-CompositionRegards.ipynb) | **Composition de regards** *(opération 12 « Composer des regards »)* : distinguer la lecture avant (`get`/`play`) de la demande arrière (`put`/`coplay`), les composer réellement, et construire le témoin falsifiable où deux regards composés divergent de leurs lectures isolées — prérequis légers (fonctions, composition, modulo 3) | [#12204](https://github.com/jsboige/CoursIA/issues/12204) | -| [ICT-43-Calibration-MultiEchelle](ICT-43-Calibration-MultiEchelle.ipynb) | **Calibration multi-échelle, Phase 0 — inventaire des SAE** *(ouverture Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) : SAE + J-lens multi-échelle, strate 5)* : la vérité-terrain des artefacts mesurée au Hub avant toute expérience — le body de l'Epic annonçait « 0.7B, 2B, 4B, 8B, 27B, 35B-A3B », le balayage live de l'org `Qwen` mesure autre chose : **7 tailles effectives** (1.7B, 8B en Qwen3 ; 2B, 9B, 27B, 35B-A3B en Qwen3.5 ; 30B-A3B), **aucune 0.7B ni 4B**, **deux régimes de sparsité** (L0_50/L0_100) par dépôt, le **27B en instruct seulement** (pas de jumeau `-Base`), le **W32K du 30B-A3B retiré** (404), et **toutes les couches couvertes** partout (`layer{0..N-1}.sae.pt`, hook `resid_post`). L'appariement mesuré : expansion **16×** sur les 5 tailles denses contre **64×** sur les deux A3B W128K (la comparaison stricte se fait en expansion homogène), ancrage mi-réseau `round(0.5·n_layers)` entier et disponible partout (12/14/16/18/20/24/32 — le pilote ICT-42 appliquait déjà cette règle). Fidélité de reconstruction (MSE, variance expliquée) = Phase 0c sur GPU-2, non mesurée ici | Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) | +| [ICT-43-Calibration-MultiEchelle](ICT-43-Calibration-MultiEchelle.ipynb) | **Calibration multi-échelle, Phase 0 — inventaire des SAE** *(ouverture Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) : SAE + J-lens multi-échelle, strate 5)* : la vérité-terrain des artefacts mesurée au Hub avant toute expérience — le body de l'Epic annonçait « 0.7B, 2B, 4B, 8B, 27B, 35B-A3B », le balayage live de l'org `Qwen` mesure autre chose : **7 tailles effectives** (1.7B, 8B en Qwen3 ; 2B, 9B, 27B, 35B-A3B en Qwen3.5 ; 30B-A3B), **aucune 0.7B ni 4B**, **deux régimes de sparsité** (L0_50/L0_100) par modèle (chaque dépôt porte un seul régime), le **27B en instruct seulement** (pas de jumeau `-Base`), **en régime L0_100 les deux A3B n'existent qu'en W128K** (pattern croisé L0_50→W32K / L0_100→W128K, identique sur 30B et 35B-A3B ; le dépôt `W32K-L0_100` du 30B-A3B répond 404), et **toutes les couches couvertes** partout (`layer{0..N-1}.sae.pt`, hook `resid_post`). L'appariement mesuré : expansion **16×** sur les 5 tailles denses contre **64×** sur les deux A3B W128K (la comparaison stricte se fait en expansion homogène), ancrage mi-réseau `round(0.5·n_layers)` entier et disponible partout (12/14/16/18/20/24/32 — le pilote ICT-42 appliquait déjà cette règle). Fidélité de reconstruction (MSE, variance expliquée) = Phase 0c sur GPU-2, non mesurée ici | Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) | ### Distillation externe — hors strates From 2e58c65f5fb350270252e9cc9c9341e01c8465df Mon Sep 17 00:00:00 2001 From: jsboige Date: Wed, 23 Sep 2026 06:07:07 +0200 Subject: [PATCH 3/3] fix(iit,#8236): ICT-43 reliquats markdown du dossier adjoint -- 404 reformule en absence d'enumeration (fait mesure) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Points 1 et 2 du dossier BLOCKED c.5788323311 : le « 404 » n'est mesure nulle part dans le notebook -- ce qui est mesure est l'absence de W32K-L0_100 dans l'enumeration des 14 depots. Reformulation en ce sens dans les cellules 4 et 13 (la conclusion 5 alignee sur la cellule 4, avec le regime nomme et la ligne 3 de la table rappelee), le README l.235 et le body de PR. Markdown seul, aucune cellule code touchee, aucune re-execution due (exception C.2). Co-Authored-By: Claude Sonnet 5 --- .../IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb | 4 ++-- MyIA.AI.Notebooks/IIT/ICT-Series/README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb b/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb index 667bd179f8..c1630124ac 100644 --- a/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb +++ b/MyIA.AI.Notebooks/IIT/ICT-Series/ICT-43-Calibration-MultiEchelle.ipynb @@ -360,7 +360,7 @@ "1. **Pas de SAE 0.7B ni 4B** : la liste annoncée (0.7B, 2B, 4B, 8B, 27B, 35B-A3B) ne correspond pas au terrain. Les tailles réellement couvertes forment un ensemble **différent mais comparable** : 1.7B et 8B (Qwen3) ; 2B, 9B, 27B, 35B-A3B (Qwen3.5) ; 30B-A3B (Qwen3). Soit **7 tailles** effectives au lieu de 6 annoncées.\n", "2. **Deux régimes de sparsité** (L0_50 et L0_100) existent pour chaque dépôt — l'issue ne les mentionnait pas ; le choix du régime devient un paramètre d'expérience à documenter.\n", "3. **Le 27B n'existe qu'en version instruct** (`Qwen3.5-27B`, sans suffixe `-Base`) : un mismatch base/instruct à inscrire dans les limites de la comparaison.\n", - "4. **En régime L0_100, les deux A3B (30B et 35B-A3B) n'existent qu'en W128K** — pattern croisé {L0_50→W32K, L0_100→W128K} strictement identique sur les deux tailles : une structure de publication du Hub, pas un retrait spécifique. Le fait mesuré derrière ce point : le dépôt `W32K-L0_100` du 30B-A3B répond 404 (jamais publié ou retiré) — la ligne W32K de la table ci-dessus est son régime L0_50, bien vivant.\n", + "4. **En régime L0_100, les deux A3B (30B et 35B-A3B) n'existent qu'en W128K** — pattern croisé {L0_50→W32K, L0_100→W128K} strictement identique sur les deux tailles : une structure de publication du Hub, pas un retrait spécifique. Le fait mesuré derrière ce point : le dépôt `W32K-L0_100` du 30B-A3B est absent de l'énumération des 14 dépôts du Hub (jamais publié ou retiré) — la ligne W32K de la table ci-dessus est son régime L0_50, bien vivant.\n", "\n", "Point positif inattendu : **chaque dépôt couvre toutes les couches** du modèle (`layer0.sae.pt` … `layer{N-1}.sae.pt`), pas seulement le mi-réseau — l'appariement de profondeur n'est pas contraint par la disponibilité." ] @@ -797,7 +797,7 @@ "2. **27B en instruct seulement** : le dépôt `Qwen3.5-27B` n'a pas de jumeau `-Base`. Toute comparaison impliquant le 27B mélange un modèle post-entraîné avec des modèles de base — à déclarer dans le plan d'expérience ou à exclure cette taille des comparaisons sensibles au post-training.\n", "3. **Hétérogénéité d'expansion** : 16× (5 tailles denses) contre 64× (2 tailles A3B en W128K). La comparaison stricte se fait en expansion homogène ; l'analyse d'échelle A3B est un régime séparé.\n", "4. **Qwen3.5 hybrides (attention linéaire 3:1)** : la profondeur relative n'égalise pas le mécanisme traversé. Le facteur de structure (dense vs MoE vs hybride) est un covariant à tracer, pas à ignorer. Le ratio 3:1 est lui-même un a priori (config `layer_types`), pas une mesure de ce notebook.\n", - "5. **Inventaire daté** : mesuré au Hub tel qu'il existe au moment de l'exécution (le W32K du 30B-A3B a ainsi été trouvé retiré — 404). Toute re-exécution re-mesure.\n", + "5. **Inventaire daté** : mesuré au Hub tel qu'il existe au moment de l'exécution — le dépôt `W32K-L0_100` du 30B-A3B est ainsi absent de l'énumération des 14 dépôts (jamais publié ou retiré), son `W32K-L0_50` restant la ligne 3 de la table. Toute re-exécution re-mesure.\n", "\n", "*Suite (Phase 1) : fit J-lens par taille à `couche_ancre`, report qualité de sonde (accuracy/AUC `control` vs `trained`). See #8236.*" ] diff --git a/MyIA.AI.Notebooks/IIT/ICT-Series/README.md b/MyIA.AI.Notebooks/IIT/ICT-Series/README.md index 1606fe820a..28f654e048 100644 --- a/MyIA.AI.Notebooks/IIT/ICT-Series/README.md +++ b/MyIA.AI.Notebooks/IIT/ICT-Series/README.md @@ -232,7 +232,7 @@ La **strate 5 commence ici** : le substrat mesuré n'est plus un système dynami | [ICT-38-SLens-SelfLocation](ICT-38-SLens-SelfLocation.ipynb) | **S-Lens — la représentation porte-t-elle la bonne référence ?** *(strate 5, GPU requis, POC expérimental)* : quand la valeur à produire se trouve à une position déterminée par le **contenu** (et non par la position absolue du token), bancs synthétiques à vérité terrain exacte — lecture par tête et intervention causale appariée | [#15814](https://github.com/jsboige/CoursIA/issues/15814) | | [ICT-39-CompositionRegards](ICT-39-CompositionRegards.ipynb) | **Composition de regards** *(opération 12 « Composer des regards »)* : distinguer la lecture avant (`get`/`play`) de la demande arrière (`put`/`coplay`), les composer réellement, et construire le témoin falsifiable où deux regards composés divergent de leurs lectures isolées — prérequis légers (fonctions, composition, modulo 3) | [#12204](https://github.com/jsboige/CoursIA/issues/12204) | -| [ICT-43-Calibration-MultiEchelle](ICT-43-Calibration-MultiEchelle.ipynb) | **Calibration multi-échelle, Phase 0 — inventaire des SAE** *(ouverture Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) : SAE + J-lens multi-échelle, strate 5)* : la vérité-terrain des artefacts mesurée au Hub avant toute expérience — le body de l'Epic annonçait « 0.7B, 2B, 4B, 8B, 27B, 35B-A3B », le balayage live de l'org `Qwen` mesure autre chose : **7 tailles effectives** (1.7B, 8B en Qwen3 ; 2B, 9B, 27B, 35B-A3B en Qwen3.5 ; 30B-A3B), **aucune 0.7B ni 4B**, **deux régimes de sparsité** (L0_50/L0_100) par modèle (chaque dépôt porte un seul régime), le **27B en instruct seulement** (pas de jumeau `-Base`), **en régime L0_100 les deux A3B n'existent qu'en W128K** (pattern croisé L0_50→W32K / L0_100→W128K, identique sur 30B et 35B-A3B ; le dépôt `W32K-L0_100` du 30B-A3B répond 404), et **toutes les couches couvertes** partout (`layer{0..N-1}.sae.pt`, hook `resid_post`). L'appariement mesuré : expansion **16×** sur les 5 tailles denses contre **64×** sur les deux A3B W128K (la comparaison stricte se fait en expansion homogène), ancrage mi-réseau `round(0.5·n_layers)` entier et disponible partout (12/14/16/18/20/24/32 — le pilote ICT-42 appliquait déjà cette règle). Fidélité de reconstruction (MSE, variance expliquée) = Phase 0c sur GPU-2, non mesurée ici | Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) | +| [ICT-43-Calibration-MultiEchelle](ICT-43-Calibration-MultiEchelle.ipynb) | **Calibration multi-échelle, Phase 0 — inventaire des SAE** *(ouverture Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) : SAE + J-lens multi-échelle, strate 5)* : la vérité-terrain des artefacts mesurée au Hub avant toute expérience — le body de l'Epic annonçait « 0.7B, 2B, 4B, 8B, 27B, 35B-A3B », le balayage live de l'org `Qwen` mesure autre chose : **7 tailles effectives** (1.7B, 8B en Qwen3 ; 2B, 9B, 27B, 35B-A3B en Qwen3.5 ; 30B-A3B), **aucune 0.7B ni 4B**, **deux régimes de sparsité** (L0_50/L0_100) par modèle (chaque dépôt porte un seul régime), le **27B en instruct seulement** (pas de jumeau `-Base`), **en régime L0_100 les deux A3B n'existent qu'en W128K** (pattern croisé L0_50→W32K / L0_100→W128K, identique sur 30B et 35B-A3B ; le dépôt `W32K-L0_100` du 30B-A3B est absent de l'énumération des 14 dépôts), et **toutes les couches couvertes** partout (`layer{0..N-1}.sae.pt`, hook `resid_post`). L'appariement mesuré : expansion **16×** sur les 5 tailles denses contre **64×** sur les deux A3B W128K (la comparaison stricte se fait en expansion homogène), ancrage mi-réseau `round(0.5·n_layers)` entier et disponible partout (12/14/16/18/20/24/32 — le pilote ICT-42 appliquait déjà cette règle). Fidélité de reconstruction (MSE, variance expliquée) = Phase 0c sur GPU-2, non mesurée ici | Epic [#8236](https://github.com/jsboige/CoursIA/issues/8236) | ### Distillation externe — hors strates