diff --git a/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/README.md b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/README.md index fc6f1976c2..650c3bc162 100644 --- a/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/README.md +++ b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/README.md @@ -13,7 +13,7 @@ Le Transformer canonique (attention multi-tête, PE additif) reste couvert par l | `TV-00c` — mixture of experts | livre ailleurs | routage top-k, facteur de capacite, perte d'equilibrage — livre comme [3.4c-MoE-from-scratch](../../../ML/DataScienceWithAgents/03-Deep-Learning/3.4c-MoE-from-scratch.ipynb) dans la serie 03-Deep-Learning (accretion du 3.4, #16151 §5.2) | | `TV-00d-Encodeurs-from-scratch.ipynb` | livre | les deux familles absentes du bloc A : encodeur seul (BERT, MLM 80/10/10) et encodeur-décodeur (T5, attention croisée) — ablation par position à preuve droite (sujet : 63,7 % bi contre 31,6 % causal) contre contrôle à preuve gauche (verbe : 41,9 % contre 90,0 %), transfert de masque qui s'effondre (43,1 → 24,7 %), seq2seq de normalisation de dates (exact-match 43,2 % glouton, faisceau k=3 42,0 %), alignement appris de l'attention croisée lu position par position | | `TV-01-Attention-Variants-SOTA.ipynb` | livre | le vrai Mistral-7B v0.1 (GQA 8/32, RoPE theta 10 000 reconstruit depuis les poids, SWA 4096) charge NF4 via `transformers` : KV-cache formule contre mesure (248 contre 256 Mio a T=2048), champ receptif 131 041 > contexte max, prefill/decodage en deux regimes, ppl 7.95 / 1.490 bpc sur WikiText-2, tableau bloc A vs bloc B (item 7) | -| `TV-02-MoE-SOTA.ipynb` | livre | le vrai OLMoE-1B-7B release 0125 (64 experts top-8, 6,9 Md params dont 18,5 % actifs par jeton, bf16 plein — le §1 mesure pourquoi le 4-bit ne s'applique pas) : routeur PLAT demontre (entropie softmax quasi max, gap top-8->top-9 ~4e-5) malgre une charge structuree (entropie 3,89 vs ln 64), capacite du 3.4c rejouee sur la charge reelle (91,5 % servis a c=1,0 — pourquoi dropless), specialisation douce par classe de jetons, tableau 3.4c vs industrie (431 contre 194 LOC) | +| `TV-02-MoE-SOTA.ipynb` | livre | le vrai OLMoE-1B-7B release 0125 (64 experts top-8, 6,9 Md params dont 18,5 % actifs par jeton, bf16 plein — le §1 mesure pourquoi le 4-bit ne s'applique pas) : routeur PLAT demontre (entropie softmax quasi max, gap top-8->top-9 ~4e-5) malgre une charge structuree (entropie 3,89 vs ln 64), capacite du 3.4c rejouee sur la charge reelle (91,5 % servis a c=1,0 — pourquoi dropless), specialisation douce par classe de jetons, tableau 3.4c vs industrie (436 contre 211 LOC, volumes de code relus sur disque a l'execution) | | Bloc B — SOTA | livre | TV-01 (attention) + TV-02 (MoE) livres — les memes mesures sur des modeles industriels charges via `transformers` | | `TV-03-Internalisation-CoT.ipynb` | livre | internalisation du raisonnement (Huang et al. 2026, arXiv 2605.28600) sur tache marqueurs multi-sauts : CoT supervise vs answer-only multi-seed, indirection a chaine informative (separation non reproduite — resultat negatif mesure), marche guidee K=2/K=3 (cloturee sans separation positive), organes `tv/model.py` + `tv/task.py` extraits du carnet | | `TV-04-DiscoLoop.ipynb` | livre | boucles et canaux mixtes (Fu et al. 2026, arXiv 2607.00341) sur l'indirection double (two-hop a entite-pont) : boucle a poids partages egale le profond a 2,9x moins de parametres, DiscoLoop deux-canaux juge NO BEATS a l'echelle jouet (edge -1,99 sigma, DM p < 0.0001), diagnostic decodabilite/alignement du pont dans la direction du papier, realignement sans re-entrainement neutre (deficit situe en amont, dans le stockage du pont, selon les lectures testees), organe `tv/loop.py` | diff --git a/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-01-Attention-Variants-SOTA.ipynb b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-01-Attention-Variants-SOTA.ipynb index 92bcb1619c..1c2fb7633c 100644 --- a/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-01-Attention-Variants-SOTA.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-01-Attention-Variants-SOTA.ipynb @@ -5,10 +5,10 @@ "id": "b95e7b36", "metadata": { "papermill": { - "duration": 0.003008, - "end_time": "2026-10-31T20:01:35.113984+00:00", + "duration": 0.008453, + "end_time": "2026-11-03T13:31:00.471708", "exception": false, - "start_time": "2026-10-31T20:01:35.110976+00:00", + "start_time": "2026-11-03T13:31:00.463255", "status": "completed" }, "tags": [] @@ -41,10 +41,10 @@ "id": "d11cf77c", "metadata": { "papermill": { - "duration": 0.003084, - "end_time": "2026-10-31T20:01:35.120382+00:00", + "duration": 0.007739, + "end_time": "2026-11-03T13:31:00.488377", "exception": false, - "start_time": "2026-10-31T20:01:35.117298+00:00", + "start_time": "2026-11-03T13:31:00.480638", "status": "completed" }, "tags": [] @@ -74,16 +74,16 @@ "id": "6da0af4a", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:01:35.130246Z", - "iopub.status.busy": "2026-10-31T20:01:35.129954Z", - "iopub.status.idle": "2026-10-31T20:02:18.945603Z", - "shell.execute_reply": "2026-10-31T20:02:18.944957Z" + "iopub.execute_input": "2026-11-03T13:31:00.505451Z", + "iopub.status.busy": "2026-11-03T13:31:00.505451Z", + "iopub.status.idle": "2026-11-03T13:31:11.651419Z", + "shell.execute_reply": "2026-11-03T13:31:11.651419Z" }, "papermill": { - "duration": 43.822716, - "end_time": "2026-10-31T20:02:18.948195+00:00", + "duration": 11.155169, + "end_time": "2026-11-03T13:31:11.652423", "exception": false, - "start_time": "2026-10-31T20:01:35.125479+00:00", + "start_time": "2026-11-03T13:31:00.497254", "status": "completed" }, "tags": [] @@ -93,7 +93,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "device: cuda:0 | torch 2.8.0+cu126 | transformers 5.12.1\n" + "device: cuda:0 | torch 2.12.1+cu126 | transformers 5.13.0\n" ] } ], @@ -130,10 +130,10 @@ "id": "e17fe00b", "metadata": { "papermill": { - "duration": 0.002784, - "end_time": "2026-10-31T20:02:18.953700+00:00", + "duration": 0.007023, + "end_time": "2026-11-03T13:31:11.665464", "exception": false, - "start_time": "2026-10-31T20:02:18.950916+00:00", + "start_time": "2026-11-03T13:31:11.658441", "status": "completed" }, "tags": [] @@ -154,16 +154,16 @@ "id": "9fea554e", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:18.960060Z", - "iopub.status.busy": "2026-10-31T20:02:18.959650Z", - "iopub.status.idle": "2026-10-31T20:02:19.469174Z", - "shell.execute_reply": "2026-10-31T20:02:19.468066Z" + "iopub.execute_input": "2026-11-03T13:31:11.681528Z", + "iopub.status.busy": "2026-11-03T13:31:11.681528Z", + "iopub.status.idle": "2026-11-03T13:31:12.140000Z", + "shell.execute_reply": "2026-11-03T13:31:12.139488Z" }, "papermill": { - "duration": 0.514346, - "end_time": "2026-10-31T20:02:19.470620+00:00", + "duration": 0.467503, + "end_time": "2026-11-03T13:31:12.140000", "exception": false, - "start_time": "2026-10-31T20:02:18.956274+00:00", + "start_time": "2026-11-03T13:31:11.672497", "status": "completed" }, "tags": [] @@ -218,10 +218,10 @@ "id": "1b249a05", "metadata": { "papermill": { - "duration": 0.003021, - "end_time": "2026-10-31T20:02:19.479394+00:00", + "duration": 0.005642, + "end_time": "2026-11-03T13:31:12.151180", "exception": false, - "start_time": "2026-10-31T20:02:19.476373+00:00", + "start_time": "2026-11-03T13:31:12.145538", "status": "completed" }, "tags": [] @@ -243,10 +243,10 @@ "id": "4391f199", "metadata": { "papermill": { - "duration": 0.004677, - "end_time": "2026-10-31T20:02:19.486918+00:00", + "duration": 0.00488, + "end_time": "2026-11-03T13:31:12.162087", "exception": false, - "start_time": "2026-10-31T20:02:19.482241+00:00", + "start_time": "2026-11-03T13:31:12.157207", "status": "completed" }, "tags": [] @@ -255,7 +255,7 @@ "## 2. Charger 7 milliards de paramètres en 4 bits\n", "\n", "Le miroir `unsloth/mistral-7b-bnb-4bit` embarque sa propre `quantization_config` NF4 (bitsandbytes) :\n", - "`from_pretrained` la lit, et les 7,24 milliards de paramètres descendent en ~4 Go au lieu de ~14,4\n", + "`from_pretrained` la lit, et les 7,24 milliards de paramètres descendent en ~4 Go au lieu de ~14,5\n", "en float16. On mesure le temps de chargement, l'empreinte VRAM réelle — et un piège de comptage :\n", "la somme des `numel` des tenseurs chargés ne rend **pas** le nombre de paramètres, parce que le\n", "stockage NF4 range deux paramètres par octet. Trois nombres, un modèle." @@ -267,26 +267,33 @@ "id": "024f2206", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:19.500310Z", - "iopub.status.busy": "2026-10-31T20:02:19.499920Z", - "iopub.status.idle": "2026-10-31T20:02:31.554610Z", - "shell.execute_reply": "2026-10-31T20:02:31.553383Z" + "iopub.execute_input": "2026-11-03T13:31:12.173786Z", + "iopub.status.busy": "2026-11-03T13:31:12.173786Z", + "iopub.status.idle": "2026-11-03T13:31:20.418731Z", + "shell.execute_reply": "2026-11-03T13:31:20.418209Z" }, "papermill": { - "duration": 12.062704, - "end_time": "2026-10-31T20:02:31.555592+00:00", + "duration": 8.252073, + "end_time": "2026-11-03T13:31:20.419969", "exception": false, - "start_time": "2026-10-31T20:02:19.492888+00:00", + "start_time": "2026-11-03T13:31:12.167896", "status": "completed" }, "tags": [] }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "W1103 14:31:15.523000 54992 site-packages\\torch\\utils\\flop_counter.py:29] triton not found; flop counting will not work for triton kernels\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "chargement : 12 s (premier run : telechargement ~4 Go inclus, ensuite cache)\n", + "chargement : 8 s (premier run : telechargement ~4 Go inclus, ensuite cache)\n", "VRAM allouee 3.84 Gio | reservee 3.85 Gio\n", "parametres comptes depuis la config : 7,241,732,096\n", "numel somme sur les tenseurs charges : 3,752,071,168\n", @@ -316,10 +323,10 @@ "id": "2e170a6e", "metadata": { "papermill": { - "duration": 0.002812, - "end_time": "2026-10-31T20:02:31.561493+00:00", + "duration": 0.009937, + "end_time": "2026-11-03T13:31:20.440625", "exception": false, - "start_time": "2026-10-31T20:02:31.558681+00:00", + "start_time": "2026-11-03T13:31:20.430688", "status": "completed" }, "tags": [] @@ -332,7 +339,7 @@ "moins : bitsandbytes range deux paramètres par octet `uint8` — même le comptage est une décision\n", "d'implémentation. La **VRAM** enfin, ~0,57 octet par paramètre, tient la promesse NF4 (0,50)\n", "augmentée de la part des tampons restés en float16 (embeddings, tête, normes) et de la double\n", - "quantification. En float16 pur, les poids seuls dépasseraient 14 Gio avant le premier jeton : le\n", + "quantification. En float16 pur, les poids seuls dépasseraient 14 Go avant le premier jeton : le\n", "4-bit est ce qui fait tenir un 7B sur un GPU 16 Go. La leçon du TV-00b se rejoue à une autre\n", "échelle — chaque facteur de réduction achète un palier d'usage." ] @@ -342,10 +349,10 @@ "id": "e37710e1", "metadata": { "papermill": { - "duration": 0.002844, - "end_time": "2026-10-31T20:02:31.567084+00:00", + "duration": 0.009364, + "end_time": "2026-11-03T13:31:20.459025", "exception": false, - "start_time": "2026-10-31T20:02:31.564240+00:00", + "start_time": "2026-11-03T13:31:20.449661", "status": "completed" }, "tags": [] @@ -367,16 +374,16 @@ "id": "762cfcad", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:31.576543Z", - "iopub.status.busy": "2026-10-31T20:02:31.576053Z", - "iopub.status.idle": "2026-10-31T20:02:31.581533Z", - "shell.execute_reply": "2026-10-31T20:02:31.580495Z" + "iopub.execute_input": "2026-11-03T13:31:20.479277Z", + "iopub.status.busy": "2026-11-03T13:31:20.478277Z", + "iopub.status.idle": "2026-11-03T13:31:20.485049Z", + "shell.execute_reply": "2026-11-03T13:31:20.484007Z" }, "papermill": { - "duration": 0.012676, - "end_time": "2026-10-31T20:02:31.582816+00:00", + "duration": 0.018891, + "end_time": "2026-11-03T13:31:20.486629", "exception": false, - "start_time": "2026-10-31T20:02:31.570140+00:00", + "start_time": "2026-11-03T13:31:20.467738", "status": "completed" }, "tags": [] @@ -413,16 +420,16 @@ "id": "9f75e58e", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:31.590207Z", - "iopub.status.busy": "2026-10-31T20:02:31.589912Z", - "iopub.status.idle": "2026-10-31T20:02:34.030373Z", - "shell.execute_reply": "2026-10-31T20:02:34.029319Z" + "iopub.execute_input": "2026-11-03T13:31:20.511498Z", + "iopub.status.busy": "2026-11-03T13:31:20.510973Z", + "iopub.status.idle": "2026-11-03T13:31:21.727836Z", + "shell.execute_reply": "2026-11-03T13:31:21.727328Z" }, "papermill": { - "duration": 2.446008, - "end_time": "2026-10-31T20:02:34.031759+00:00", + "duration": 1.231638, + "end_time": "2026-11-03T13:31:21.728347", "exception": false, - "start_time": "2026-10-31T20:02:31.585751+00:00", + "start_time": "2026-11-03T13:31:20.496709", "status": "completed" }, "tags": [] @@ -459,10 +466,10 @@ "id": "6ee110ef", "metadata": { "papermill": { - "duration": 0.002991, - "end_time": "2026-10-31T20:02:34.038419+00:00", + "duration": 0.007147, + "end_time": "2026-11-03T13:31:21.744363", "exception": false, - "start_time": "2026-10-31T20:02:34.035428+00:00", + "start_time": "2026-11-03T13:31:21.737216", "status": "completed" }, "tags": [] @@ -483,10 +490,10 @@ "id": "2b0792f8", "metadata": { "papermill": { - "duration": 0.00303, - "end_time": "2026-10-31T20:02:34.044502+00:00", + "duration": 0.005083, + "end_time": "2026-11-03T13:31:21.755143", "exception": false, - "start_time": "2026-10-31T20:02:34.041472+00:00", + "start_time": "2026-11-03T13:31:21.750060", "status": "completed" }, "tags": [] @@ -507,16 +514,16 @@ "id": "77e8f285", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:34.051957Z", - "iopub.status.busy": "2026-10-31T20:02:34.051447Z", - "iopub.status.idle": "2026-10-31T20:02:34.331294Z", - "shell.execute_reply": "2026-10-31T20:02:34.330360Z" + "iopub.execute_input": "2026-11-03T13:31:21.770549Z", + "iopub.status.busy": "2026-11-03T13:31:21.770549Z", + "iopub.status.idle": "2026-11-03T13:31:21.897530Z", + "shell.execute_reply": "2026-11-03T13:31:21.897014Z" }, "papermill": { - "duration": 0.285339, - "end_time": "2026-10-31T20:02:34.332699+00:00", + "duration": 0.137047, + "end_time": "2026-11-03T13:31:21.899624", "exception": false, - "start_time": "2026-10-31T20:02:34.047360+00:00", + "start_time": "2026-11-03T13:31:21.762577", "status": "completed" }, "tags": [] @@ -554,10 +561,10 @@ "id": "3ca0c200", "metadata": { "papermill": { - "duration": 0.0035, - "end_time": "2026-10-31T20:02:34.339571+00:00", + "duration": 0.007907, + "end_time": "2026-11-03T13:31:21.917401", "exception": false, - "start_time": "2026-10-31T20:02:34.336071+00:00", + "start_time": "2026-11-03T13:31:21.909494", "status": "completed" }, "tags": [] @@ -580,10 +587,10 @@ "id": "4dcc0235", "metadata": { "papermill": { - "duration": 0.003182, - "end_time": "2026-10-31T20:02:34.346452+00:00", + "duration": 0.009805, + "end_time": "2026-11-03T13:31:21.936567", "exception": false, - "start_time": "2026-10-31T20:02:34.343270+00:00", + "start_time": "2026-11-03T13:31:21.926762", "status": "completed" }, "tags": [] @@ -604,16 +611,16 @@ "id": "7ed99798", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:34.353414Z", - "iopub.status.busy": "2026-10-31T20:02:34.353099Z", - "iopub.status.idle": "2026-10-31T20:02:43.483504Z", - "shell.execute_reply": "2026-10-31T20:02:43.482093Z" + "iopub.execute_input": "2026-11-03T13:31:21.957610Z", + "iopub.status.busy": "2026-11-03T13:31:21.957092Z", + "iopub.status.idle": "2026-11-03T13:31:28.103189Z", + "shell.execute_reply": "2026-11-03T13:31:28.102673Z" }, "papermill": { - "duration": 9.135362, - "end_time": "2026-10-31T20:02:43.484781+00:00", + "duration": 6.15625, + "end_time": "2026-11-03T13:31:28.103189", "exception": false, - "start_time": "2026-10-31T20:02:34.349419+00:00", + "start_time": "2026-11-03T13:31:21.946939", "status": "completed" }, "tags": [] @@ -626,6 +633,14 @@ "[transformers] Both `max_new_tokens` (=4) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\\AppData\\Roaming\\Python\\Python312\\site-packages\\bitsandbytes\\backends\\cuda\\ops.py:468: FutureWarning: _check_is_size will be removed in a future PyTorch release along with guard_size_oblivious. Use _check(i >= 0) instead.\n", + " torch._check_is_size(blocksize)\n" + ] + }, { "name": "stderr", "output_type": "stream", @@ -637,10 +652,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "prefill T= 128 : 123.7 ms ( 967 us/jeton)\n", - "prefill T= 1024 : 425.5 ms ( 415 us/jeton)\n", - "prefill T= 4096 : 1240.4 ms ( 303 us/jeton)\n", - "decodage (ctx court) : 144.2 ms/jeton ( 6.9 jetons/s)\n" + "prefill T= 128 : 138.3 ms ( 1080 us/jeton)\n", + "prefill T= 1024 : 202.9 ms ( 198 us/jeton)\n", + "prefill T= 4096 : 561.9 ms ( 137 us/jeton)\n", + "decodage (ctx court) : 116.8 ms/jeton ( 8.6 jetons/s)\n" ] } ], @@ -679,10 +694,10 @@ "id": "8badce5b", "metadata": { "papermill": { - "duration": 0.004782, - "end_time": "2026-10-31T20:02:43.493686+00:00", + "duration": 0.00935, + "end_time": "2026-11-03T13:31:28.123707", "exception": false, - "start_time": "2026-10-31T20:02:43.488904+00:00", + "start_time": "2026-11-03T13:31:28.114357", "status": "completed" }, "tags": [] @@ -705,10 +720,10 @@ "id": "e5b7c2a9", "metadata": { "papermill": { - "duration": 0.0053, - "end_time": "2026-10-31T20:02:43.504878+00:00", + "duration": 0.008832, + "end_time": "2026-11-03T13:31:28.142598", "exception": false, - "start_time": "2026-10-31T20:02:43.499578+00:00", + "start_time": "2026-11-03T13:31:28.133766", "status": "completed" }, "tags": [] @@ -722,10 +737,10 @@ "id": "fa2c0ee5", "metadata": { "papermill": { - "duration": 0.00518, - "end_time": "2026-10-31T20:02:43.515521+00:00", + "duration": 0.009882, + "end_time": "2026-11-03T13:31:28.162383", "exception": false, - "start_time": "2026-10-31T20:02:43.510341+00:00", + "start_time": "2026-11-03T13:31:28.152501", "status": "completed" }, "tags": [] @@ -746,63 +761,21 @@ "id": "4f071d55", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:43.523772Z", - "iopub.status.busy": "2026-10-31T20:02:43.523360Z", - "iopub.status.idle": "2026-10-31T20:02:57.300162Z", - "shell.execute_reply": "2026-10-31T20:02:57.299319Z" + "iopub.execute_input": "2026-11-03T13:31:28.182468Z", + "iopub.status.busy": "2026-11-03T13:31:28.181944Z", + "iopub.status.idle": "2026-11-03T13:31:35.073240Z", + "shell.execute_reply": "2026-11-03T13:31:35.072720Z" }, "papermill": { - "duration": 13.782286, - "end_time": "2026-10-31T20:02:57.301194+00:00", + "duration": 6.902199, + "end_time": "2026-11-03T13:31:35.074265", "exception": false, - "start_time": "2026-10-31T20:02:43.518908+00:00", + "start_time": "2026-11-03T13:31:28.172066", "status": "completed" }, "tags": [] }, "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "24a0493f0b434adb99d77febe48433e0", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Generating test split: 0%| | 0/4358 [00:00 4,00 Gio (formule) | 383\n", - "TV-01 SOTA (ce notebook) | 7.24 Md params | GQA 8/32 confirme | VRAM 3.8 Gio | 144.2 ms/jeton | ppl 7.95 / 1.490 bpc | 152\n", + "TV-00b attention (commite) | jouet + configs publiees | Mistral 7B a T=32768 : 16,00 -> 4,00 Gio (formule) | 388\n", + "TV-01 SOTA (ce notebook) | 7.24 Md params | GQA 8/32 confirme | VRAM 3.8 Gio | 116.8 ms/jeton | ppl 7.95 / 1.490 bpc | 166\n", "\n", "cote industrie : modeling_mistral.py seul = 493 lignes (hors noyaux fused, quantization, generation)\n" ] } ], "source": [ + "import inspect\n", + "import pathlib\n", + "import sys\n", + "\n", + "# Les volumes de code compares dans cette table sont lus SUR LE DISQUE au\n", + "# moment de l'execution (organe `tv.loc`) : une valeur figee en dur derivait\n", + "# des que le carnet voisin evoluait, et le carnet ne pouvait pas se voir\n", + "# deriver -- sa propre valeur etait un litteral. Issue #24421.\n", + "SERIE = next((p for p in [pathlib.Path.cwd(), *pathlib.Path.cwd().parents]\n", + " if (p / \"tv\" / \"loc.py\").exists()), None)\n", + "if SERIE is None:\n", + " raise FileNotFoundError(\n", + " \"repertoire de la serie introuvable : executer ce carnet depuis \"\n", + " \"MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants\")\n", + "sys.path.insert(0, str(SERIE))\n", + "from tv.loc import carnet # noqa: E402\n", + "\n", "src_mistral = pathlib.Path(inspect.getsourcefile(type(model))).read_text(encoding=\"utf-8\")\n", "LOC_INDUSTRIE = len(src_mistral.splitlines())\n", + "LOC_00A = carnet(\"TV-00a-RoPE-from-scratch.ipynb\")\n", + "LOC_00B = carnet(\"TV-00b-Attention-Variants-from-scratch.ipynb\")\n", + "LOC_SOI = carnet(\"TV-01-Attention-Variants-SOTA.ipynb\")\n", "lignes_tab = [\n", " (\"TV-00a RoPE (commite)\", \"invariance d(k_m,k_n) par m-n, mesuree\",\n", - " \"jouet d=64\", \"n.r.\", \"182\"),\n", + " \"jouet d=64\", \"n.r.\", str(LOC_00A)),\n", " (\"TV-00b attention (commite)\", \"formule KV exacte ; bande O(T*W) ; facteur GQA 4.0x calcule\",\n", - " \"jouet + configs publiees\", \"Mistral 7B a T=32768 : 16,00 -> 4,00 Gio (formule)\", \"383\"),\n", + " \"jouet + configs publiees\", \"Mistral 7B a T=32768 : 16,00 -> 4,00 Gio (formule)\", str(LOC_00B)),\n", " (\"TV-01 SOTA (ce notebook)\", \"le modele REEL : config, poids, VRAM, latence, corpus\",\n", " f\"{N_PARAMS_CFG / 1e9:.2f} Md params\",\n", " f\"GQA 8/32 confirme | VRAM {VRAM_ALLOC:.1f} Gio | {MS_DEC:.1f} ms/jeton | \"\n", - " f\"ppl {PPL:.2f} / {BPC:.3f} bpc\", \"152\"),\n", + " f\"ppl {PPL:.2f} / {BPC:.3f} bpc\", str(LOC_SOI)),\n", "]\n", "print(f\"{'livrable':26s} | {'echelle':22s} | {'mesure qui compte':60s} | LOC\")\n", "print(\"-\" * 130)\n", @@ -959,10 +957,10 @@ "id": "88e83e41", "metadata": { "papermill": { - "duration": 0.003139, - "end_time": "2026-10-31T20:02:57.336573+00:00", + "duration": 0.009197, + "end_time": "2026-11-03T13:31:35.209483", "exception": false, - "start_time": "2026-10-31T20:02:57.333434+00:00", + "start_time": "2026-11-03T13:31:35.200286", "status": "completed" }, "tags": [] @@ -984,10 +982,10 @@ "id": "c47ace48", "metadata": { "papermill": { - "duration": 0.003065, - "end_time": "2026-10-31T20:02:57.342949+00:00", + "duration": 0.009487, + "end_time": "2026-11-03T13:31:35.229401", "exception": false, - "start_time": "2026-10-31T20:02:57.339884+00:00", + "start_time": "2026-11-03T13:31:35.219914", "status": "completed" }, "tags": [] @@ -1013,16 +1011,16 @@ "id": "aeb916a2", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:57.350690Z", - "iopub.status.busy": "2026-10-31T20:02:57.350247Z", - "iopub.status.idle": "2026-10-31T20:02:57.353771Z", - "shell.execute_reply": "2026-10-31T20:02:57.353233Z" + "iopub.execute_input": "2026-11-03T13:31:35.251423Z", + "iopub.status.busy": "2026-11-03T13:31:35.250896Z", + "iopub.status.idle": "2026-11-03T13:31:35.254559Z", + "shell.execute_reply": "2026-11-03T13:31:35.254559Z" }, "papermill": { - "duration": 0.008325, - "end_time": "2026-10-31T20:02:57.354570+00:00", + "duration": 0.0156, + "end_time": "2026-11-03T13:31:35.255578", "exception": false, - "start_time": "2026-10-31T20:02:57.346245+00:00", + "start_time": "2026-11-03T13:31:35.239978", "status": "completed" }, "tags": [] @@ -1040,10 +1038,10 @@ "id": "fb834055", "metadata": { "papermill": { - "duration": 0.003189, - "end_time": "2026-10-31T20:02:57.361012+00:00", + "duration": 0.010512, + "end_time": "2026-11-03T13:31:35.276373", "exception": false, - "start_time": "2026-10-31T20:02:57.357823+00:00", + "start_time": "2026-11-03T13:31:35.265861", "status": "completed" }, "tags": [] @@ -1071,16 +1069,16 @@ "id": "e66b1219", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:57.368027Z", - "iopub.status.busy": "2026-10-31T20:02:57.367779Z", - "iopub.status.idle": "2026-10-31T20:02:57.370438Z", - "shell.execute_reply": "2026-10-31T20:02:57.370004Z" + "iopub.execute_input": "2026-11-03T13:31:35.297954Z", + "iopub.status.busy": "2026-11-03T13:31:35.297431Z", + "iopub.status.idle": "2026-11-03T13:31:35.301076Z", + "shell.execute_reply": "2026-11-03T13:31:35.300551Z" }, "papermill": { - "duration": 0.007175, - "end_time": "2026-10-31T20:02:57.371236+00:00", + "duration": 0.015671, + "end_time": "2026-11-03T13:31:35.302110", "exception": false, - "start_time": "2026-10-31T20:02:57.364061+00:00", + "start_time": "2026-11-03T13:31:35.286439", "status": "completed" }, "tags": [] @@ -1099,10 +1097,10 @@ "id": "d50f5d3c", "metadata": { "papermill": { - "duration": 0.00303, - "end_time": "2026-10-31T20:02:57.377432+00:00", + "duration": 0.010908, + "end_time": "2026-11-03T13:31:35.322196", "exception": false, - "start_time": "2026-10-31T20:02:57.374402+00:00", + "start_time": "2026-11-03T13:31:35.311288", "status": "completed" }, "tags": [] @@ -1130,16 +1128,16 @@ "id": "63245791", "metadata": { "execution": { - "iopub.execute_input": "2026-10-31T20:02:57.385250Z", - "iopub.status.busy": "2026-10-31T20:02:57.385012Z", - "iopub.status.idle": "2026-10-31T20:02:57.387941Z", - "shell.execute_reply": "2026-10-31T20:02:57.387353Z" + "iopub.execute_input": "2026-11-03T13:31:35.341269Z", + "iopub.status.busy": "2026-11-03T13:31:35.341269Z", + "iopub.status.idle": "2026-11-03T13:31:35.344975Z", + "shell.execute_reply": "2026-11-03T13:31:35.344975Z" }, "papermill": { - "duration": 0.007863, - "end_time": "2026-10-31T20:02:57.388776+00:00", + "duration": 0.013331, + "end_time": "2026-11-03T13:31:35.345979", "exception": false, - "start_time": "2026-10-31T20:02:57.380913+00:00", + "start_time": "2026-11-03T13:31:35.332648", "status": "completed" }, "tags": [] @@ -1158,10 +1156,10 @@ "id": "5d2c6500", "metadata": { "papermill": { - "duration": 0.002937, - "end_time": "2026-10-31T20:02:57.395042+00:00", + "duration": 0.010115, + "end_time": "2026-11-03T13:31:35.366454", "exception": false, - "start_time": "2026-10-31T20:02:57.392105+00:00", + "start_time": "2026-11-03T13:31:35.356339", "status": "completed" }, "tags": [] @@ -1208,18 +1206,18 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.3" + "version": "3.12.13" }, "papermill": { "default_parameters": {}, - "duration": 86.803445, - "end_time": "2026-10-31T20:02:59.947008+00:00", + "duration": 39.933751, + "end_time": "2026-11-03T13:31:37.848925", "environment_variables": {}, "exception": null, "input_path": "TV-01-Attention-Variants-SOTA.ipynb", "output_path": "TV-01-Attention-Variants-SOTA.ipynb", "parameters": {}, - "start_time": "2026-10-31T20:01:33.143563+00:00", + "start_time": "2026-11-03T13:30:57.915174", "version": "2.6.0" }, "widgets": { @@ -2673,4 +2671,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-02-MoE-SOTA.ipynb b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-02-MoE-SOTA.ipynb index db00c41b53..bd4cb69d87 100644 --- a/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-02-MoE-SOTA.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-02-MoE-SOTA.ipynb @@ -5,10 +5,10 @@ "id": "e7530ec8", "metadata": { "papermill": { - "duration": 0.003775, - "end_time": "2026-11-01T04:35:11.066047+00:00", + "duration": 0.005658, + "end_time": "2026-11-03T13:31:54.131026", "exception": false, - "start_time": "2026-11-01T04:35:11.062272+00:00", + "start_time": "2026-11-03T13:31:54.125368", "status": "completed" }, "tags": [] @@ -38,10 +38,10 @@ "id": "6287d3bf", "metadata": { "papermill": { - "duration": 0.003113, - "end_time": "2026-11-01T04:35:11.072650+00:00", + "duration": 0.004985, + "end_time": "2026-11-03T13:31:54.141284", "exception": false, - "start_time": "2026-11-01T04:35:11.069537+00:00", + "start_time": "2026-11-03T13:31:54.136299", "status": "completed" }, "tags": [] @@ -62,16 +62,16 @@ "id": "723e89cd", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:35:11.080076Z", - "iopub.status.busy": "2026-11-01T04:35:11.079783Z", - "iopub.status.idle": "2026-11-01T04:35:44.675542Z", - "shell.execute_reply": "2026-11-01T04:35:44.674963Z" + "iopub.execute_input": "2026-11-03T13:31:54.148821Z", + "iopub.status.busy": "2026-11-03T13:31:54.147820Z", + "iopub.status.idle": "2026-11-03T13:32:00.227283Z", + "shell.execute_reply": "2026-11-03T13:32:00.226778Z" }, "papermill": { - "duration": 33.60201, - "end_time": "2026-11-01T04:35:44.677776+00:00", + "duration": 6.083493, + "end_time": "2026-11-03T13:32:00.228286", "exception": false, - "start_time": "2026-11-01T04:35:11.075766+00:00", + "start_time": "2026-11-03T13:31:54.144793", "status": "completed" }, "tags": [] @@ -81,7 +81,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "device: cuda:0 | torch 2.14.0+cu126 | transformers 5.12.1\n" + "device: cuda:0 | torch 2.12.1+cu126 | transformers 5.13.0\n" ] } ], @@ -113,16 +113,16 @@ "id": "6c90d904", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:35:44.685468Z", - "iopub.status.busy": "2026-11-01T04:35:44.685025Z", - "iopub.status.idle": "2026-11-01T04:36:20.610474Z", - "shell.execute_reply": "2026-11-01T04:36:20.608193Z" + "iopub.execute_input": "2026-11-03T13:32:00.241388Z", + "iopub.status.busy": "2026-11-03T13:32:00.241388Z", + "iopub.status.idle": "2026-11-03T13:32:13.088823Z", + "shell.execute_reply": "2026-11-03T13:32:13.088308Z" }, "papermill": { - "duration": 35.935043, - "end_time": "2026-11-01T04:36:20.616030+00:00", + "duration": 12.855044, + "end_time": "2026-11-03T13:32:13.089350", "exception": false, - "start_time": "2026-11-01T04:35:44.680987+00:00", + "start_time": "2026-11-03T13:32:00.234306", "status": "completed" }, "tags": [] @@ -132,7 +132,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chargement : 29 s (bf16 plein depuis le cache local)\n", + "chargement : 9 s (bf16 plein depuis le cache local)\n", "VRAM allouee 12.89 Gio | reservee 14.39 Gio\n" ] } @@ -157,16 +157,16 @@ "id": "20372cbe", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:20.645134Z", - "iopub.status.busy": "2026-11-01T04:36:20.632535Z", - "iopub.status.idle": "2026-11-01T04:36:20.657285Z", - "shell.execute_reply": "2026-11-01T04:36:20.656447Z" + "iopub.execute_input": "2026-11-03T13:32:13.097470Z", + "iopub.status.busy": "2026-11-03T13:32:13.097470Z", + "iopub.status.idle": "2026-11-03T13:32:13.101483Z", + "shell.execute_reply": "2026-11-03T13:32:13.100980Z" }, "papermill": { - "duration": 0.035034, - "end_time": "2026-11-01T04:36:20.658371+00:00", + "duration": 0.009018, + "end_time": "2026-11-03T13:32:13.102488", "exception": false, - "start_time": "2026-11-01T04:36:20.623337+00:00", + "start_time": "2026-11-03T13:32:13.093470", "status": "completed" }, "tags": [] @@ -199,25 +199,33 @@ "id": "tv02-lect-01", "metadata": { "papermill": { - "duration": 0.005423, - "end_time": "2026-11-01T04:36:20.669529+00:00", + "duration": 0.003028, + "end_time": "2026-11-03T13:32:13.111021", "exception": false, - "start_time": "2026-11-01T04:36:20.664106+00:00", + "start_time": "2026-11-03T13:32:13.107993", "status": "completed" }, "tags": [] }, - "source": "### Lecture — l'identite du modele tient en quatre nombres de config\n\nLes trois cellules ci-dessus posent le cadre du banc : `cuda:0` sous torch 2.14.0+cu126 et transformers 5.12.1, un chargement **bf16 plein en 29 s depuis le cache local** (12,89 Gio alloues, 14,39 reserves — la carte 16 Gio tient le pari du §1), et une identite d'architecture qui tient en quatre nombres : **64 experts, top-8, 16 couches MoE**, `hidden` 2048, FFN d'expert 1024, vocab 50 304.\n\nUn detail d'abord : le MoE est **partout** — une couche MoE par couche du decodeur, pas quelques couches localisees comme chez Mixtral. Chaque position du corpus traverse donc 16 routages distincts ; c'est pourquoi la suite mesure la charge **par couche** et pas en agregat.\n\nAutre contraste, celui-la avec le TV-01 : OLMoE est **MHA** (16 tetes Q / 16 tetes KV) — pas de GQA, contrairement au Mistral du TV-01. Ce modele n'economise **pas** sur l'attention : toute son epargne vit dans les experts epars. Croiser les deux notebooks, c'est voir les deux axes d'economie du SOTA (attention groupee / experts epars) choisis separes par deux architectures reelles." + "source": [ + "### Lecture — l'identite du modele tient en six nombres de config\n", + "\n", + "Les trois cellules ci-dessus posent le cadre du banc : `cuda:0` sous torch 2.12.1+cu126 et transformers 5.13.0, un chargement **bf16 plein en 9 s depuis le cache local** (12,89 Gio alloues, 14,39 reserves — la carte 16 Gio tient le pari du §1), et une identite d'architecture qui tient en six nombres : **64 experts, top-8, 16 couches MoE**, `hidden` 2048, FFN d'expert 1024, vocab 50 304.\n", + "\n", + "Un detail d'abord : le MoE est **partout** — une couche MoE par couche du decodeur, pas quelques couches localisees comme chez Mixtral. Chaque position du corpus traverse donc 16 routages distincts ; c'est pourquoi la suite mesure la charge **par couche** et pas en agregat.\n", + "\n", + "Autre contraste, celui-la avec le TV-01 : OLMoE est **MHA** (16 tetes Q / 16 tetes KV) — pas de GQA, contrairement au Mistral du TV-01. Ce modele n'economise **pas** sur l'attention : toute son epargne vit dans les experts epars. Croiser les deux notebooks, c'est voir les deux axes d'economie du SOTA (attention groupee / experts epars) choisis separes par deux architectures reelles." + ] }, { "cell_type": "markdown", "id": "b371481a", "metadata": { "papermill": { - "duration": 0.005595, - "end_time": "2026-11-01T04:36:20.680518+00:00", + "duration": 0.003701, + "end_time": "2026-11-03T13:32:13.117732", "exception": false, - "start_time": "2026-11-01T04:36:20.674923+00:00", + "start_time": "2026-11-03T13:32:13.114031", "status": "completed" }, "tags": [] @@ -242,16 +250,16 @@ "id": "2f031f93", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:20.692577Z", - "iopub.status.busy": "2026-11-01T04:36:20.691950Z", - "iopub.status.idle": "2026-11-01T04:36:20.711338Z", - "shell.execute_reply": "2026-11-01T04:36:20.710277Z" + "iopub.execute_input": "2026-11-03T13:32:13.125656Z", + "iopub.status.busy": "2026-11-03T13:32:13.125656Z", + "iopub.status.idle": "2026-11-03T13:32:13.131940Z", + "shell.execute_reply": "2026-11-03T13:32:13.131417Z" }, "papermill": { - "duration": 0.026391, - "end_time": "2026-11-01T04:36:20.712352+00:00", + "duration": 0.011508, + "end_time": "2026-11-03T13:32:13.132962", "exception": false, - "start_time": "2026-11-01T04:36:20.685961+00:00", + "start_time": "2026-11-03T13:32:13.121454", "status": "completed" }, "tags": [] @@ -314,10 +322,10 @@ "id": "093bcfd6", "metadata": { "papermill": { - "duration": 0.006034, - "end_time": "2026-11-01T04:36:20.722847+00:00", + "duration": 0.002516, + "end_time": "2026-11-03T13:32:13.139490", "exception": false, - "start_time": "2026-11-01T04:36:20.716813+00:00", + "start_time": "2026-11-03T13:32:13.136974", "status": "completed" }, "tags": [] @@ -337,10 +345,10 @@ "id": "de7fcadd", "metadata": { "papermill": { - "duration": 0.003613, - "end_time": "2026-11-01T04:36:20.730173+00:00", + "duration": 0.003, + "end_time": "2026-11-03T13:32:13.146362", "exception": false, - "start_time": "2026-11-01T04:36:20.726560+00:00", + "start_time": "2026-11-03T13:32:13.143362", "status": "completed" }, "tags": [] @@ -359,16 +367,16 @@ "id": "2c779b06", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:20.742693Z", - "iopub.status.busy": "2026-11-01T04:36:20.742161Z", - "iopub.status.idle": "2026-11-01T04:36:23.404293Z", - "shell.execute_reply": "2026-11-01T04:36:23.403347Z" + "iopub.execute_input": "2026-11-03T13:32:13.154410Z", + "iopub.status.busy": "2026-11-03T13:32:13.154410Z", + "iopub.status.idle": "2026-11-03T13:32:13.645498Z", + "shell.execute_reply": "2026-11-03T13:32:13.645498Z" }, "papermill": { - "duration": 2.671734, - "end_time": "2026-11-01T04:36:23.405616+00:00", + "duration": 0.496636, + "end_time": "2026-11-03T13:32:13.646503", "exception": false, - "start_time": "2026-11-01T04:36:20.733882+00:00", + "start_time": "2026-11-03T13:32:13.149867", "status": "completed" }, "tags": [] @@ -385,7 +393,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Found the latest cached dataset configuration 'wikitext-2-raw-v1' at \\.cache\\huggingface\\datasets\\Salesforce___wikitext\\wikitext-2-raw-v1\\0.0.0\\b08601e04326c79dfdd32d625aee71d232d685c3 (last modified on Sat Oct 31 21:02:50 2026).\n" + "Found the latest cached dataset configuration 'wikitext-2-raw-v1' at \\.cache\\huggingface\\datasets\\Salesforce___wikitext\\wikitext-2-raw-v1\\0.0.0\\b08601e04326c79dfdd32d625aee71d232d685c3 (last modified on Tue Nov 3 14:29:11 2026).\n" ] }, { @@ -412,10 +420,10 @@ "id": "tv02-lect-02", "metadata": { "papermill": { - "duration": 0.003493, - "end_time": "2026-11-01T04:36:23.412782+00:00", + "duration": 0.003524, + "end_time": "2026-11-03T13:32:13.653710", "exception": false, - "start_time": "2026-11-01T04:36:23.409289+00:00", + "start_time": "2026-11-03T13:32:13.650186", "status": "completed" }, "tags": [] @@ -435,10 +443,10 @@ "id": "59a16bb6", "metadata": { "papermill": { - "duration": 0.003649, - "end_time": "2026-11-01T04:36:23.421296+00:00", + "duration": 0.003451, + "end_time": "2026-11-03T13:32:13.660031", "exception": false, - "start_time": "2026-11-01T04:36:23.417647+00:00", + "start_time": "2026-11-03T13:32:13.656580", "status": "completed" }, "tags": [] @@ -457,16 +465,16 @@ "id": "d76e37e3", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:23.435149Z", - "iopub.status.busy": "2026-11-01T04:36:23.434439Z", - "iopub.status.idle": "2026-11-01T04:36:25.609519Z", - "shell.execute_reply": "2026-11-01T04:36:25.608314Z" + "iopub.execute_input": "2026-11-03T13:32:13.667888Z", + "iopub.status.busy": "2026-11-03T13:32:13.667361Z", + "iopub.status.idle": "2026-11-03T13:32:14.620946Z", + "shell.execute_reply": "2026-11-03T13:32:14.620946Z" }, "papermill": { - "duration": 2.185103, - "end_time": "2026-11-01T04:36:25.610865+00:00", + "duration": 0.958798, + "end_time": "2026-11-03T13:32:14.621952", "exception": false, - "start_time": "2026-11-01T04:36:23.425762+00:00", + "start_time": "2026-11-03T13:32:13.663154", "status": "completed" }, "tags": [] @@ -477,7 +485,7 @@ "output_type": "stream", "text": [ "router_logits : 16 couches x 7570 jetons x 64 experts\n", - "ppl du passage : 112.19 (4.720 nat/jeton) | forward 2.1 s\n" + "ppl du passage : 111.74 (4.716 nat/jeton) | forward 0.9 s\n" ] } ], @@ -513,25 +521,31 @@ "id": "tv02-lect-03", "metadata": { "papermill": { - "duration": 0.00641, - "end_time": "2026-11-01T04:36:25.622647+00:00", + "duration": 0.003018, + "end_time": "2026-11-03T13:32:14.629088", "exception": false, - "start_time": "2026-11-01T04:36:25.616237+00:00", + "start_time": "2026-11-03T13:32:14.626070", "status": "completed" }, "tags": [] }, - "source": "### Lecture — une seule passe avant livre la matrice complete du routage\n\n`output_router_logits=True` capture, pour chacun des 7 570 jetons, les scores **bruts** des 64 experts **avant** le top-8, sur les 16 couches : un tenseur `[16, 7570, 64]` — 7,7 M scores qui decrivent exhaustivement qui va ou. C'est la contrepartie industrielle exacte des `probs completes du routeur` que le `MoECouche` du 3.4c exposait sur son jouet ; le seul changement est l'echelle.\n\nDeux nombres tombent gratis avec cette passe. La **ppl 112,19** (4,720 nat/jeton) — a lire avec le cadre du §4.1bis : un modele *instruct* evalue en texte brut, pas une performance de reference. Et le cout du forward : **2,1 s** pour 7 570 jetons en passe unique. Retenez ce dernier pour le contraster avec le §6 : le bench dedie (n = 3, synchronisation CUDA) montrera qu'une mesure de passe unique n'est pas un benchmark — la discipline de mesure se durcit quand le nombre devient une affirmation de performance." + "source": [ + "### Lecture — une seule passe avant livre la matrice complete du routage\n", + "\n", + "`output_router_logits=True` capture, pour chacun des 7 570 jetons, les scores **bruts** des 64 experts **avant** le top-8, sur les 16 couches : un tenseur `[16, 7570, 64]` — 7,7 M scores qui decrivent exhaustivement qui va ou. C'est la contrepartie industrielle exacte des `probs completes du routeur` que le `MoECouche` du 3.4c exposait sur son jouet ; le seul changement est l'echelle.\n", + "\n", + "Deux nombres tombent gratis avec cette passe. La **ppl 111,74** (4,716 nat/jeton) — a lire avec le cadre du §4.1bis : un modele *instruct* evalue en texte brut, pas une performance de reference. Et le cout du forward : **0,9 s** pour 7 570 jetons en passe unique. Retenez ce dernier pour le contraster avec le §6 : le bench dedie (n = 3, synchronisation CUDA) montrera qu'une mesure de passe unique n'est pas un benchmark — la discipline de mesure se durcit quand le nombre devient une affirmation de performance." + ] }, { "cell_type": "markdown", "id": "c4805235", "metadata": { "papermill": { - "duration": 0.004191, - "end_time": "2026-11-01T04:36:25.632205+00:00", + "duration": 0.004203, + "end_time": "2026-11-03T13:32:14.637327", "exception": false, - "start_time": "2026-11-01T04:36:25.628014+00:00", + "start_time": "2026-11-03T13:32:14.633124", "status": "completed" }, "tags": [] @@ -548,16 +562,16 @@ "id": "e36d6fc4", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:25.645393Z", - "iopub.status.busy": "2026-11-01T04:36:25.644926Z", - "iopub.status.idle": "2026-11-01T04:36:25.738252Z", - "shell.execute_reply": "2026-11-01T04:36:25.737208Z" + "iopub.execute_input": "2026-11-03T13:32:14.645174Z", + "iopub.status.busy": "2026-11-03T13:32:14.644651Z", + "iopub.status.idle": "2026-11-03T13:32:14.684088Z", + "shell.execute_reply": "2026-11-03T13:32:14.683584Z" }, "papermill": { - "duration": 0.101655, - "end_time": "2026-11-01T04:36:25.739348+00:00", + "duration": 0.043653, + "end_time": "2026-11-03T13:32:14.684088", "exception": false, - "start_time": "2026-11-01T04:36:25.637693+00:00", + "start_time": "2026-11-03T13:32:14.640435", "status": "completed" }, "tags": [] @@ -569,8 +583,8 @@ "text": [ "equilibre parfait : part 0.0156 | entropie max 4.159 (ln 64)\n", "entropie de charge par couche : min 3.794 | moy 3.892 | max 4.032\n", - "part max par couche : min 0.0432 | moy 0.0602 | max 0.0860\n", - "couche 0 : top-3 experts [17, 41, 46] parts [0.0576, 0.0439, 0.0399]\n", + "part max par couche : min 0.0432 | moy 0.0602 | max 0.0861\n", + "couche 0 : top-3 experts [17, 41, 46] parts [0.0577, 0.0439, 0.0399]\n", "couche 0 : 3 experts les moins charges parts [0.0005, 0.0007, 0.0019]\n", "les 64 experts ne sont pas equirepartis - c'est une distribution apprise, pas un hasard\n" ] @@ -600,10 +614,10 @@ "id": "92191720", "metadata": { "papermill": { - "duration": 0.004548, - "end_time": "2026-11-01T04:36:25.749149+00:00", + "duration": 0.003528, + "end_time": "2026-11-03T13:32:14.691700", "exception": false, - "start_time": "2026-11-01T04:36:25.744601+00:00", + "start_time": "2026-11-03T13:32:14.688172", "status": "completed" }, "tags": [] @@ -615,7 +629,7 @@ "\n", "Ce n'est pas un defaut d'equilibrage : c'est son **resultat negocie**. La perte auxiliaire de charge (l'equivalent du `alpha_load` du 3.4c, integree a l'entrainement AllenAI) empeche l'effondrement — aucun expert a zero, tous apprennent — sans pousser vers l'uniforme, qui ferait du MoE un dense au rabais. La distribution apprise tient entre les deux : assez plate pour que 64 experts vivent, assez structuree pour que la specialisation (§5) ait de la matiere.\n", "\n", - "A retenir methodologiquement : l'entropie seule ne dit pas tout. 3,892 sur 4,159 ressemble a « presque uniforme » ; les parts extremes (0,0005 contre 0,0576) racontent une hierarchie bien plus nette que la moyenne ne le laisse voir." + "A retenir methodologiquement : l'entropie seule ne dit pas tout. 3,892 sur 4,159 ressemble a « presque uniforme » ; les parts extremes (0,0005 contre 0,0577) racontent une hierarchie bien plus nette que la moyenne ne le laisse voir." ] }, { @@ -623,10 +637,10 @@ "id": "b1e17edd", "metadata": { "papermill": { - "duration": 0.005571, - "end_time": "2026-11-01T04:36:25.759641+00:00", + "duration": 0.00251, + "end_time": "2026-11-03T13:32:14.697741", "exception": false, - "start_time": "2026-11-01T04:36:25.754070+00:00", + "start_time": "2026-11-03T13:32:14.695231", "status": "completed" }, "tags": [] @@ -644,10 +658,10 @@ "id": "17aec426", "metadata": { "papermill": { - "duration": 0.003621, - "end_time": "2026-11-01T04:36:25.767082+00:00", + "duration": 0.004, + "end_time": "2026-11-03T13:32:14.705251", "exception": false, - "start_time": "2026-11-01T04:36:25.763461+00:00", + "start_time": "2026-11-03T13:32:14.701251", "status": "completed" }, "tags": [] @@ -666,16 +680,16 @@ "id": "2c1e0b16", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:25.775613Z", - "iopub.status.busy": "2026-11-01T04:36:25.775278Z", - "iopub.status.idle": "2026-11-01T04:36:25.784530Z", - "shell.execute_reply": "2026-11-01T04:36:25.783717Z" + "iopub.execute_input": "2026-11-03T13:32:14.713263Z", + "iopub.status.busy": "2026-11-03T13:32:14.711758Z", + "iopub.status.idle": "2026-11-03T13:32:14.718793Z", + "shell.execute_reply": "2026-11-03T13:32:14.718793Z" }, "papermill": { - "duration": 0.015591, - "end_time": "2026-11-01T04:36:25.786194+00:00", + "duration": 0.012055, + "end_time": "2026-11-03T13:32:14.720305", "exception": false, - "start_time": "2026-11-01T04:36:25.770603+00:00", + "start_time": "2026-11-03T13:32:14.708250", "status": "completed" }, "tags": [] @@ -686,7 +700,7 @@ "output_type": "stream", "text": [ "entropie de Routage (softmax complete, toutes couches) : 3.7694 / 4.1589\n", - "ecart-type des logits du routeur : 0.9908\n", + "ecart-type des logits du routeur : 0.9906\n", "gap moyen top-8 -> top-9 en probabilite : 2.55e-03 - la selection se joue sur des marges fines\n", "entropie de CHARGE (affectation top-8) : 3.892 / 4.159\n", "routeur discriminant (3.77/4.16, ecart-type 0.99) et charge structuree (3.89/4.16) : le classement top-8 sur marges fines, pas une confiance extreme, decide\n" @@ -715,10 +729,10 @@ "id": "tv02-lect-04", "metadata": { "papermill": { - "duration": 0.003882, - "end_time": "2026-11-01T04:36:25.794946+00:00", + "duration": 0.003506, + "end_time": "2026-11-03T13:32:14.726813", "exception": false, - "start_time": "2026-11-01T04:36:25.791064+00:00", + "start_time": "2026-11-03T13:32:14.723307", "status": "completed" }, "tags": [] @@ -726,9 +740,9 @@ "source": [ "### Lecture — un routeur qui discrimine sur des marges fines (et une mesure sensible a la version du moteur)\n", "\n", - "L'entropie de **routage** (softmax complete, 64 experts, toutes couches) vaut **3,7694 sur un maximum de 4,1589** — 90 % du maximum : le routeur discriminate, sans pour autant trancher a coups certifies. L'ecart-type des logits vaut **0,9908** : les scores bruts s'etalent sur un ordre de grandeur, ce n'est pas une gate indecise. Et le gap moyen entre le 8e et le 9e expert — celui qui decide de l'affectation — vaut **2,55e-03 en probabilite** : la selection se joue sur des marges fines, mais soixante fois plus larges qu'une quasi-egalite.\n", + "L'entropie de **routage** (softmax complete, 64 experts, toutes couches) vaut **3,7694 sur un maximum de 4,1589** — 90 % du maximum : le routeur discriminate, sans pour autant trancher a coups certifies. L'ecart-type des logits vaut **0,9906** : les scores bruts s'etalent sur un ordre de grandeur, ce n'est pas une gate indecise. Et le gap moyen entre le 8e et le 9e expert — celui qui decide de l'affectation — vaut **2,55e-03 en probabilite** : la selection se joue sur des marges fines, mais soixante fois plus larges qu'une quasi-egalite.\n", "\n", - "Une precaution de lecture, apprise en re-executant ce carnet : sous transformers 5.2.0, la meme mesure rendait 4,1587/4,1589 (quasi max) et un ecart-type de 0,0176 — un routeur « plat ». Sous transformers 5.12.1, `router_logits` est le `F.linear(hidden_states, self.weight)` brut du routeur (`modeling_olmoe.py`) : un ecart de 56x sur l'ecart-type n'est pas une derive numerique, les deux versions n'exposaient pas la meme grandeur. La lecture fidele a la definition du §4 — les logits **avant** softmax — est celle commise ici.\n", + "Une precaution de lecture, apprise en re-executant ce carnet : sous transformers 5.2.0, la meme mesure rendait 4,1587/4,1589 (quasi max) et un ecart-type de 0,0176 — un routeur « plat ». Sous transformers 5.13.0, `router_logits` est le `F.linear(hidden_states, self.weight)` brut du routeur (`modeling_olmoe.py`) : un ecart de 56x sur l'ecart-type n'est pas une derive numerique, les deux versions n'exposaient pas la meme grandeur. La lecture fidele a la definition du §4 — les logits **avant** softmax — est celle commise ici.\n", "\n", "Et la charge (§4.1) reste structuree : 3,892 sur 4,159, hierarchie nette entre experts. La lecture juste : **le routeur discrimine, et le classement top-8 amplifie cette discrimination en une distribution de charge stable** — les marges fines entre le 8e et le 9e decident seuls de qui calcule.\n", "\n", @@ -740,10 +754,10 @@ "id": "3c43e697", "metadata": { "papermill": { - "duration": 0.003658, - "end_time": "2026-11-01T04:36:25.802454+00:00", + "duration": 0.003514, + "end_time": "2026-11-03T13:32:14.734340", "exception": false, - "start_time": "2026-11-01T04:36:25.798796+00:00", + "start_time": "2026-11-03T13:32:14.730826", "status": "completed" }, "tags": [] @@ -762,16 +776,16 @@ "id": "ee5516e3", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:25.811076Z", - "iopub.status.busy": "2026-11-01T04:36:25.810737Z", - "iopub.status.idle": "2026-11-01T04:36:25.820287Z", - "shell.execute_reply": "2026-11-01T04:36:25.819222Z" + "iopub.execute_input": "2026-11-03T13:32:14.741817Z", + "iopub.status.busy": "2026-11-03T13:32:14.741817Z", + "iopub.status.idle": "2026-11-03T13:32:14.747878Z", + "shell.execute_reply": "2026-11-03T13:32:14.747374Z" }, "papermill": { - "duration": 0.015687, - "end_time": "2026-11-01T04:36:25.821761+00:00", + "duration": 0.010566, + "end_time": "2026-11-03T13:32:14.748382", "exception": false, - "start_time": "2026-11-01T04:36:25.806074+00:00", + "start_time": "2026-11-03T13:32:14.737816", "status": "completed" }, "tags": [] @@ -809,10 +823,10 @@ "id": "tv02-lect-05", "metadata": { "papermill": { - "duration": 0.003603, - "end_time": "2026-11-01T04:36:25.831990+00:00", + "duration": 0.004507, + "end_time": "2026-11-03T13:32:14.755895", "exception": false, - "start_time": "2026-11-01T04:36:25.828387+00:00", + "start_time": "2026-11-03T13:32:14.751388", "status": "completed" }, "tags": [] @@ -830,10 +844,10 @@ "id": "9ee06066", "metadata": { "papermill": { - "duration": 0.003674, - "end_time": "2026-11-01T04:36:25.839411+00:00", + "duration": 0.004017, + "end_time": "2026-11-03T13:32:14.762926", "exception": false, - "start_time": "2026-11-01T04:36:25.835737+00:00", + "start_time": "2026-11-03T13:32:14.758909", "status": "completed" }, "tags": [] @@ -852,16 +866,16 @@ "id": "7c492483", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:25.853716Z", - "iopub.status.busy": "2026-11-01T04:36:25.853219Z", - "iopub.status.idle": "2026-11-01T04:36:26.231272Z", - "shell.execute_reply": "2026-11-01T04:36:26.230240Z" + "iopub.execute_input": "2026-11-03T13:32:14.769645Z", + "iopub.status.busy": "2026-11-03T13:32:14.769645Z", + "iopub.status.idle": "2026-11-03T13:32:14.915353Z", + "shell.execute_reply": "2026-11-03T13:32:14.915353Z" }, "papermill": { - "duration": 0.38819, - "end_time": "2026-11-01T04:36:26.232309+00:00", + "duration": 0.149924, + "end_time": "2026-11-03T13:32:14.916358", "exception": false, - "start_time": "2026-11-01T04:36:25.844119+00:00", + "start_time": "2026-11-03T13:32:14.766434", "status": "completed" }, "tags": [] @@ -871,7 +885,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "classes : {'chiffres': 180, 'espaces': 100, 'lettres': 6211, 'ponctuation': 1079}\n" + "classes :" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " {'chiffres': 180, 'espaces': 100, 'lettres': 6211, 'ponctuation': 1079}\n" ] } ], @@ -898,16 +919,16 @@ "id": "515f9dcb", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:26.245455Z", - "iopub.status.busy": "2026-11-01T04:36:26.245116Z", - "iopub.status.idle": "2026-11-01T04:36:26.276670Z", - "shell.execute_reply": "2026-11-01T04:36:26.275815Z" + "iopub.execute_input": "2026-11-03T13:32:14.925995Z", + "iopub.status.busy": "2026-11-03T13:32:14.924989Z", + "iopub.status.idle": "2026-11-03T13:32:14.946280Z", + "shell.execute_reply": "2026-11-03T13:32:14.946280Z" }, "papermill": { - "duration": 0.039796, - "end_time": "2026-11-01T04:36:26.277666+00:00", + "duration": 0.027424, + "end_time": "2026-11-03T13:32:14.947286", "exception": false, - "start_time": "2026-11-01T04:36:26.237870+00:00", + "start_time": "2026-11-03T13:32:14.919862", "status": "completed" }, "tags": [] @@ -946,10 +967,10 @@ "id": "tv02-lect-06", "metadata": { "papermill": { - "duration": 0.003813, - "end_time": "2026-11-01T04:36:26.286187+00:00", + "duration": 0.003021, + "end_time": "2026-11-03T13:32:14.953813", "exception": false, - "start_time": "2026-11-01T04:36:26.282374+00:00", + "start_time": "2026-11-03T13:32:14.950792", "status": "completed" }, "tags": [] @@ -969,10 +990,10 @@ "id": "e6548b64", "metadata": { "papermill": { - "duration": 0.003987, - "end_time": "2026-11-01T04:36:26.294051+00:00", + "duration": 0.003558, + "end_time": "2026-11-03T13:32:14.961370", "exception": false, - "start_time": "2026-11-01T04:36:26.290064+00:00", + "start_time": "2026-11-03T13:32:14.957812", "status": "completed" }, "tags": [] @@ -991,16 +1012,16 @@ "id": "75fd7ac1", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:26.304451Z", - "iopub.status.busy": "2026-11-01T04:36:26.303893Z", - "iopub.status.idle": "2026-11-01T04:36:27.693874Z", - "shell.execute_reply": "2026-11-01T04:36:27.693034Z" + "iopub.execute_input": "2026-11-03T13:32:14.969375Z", + "iopub.status.busy": "2026-11-03T13:32:14.969375Z", + "iopub.status.idle": "2026-11-03T13:32:15.597137Z", + "shell.execute_reply": "2026-11-03T13:32:15.597137Z" }, "papermill": { - "duration": 1.396477, - "end_time": "2026-11-01T04:36:27.694926+00:00", + "duration": 0.633768, + "end_time": "2026-11-03T13:32:15.598141", "exception": false, - "start_time": "2026-11-01T04:36:26.298449+00:00", + "start_time": "2026-11-03T13:32:14.964373", "status": "completed" }, "tags": [] @@ -1010,21 +1031,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "forward T= 256 : 149.0 ms (582 us/jeton, ~1282 M params actifs/jeton)\n" + "forward T= 256 : 71.2 ms (278 us/jeton, ~1282 M params actifs/jeton)\n", + "forward T= 512 : 67.8 ms (132 us/jeton, ~1282 M params actifs/jeton)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "forward T= 512 : 151.4 ms (296 us/jeton, ~1282 M params actifs/jeton)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "forward T=1024 : 160.0 ms (156 us/jeton, ~1282 M params actifs/jeton)\n", + "forward T=1024 : 68.7 ms (67 us/jeton, ~1282 M params actifs/jeton)\n", "un dense iso-parametres couterait ~5.4x le calcul par jeton du MoE\n" ] } @@ -1054,25 +1069,31 @@ "id": "tv02-lect-07", "metadata": { "papermill": { - "duration": 0.005857, - "end_time": "2026-11-01T04:36:27.706155+00:00", + "duration": 0.003522, + "end_time": "2026-11-03T13:32:15.606733", "exception": false, - "start_time": "2026-11-01T04:36:27.700298+00:00", + "start_time": "2026-11-03T13:32:15.603211", "status": "completed" }, "tags": [] }, - "source": "### Lecture — le contrat tient, et la latence par jeton s'effondre avec la longueur\n\nTrois tailles de contexte, n = 3 passes synchronisees : **149,0 ms** (T = 256), **151,4 ms** (T = 512), **160,0 ms** (T = 1024). Le temps total reste dans une bande etroite — il **remonte** a T = 1024 : le fixe (poids actives, defaults de cache memoire) s'amortit sur des sequences plus longues jusqu'a ce que l'attention quadratique reapparaisse. La lecture juste est **par jeton** : 582 µs, 296 µs, **156 µs**. De 256 a 1024, le cout par jeton tombe de **~73 %** — et le MoE garde ~1 282 M parametres actifs **par jeton, quelle que soit la longueur** — le seul terme vraiment constant du budget.\n\nLa ligne finale est l'argument economique complet : un dense iso-parametres (6,92 Md qui calculent tous) couterait **~5,4×** le calcul par jeton de ce MoE. Mis en regard du §2, c'est le meme 5,4× lu des deux cotes du contrat — capacite achetee / calcul epargne. Derniere precaution de lecture : ce 5,4× est un rapport de **comptage de parametres actifs**, pas un temps de mur mesure — les 149-160 ms ci-dessus incluent l'orchestration des 64 experts, qui dilue le ratio theorique." + "source": [ + "### Lecture — le contrat tient, et la latence par jeton s'effondre avec la longueur\n", + "\n", + "Trois tailles de contexte, n = 3 passes synchronisees : **71,2 ms** (T = 256), **67,8 ms** (T = 512), **68,7 ms** (T = 1024). Le temps total reste dans une bande etroite — il **remonte** a T = 1024 : le fixe (poids actives, defaults de cache memoire) s'amortit sur des sequences plus longues jusqu'a ce que l'attention quadratique reapparaisse. La lecture juste est **par jeton** : 278 µs, 132 µs, **67 µs**. De 256 a 1024, le cout par jeton tombe de **~76 %** — et le MoE garde ~1 282 M parametres actifs **par jeton, quelle que soit la longueur** — le seul terme vraiment constant du budget.\n", + "\n", + "La ligne finale est l'argument economique complet : un dense iso-parametres (6,92 Md qui calculent tous) couterait **~5,4×** le calcul par jeton de ce MoE. Mis en regard du §2, c'est le meme 5,4× lu des deux cotes du contrat — capacite achetee / calcul epargne. Derniere precaution de lecture : ce 5,4× est un rapport de **comptage de parametres actifs**, pas un temps de mur mesure — les 68-71 ms ci-dessus incluent l'orchestration des 64 experts, qui dilue le ratio theorique." + ] }, { "cell_type": "markdown", "id": "11a4d7d6", "metadata": { "papermill": { - "duration": 0.00589, - "end_time": "2026-11-01T04:36:27.717984+00:00", + "duration": 0.003509, + "end_time": "2026-11-03T13:32:15.613756", "exception": false, - "start_time": "2026-11-01T04:36:27.712094+00:00", + "start_time": "2026-11-03T13:32:15.610247", "status": "completed" }, "tags": [] @@ -1080,9 +1101,9 @@ "source": [ "## 7. Tableau comparatif — from scratch (3.4c) vs industriel (TV-02)\n", "\n", - "Item 7 de l'epic, étendu au MoE. Les constantes 3.4c sont les nombres committés de la [PR #16152](https://github.com/jsboige/CoursIA/pull/16152) ; les colonnes TV-02 sont mesurées dans ce notebook.\n", + "Item 7 de l'epic, étendu au MoE. Les constantes 3.4c (hors volume de code) sont les nombres committés de la [PR #16152](https://github.com/jsboige/CoursIA/pull/16152) ; les colonnes TV-02 sont mesurées dans ce notebook.\n", "\n", - "Comment la lire : la colonne du milieu est le jouet (constantes commitees de la PR #16152), celle de droite est mesuree ici. Les lignes ne sont pas un classement — le jouet n'est pas « moins bon » — mais un inventaire de ce qui **survit** au passage a l'echelle (le mecanisme) et de ce qui **change** (les choix d'ingenierie : capacite, equilibrage, nature de la ppl)." + "Comment la lire : la colonne du milieu est le jouet (constantes commitees de la PR #16152), celle de droite est mesuree ici. La ligne **LOC** est la seule à ne pas être une constante : les deux volumes de code sont **relus sur le disque au moment de l'exécution** (organe `tv.loc`), donc la table décrit les carnets réellement exécutés au lieu de dériver (#24421). Les lignes ne sont pas un classement — le jouet n'est pas « moins bon » — mais un inventaire de ce qui **survit** au passage a l'echelle (le mecanisme) et de ce qui **change** (les choix d'ingenierie : capacite, equilibrage, nature de la ppl)." ] }, { @@ -1091,16 +1112,16 @@ "id": "66c571a2", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:27.730337Z", - "iopub.status.busy": "2026-11-01T04:36:27.729871Z", - "iopub.status.idle": "2026-11-01T04:36:27.738569Z", - "shell.execute_reply": "2026-11-01T04:36:27.737954Z" + "iopub.execute_input": "2026-11-03T13:32:15.621776Z", + "iopub.status.busy": "2026-11-03T13:32:15.620272Z", + "iopub.status.idle": "2026-11-03T13:32:15.634268Z", + "shell.execute_reply": "2026-11-03T13:32:15.634268Z" }, "papermill": { - "duration": 0.015992, - "end_time": "2026-11-01T04:36:27.739896+00:00", + "duration": 0.018517, + "end_time": "2026-11-03T13:32:15.635273", "exception": false, - "start_time": "2026-11-01T04:36:27.723904+00:00", + "start_time": "2026-11-03T13:32:15.616756", "status": "completed" }, "tags": [] @@ -1112,14 +1133,14 @@ "text": [ "mesure | 3.4c from scratch | TV-02 industriel (mesure ici)\n", "--------------------------------------------------------------------------------------------------------------\n", - "echelle | 0,57 M params (jouet) | 6.92 Md params (entraîne sur ~5 T jetons)\n", + "echelle | 0,57 M params (jouet) | 6.92 Md params (entraine sur ~5 T jetons)\n", "experts / top-k | 8 / top-2 | 64 / top-8\n", "actif par jeton | 4,0x le dense iso-calcul | 19% du total (5.4x capacite)\n", "capacite | c=1,0 : 6/8 affectations jetees | dropless (aucun jeton jete)\n", "equilibrage | perte L_aux (alpha=0,01) | perte de charge integree a l'entrainement\n", "entropie de charge | jouet : equilibre ~0,12 par expert | moy 3.892 / 4.159 (ln 64)\n", - "ppl de la tache | tache synthetique : 1,00 | WikiText-2 brut (instruct) : 112.19\n", - "LOC | 431 (3.4c) | 194\n", + "ppl de la tache | tache synthetique : 1,00 | WikiText-2 brut (instruct) : 111.74\n", + "LOC | 436 (3.4c) | 211\n", "\n", "cote industrie : modeling_olmoe.py seul = 708 lignes (hors quantification, generation, noyaux fused)\n" ] @@ -1128,8 +1149,23 @@ "source": [ "import inspect\n", "import pathlib\n", - "\n", - "LOC_34C = 431 # LOC effectives du 3.4c-MoE-from-scratch (constantes commitees, PR #16152)\n", + "import sys\n", + "\n", + "# Les volumes de code compares dans cette table sont lus SUR LE DISQUE au\n", + "# moment de l'execution (organe `tv.loc`) : une valeur figee en dur derivait\n", + "# des que le carnet voisin evoluait. Issue #24421.\n", + "SERIE = next((p for p in [pathlib.Path.cwd(), *pathlib.Path.cwd().parents]\n", + " if (p / \"tv\" / \"loc.py\").exists()), None)\n", + "if SERIE is None:\n", + " raise FileNotFoundError(\n", + " \"repertoire de la serie introuvable : executer ce carnet depuis \"\n", + " \"MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants\")\n", + "sys.path.insert(0, str(SERIE))\n", + "from tv.loc import DEPOT, carnet # noqa: E402\n", + "\n", + "LOC_34C = carnet(\"MyIA.AI.Notebooks/ML/DataScienceWithAgents/03-Deep-Learning/\"\n", + " \"3.4c-MoE-from-scratch.ipynb\", base=DEPOT)\n", + "LOC_SOI = carnet(\"TV-02-MoE-SOTA.ipynb\")\n", "src_path = pathlib.Path(inspect.getsourcefile(type(model)))\n", "LOC_INDUSTRIE = len(src_path.read_text(encoding=\"utf-8\").splitlines())\n", "lignes = [\n", @@ -1140,7 +1176,7 @@ " (\"equilibrage\", \"perte L_aux (alpha=0,01)\", \"perte de charge integree a l'entrainement\"),\n", " (\"entropie de charge\", \"jouet : equilibre ~0,12 par expert\", f\"moy {ENT_CHARGE.mean():.3f} / {ENT_MAX:.3f} (ln {E_})\"),\n", " (\"ppl de la tache\", \"tache synthetique : 1,00\", f\"WikiText-2 brut (instruct) : {PPL:.2f}\"),\n", - " (\"LOC\", f\"{LOC_34C} (3.4c)\", \"194\"),\n", + " (\"LOC\", f\"{LOC_34C} (3.4c)\", str(LOC_SOI)),\n", "]\n", "print(f\"{'mesure':28s} | {'3.4c from scratch':34s} | TV-02 industriel (mesure ici)\")\n", "print(\"-\" * 110)\n", @@ -1154,10 +1190,10 @@ "id": "25161ff8", "metadata": { "papermill": { - "duration": 0.008217, - "end_time": "2026-11-01T04:36:27.755728+00:00", + "duration": 0.003641, + "end_time": "2026-11-03T13:32:15.642997", "exception": false, - "start_time": "2026-11-01T04:36:27.747511+00:00", + "start_time": "2026-11-03T13:32:15.639356", "status": "completed" }, "tags": [] @@ -1169,7 +1205,7 @@ "\n", "- **capacite** : au jouet, `c = 1,0` jetait 6/8 affectations et c'etait acceptable ; a 64 experts, `c = 1,0` jette encore 8,5 % des affectations et le filet ne devient complet qu'a `c = 1,50` — au prix de 50 % de surcapacite. OLMoE choisit **dropless**. Ce n'est pas « mieux entraîne », c'est une autre decision d'ingenierie, qui achete l'exactitude plutot que la marge.\n", "- **equilibrage** : le jouet tenait sa charge par une perte auxiliaire explicite (`alpha = 0,01`) ; l'industriel obtient 3,892/4,159 avec la meme famille de moyens, integree a l'entrainement — le mecanisme survit au passage a l'echelle.\n", - "- **ppl** : 1,00 sur tache synthetique contre 112,19 sur WikiText brut — les deux nombres ne mesurent **pas la meme chose** (§4.1bis), et la table le dit au lieu de les aligner.\n", + "- **ppl** : 1,00 sur tache synthetique contre 111,74 sur WikiText brut — les deux nombres ne mesurent **pas la meme chose** (§4.1bis), et la table le dit au lieu de les aligner.\n", "\n", "La ligne LOC merite son contrepoint : plusieurs fois la longueur de ce notebook pour le 3.4c — et `modeling_olmoe.py` seul pese encore bien plus cote industrie, hors quantification et noyaux fusionnes. Le jouet n'est pas un industriel rate : c'est le meme mecanisme, depouille de tout ce qui n'est pas lui." ] @@ -1179,10 +1215,10 @@ "id": "c738f395", "metadata": { "papermill": { - "duration": 0.004102, - "end_time": "2026-11-01T04:36:27.766563+00:00", + "duration": 0.0036, + "end_time": "2026-11-03T13:32:15.650225", "exception": false, - "start_time": "2026-11-01T04:36:27.762461+00:00", + "start_time": "2026-11-03T13:32:15.646625", "status": "completed" }, "tags": [] @@ -1203,16 +1239,16 @@ "id": "589645aa", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:27.783232Z", - "iopub.status.busy": "2026-11-01T04:36:27.782838Z", - "iopub.status.idle": "2026-11-01T04:36:27.786377Z", - "shell.execute_reply": "2026-11-01T04:36:27.785419Z" + "iopub.execute_input": "2026-11-03T13:32:15.658769Z", + "iopub.status.busy": "2026-11-03T13:32:15.657770Z", + "iopub.status.idle": "2026-11-03T13:32:15.661155Z", + "shell.execute_reply": "2026-11-03T13:32:15.661155Z" }, "papermill": { - "duration": 0.012501, - "end_time": "2026-11-01T04:36:27.787231+00:00", + "duration": 0.008899, + "end_time": "2026-11-03T13:32:15.662162", "exception": false, - "start_time": "2026-11-01T04:36:27.774730+00:00", + "start_time": "2026-11-03T13:32:15.653263", "status": "completed" }, "tags": [] @@ -1230,10 +1266,10 @@ "id": "9d0c90bf", "metadata": { "papermill": { - "duration": 0.0041, - "end_time": "2026-11-01T04:36:27.795272+00:00", + "duration": 0.003509, + "end_time": "2026-11-03T13:32:15.669191", "exception": false, - "start_time": "2026-11-01T04:36:27.791172+00:00", + "start_time": "2026-11-03T13:32:15.665682", "status": "completed" }, "tags": [] @@ -1250,16 +1286,16 @@ "id": "ab509e00", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:27.805440Z", - "iopub.status.busy": "2026-11-01T04:36:27.805207Z", - "iopub.status.idle": "2026-11-01T04:36:27.809228Z", - "shell.execute_reply": "2026-11-01T04:36:27.808150Z" + "iopub.execute_input": "2026-11-03T13:32:15.676890Z", + "iopub.status.busy": "2026-11-03T13:32:15.676890Z", + "iopub.status.idle": "2026-11-03T13:32:15.680259Z", + "shell.execute_reply": "2026-11-03T13:32:15.680259Z" }, "papermill": { - "duration": 0.010189, - "end_time": "2026-11-01T04:36:27.810275+00:00", + "duration": 0.008065, + "end_time": "2026-11-03T13:32:15.681263", "exception": false, - "start_time": "2026-11-01T04:36:27.800086+00:00", + "start_time": "2026-11-03T13:32:15.673198", "status": "completed" }, "tags": [] @@ -1277,10 +1313,10 @@ "id": "76d5213a", "metadata": { "papermill": { - "duration": 0.003887, - "end_time": "2026-11-01T04:36:27.819349+00:00", + "duration": 0.004059, + "end_time": "2026-11-03T13:32:15.689335", "exception": false, - "start_time": "2026-11-01T04:36:27.815462+00:00", + "start_time": "2026-11-03T13:32:15.685276", "status": "completed" }, "tags": [] @@ -1297,16 +1333,16 @@ "id": "4795ecfe", "metadata": { "execution": { - "iopub.execute_input": "2026-11-01T04:36:27.829167Z", - "iopub.status.busy": "2026-11-01T04:36:27.828575Z", - "iopub.status.idle": "2026-11-01T04:36:27.833177Z", - "shell.execute_reply": "2026-11-01T04:36:27.832510Z" + "iopub.execute_input": "2026-11-03T13:32:15.696876Z", + "iopub.status.busy": "2026-11-03T13:32:15.696876Z", + "iopub.status.idle": "2026-11-03T13:32:15.700112Z", + "shell.execute_reply": "2026-11-03T13:32:15.700112Z" }, "papermill": { - "duration": 0.011592, - "end_time": "2026-11-01T04:36:27.834804+00:00", + "duration": 0.008274, + "end_time": "2026-11-03T13:32:15.701117", "exception": false, - "start_time": "2026-11-01T04:36:27.823212+00:00", + "start_time": "2026-11-03T13:32:15.692843", "status": "completed" }, "tags": [] @@ -1323,10 +1359,10 @@ "id": "a87dd643", "metadata": { "papermill": { - "duration": 0.007803, - "end_time": "2026-11-01T04:36:27.850806+00:00", + "duration": 0.004, + "end_time": "2026-11-03T13:32:15.708633", "exception": false, - "start_time": "2026-11-01T04:36:27.843003+00:00", + "start_time": "2026-11-03T13:32:15.704633", "status": "completed" }, "tags": [] @@ -1339,7 +1375,7 @@ "- **Dropless** : le filet du 3.4c (6/8 jetés à `c = 1,0`) ne devient complet qu'à `c = 1,50` à cette échelle — OLMoE assume la promesse : chaque jeton va chez ses 8 experts, sans entretenir la marge de 50 %.\n", "- Le contrat tenu : ~5,4× la capacité pour ~19 % du calcul par jeton.\n", "\n", - "**Résidus honnêtes** : la spécialisation mesurée ici reste **douce** (écarts de parts entre classes modérés) — la vraie spécialisation d'OLMoE se lit à l'échelle de l'entraînement (5 000 Md de jetons), pas sur la tranche WikiText-2 de ce notebook ; la ppl du passage (~112) est celle d'un modèle *instruct* évalué en texte brut, **pas échangeable** avec la ppl 7,95 du TV-01 (modèle base) ; la lecture « routeur plat » d'une exécution antérieure sous transformers 5.2.0 ne survit pas au passage aux logits bruts exposés par la version courante (§4.2) ; et la comparaison de coût avec le 3.4c traverse trois ordres de grandeur d'échelle — les rapports sont indicatifs, pas des benchmarks.\n", + "**Résidus honnêtes** : la spécialisation mesurée ici reste **douce** (écarts de parts entre classes modérés) — la vraie spécialisation d'OLMoE se lit à l'échelle de l'entraînement (5 000 Md de jetons), pas sur la tranche WikiText-2 de ce notebook ; la ppl du passage (~111,7) est celle d'un modèle *instruct* évalué en texte brut, **pas échangeable** avec la ppl 7,95 du TV-01 (modèle base) ; la lecture « routeur plat » d'une exécution antérieure sous transformers 5.2.0 ne survit pas au passage aux logits bruts exposés par la version courante (§4.2) ; et la comparaison de coût avec le 3.4c traverse trois ordres de grandeur d'échelle — les rapports sont indicatifs, pas des benchmarks.\n", "\n", "Si l'on ne devait retenir qu'une chose : le routage d'un MoE industriel est **observable** — pas une boite noire — et les mesures forcent la précision à chaque ligne. Un routeur qui discrimine sur des marges fines ; une spécialisation douce ; un filet de capacité complet dès `c = 1,50` mais abandonné pour l'exactitude : chaque lecture est une décision d'ingénierie lisible dans la matrice `[16, 7570, 64]` que ce notebook a extraite d'une seule passe avant. C'est la compétence transférable, au-delà d'OLMoE : savoir **instrumenter** un modèle avant de savoir l'entraîner.\n", "\n", @@ -1365,18 +1401,18 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.3" + "version": "3.12.13" }, "papermill": { "default_parameters": {}, - "duration": 82.876105, - "end_time": "2026-11-01T04:36:31.883760+00:00", + "duration": 24.817041, + "end_time": "2026-11-03T13:32:17.054536", "environment_variables": {}, "exception": null, "input_path": "TV-02-MoE-SOTA.ipynb", "output_path": "TV-02-MoE-SOTA.ipynb", "parameters": {}, - "start_time": "2026-11-01T04:35:09.007655+00:00", + "start_time": "2026-11-03T13:31:52.237495", "version": "2.6.0" } }, diff --git a/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/tv/loc.py b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/tv/loc.py new file mode 100644 index 0000000000..51ea4f653e --- /dev/null +++ b/MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/tv/loc.py @@ -0,0 +1,72 @@ +"""tv.loc -- mesure du volume de code d'un carnet voisin, a l'execution. + +Les tables comparatives de TV-01 et TV-02 publient le volume de code des +carnets voisins. Ces valeurs etaient **figees dans des cellules de code** : +chaque nombre derivait des que le carnet voisin evoluait, et le carnet ne +pouvait pas se voir deriver lui-meme -- sa propre valeur etait un litteral en +dur, la ou la colonne d'en face etait mesuree a l'execution. + +Cet organe supprime la classe de defaut : la valeur est **lue sur le disque au +moment de l'execution**, donc elle decrit le carnet reellement execute (le +fichier d'entree du notebook, dont les cellules de code sont celles que le +kernel a interpreteres). + +Convention de comptage -- celle qu'enonce la table elle-meme : lignes de +cellules de code, non vides, ne commencant pas par ``#``. + +Origine +------- + +Issue **#24421** (campagne d'audit #17073, partition GenAI #19451) : les +constantes LOC des carnets voisins etaient figees en dur et derivaient +(383 -> 388, 194 -> 200, 431 -> 436). + +Voit aussi +---------- + +- TV-01 : ``TV-01-Attention-Variants-SOTA.ipynb`` (table « bloc A vs bloc B »). +- TV-02 : ``TV-02-MoE-SOTA.ipynb`` (table « 3.4c from scratch vs industrie »). +""" +from __future__ import annotations + +import json +from pathlib import Path + +#: repertoire de la serie (le parent du package ``tv``) +SERIE = Path(__file__).resolve().parent.parent + +#: racine du depot (le package ``tv`` vit dans MyIA.AI.Notebooks/GenAI/Texte/...) +DEPOT = SERIE.parents[3] + +__all__ = ["SERIE", "DEPOT", "code_loc", "carnet"] + + +def code_loc(chemin) -> int: + """Nombre de lignes de code d'un carnet, selon la convention de la serie. + + Lignes de cellules de code, non vides, ne commencant pas par ``#``. + """ + carnet_json = json.loads(Path(chemin).read_text(encoding="utf-8")) + total = 0 + for cellule in carnet_json.get("cells", []): + if cellule.get("cell_type") != "code": + continue + for ligne in "".join(cellule.get("source", [])).splitlines(): + s = ligne.strip() + if s and not s.startswith("#"): + total += 1 + return total + + +def carnet(nom, base=None) -> int: + """Volume de code du carnet ``nom``, resolu sous ``base``. + + ``base`` par defaut : le repertoire de la serie. Un chemin relatif au + depot s'ecrit avec ``base=DEPOT``. + """ + racine = Path(base) if base is not None else SERIE + chemin = racine / nom + if not chemin.exists(): + raise FileNotFoundError( + f"carnet introuvable pour la mesure de volume de code : {chemin}") + return code_loc(chemin)