From e456bd34c0501a92f635c7c4e872bcad0c183d53 Mon Sep 17 00:00:00 2001 From: jsboige Date: Fri, 18 Sep 2026 04:00:04 +0200 Subject: [PATCH] docs(13410): 3 lecture cells chiffrees (QLoRA load, trainable params, training budget) in 21_LoRA_FineTuning (density 960 -> 1225) Anchored readings (all on real executed outputs, no exercise stubs): - c1lora21-1 (after exec=2 load): 0.78 Go / 8.6 Go card ~9%, 4-bit estimate ~0.38 Go vs measured 0.78 (~2x, unmeasured split flagged), 5.7s vs 1593.6s. - c1lora21-2 (after exec=6 print_trainable_parameters): 3,194,880 / 755,587,904 = 0.4228% recomputed by hand, ~1 trainable param in 237, module decomposition not printable from outputs (flagged). - c1lora21-3 (after exec=7 training): 1593.6s = 26min34s, 2400 examples / batch 8 ~300 steps ~5.3s/step (exact count not printed, flagged), VRAM 2.51 Go = 29% of 8.6 Go (+1.73 over load), loss 0.6147 vs in-comment calibration 0.7545 disclosed as two real runs. Proofs: - json.dumps(nb,indent=1,ensure_ascii=False)+"\n" == raw verified BEFORE edit. - Originals deep-equal in order vs HEAD: PASS. - Code cells byte-identical (source+outputs, 12 cells): PASS. - git diff -U0 | grep -c '^-[^-]' == 0: PASS. - Official measure (separate command): density 1225, status ok (floor 1200). - Idempotency guard on ids c1lora21-1/2/3; last-line \n matches the 15 existing markdown cells' convention. Hooks: pre-commit passed, no hr-separator normalization needed (no `---` openers). Co-Authored-By: Claude Sonnet 5 --- .../GenAI/Texte/21_LoRA_FineTuning.ipynb | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/MyIA.AI.Notebooks/GenAI/Texte/21_LoRA_FineTuning.ipynb b/MyIA.AI.Notebooks/GenAI/Texte/21_LoRA_FineTuning.ipynb index f8f210e3e7..04e3660c73 100644 --- a/MyIA.AI.Notebooks/GenAI/Texte/21_LoRA_FineTuning.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Texte/21_LoRA_FineTuning.ipynb @@ -972,6 +972,20 @@ "print(f\"VRAM apres chargement : {torch.cuda.max_memory_allocated()/1e9:.2f} Go / 8 Go\")" ] }, + { + "cell_type": "markdown", + "id": "c1lora21-1", + "metadata": {}, + "source": [ + "### Lecture chiffrée — l'empreinte du chargement QLoRA\n", + "\n", + "Deux grandeurs mesurées ici : `Modele charge en 5.7s` et `VRAM apres chargement : 0.78 Go / 8 Go`, sur la carte identifiée en section 1 (`NVIDIA GeForce RTX 3070 Laptop GPU (8.6 Go)`).\n", + "\n", + "- **0,78 Go alloués sur 8,6 Go réels** ≈ 9 % de la carte, avant tout entraînement. Ordre de grandeur : 755 M de paramètres (total imprimé en section 5) codés en 4 bits à ≈ 0,5 octet chacun font ≈ 0,38 Go de poids quantifiés — le pic mesuré est ≈ 2× cette estimation. L'écart couvre les modules laissés en pleine précision (embeddings, normes) et les buffers ; **la répartition exacte n'est pas mesurée** dans ce notebook.\n", + "- Le dénominateur `/ 8 Go` de la sortie est le budget nominal revendiqué, pas la capacité de la carte (8,6 Go mesurés en section 1) — il reste donc ≈ 7,8 Go pour gradients, états optimiseur et activations.\n", + "- **5,7 s** pour charger depuis le disque local : négligeable devant les 1593,6 s d'entraînement mesurés en section 6.\n" + ] + }, { "cell_type": "markdown", "id": "f8c8cb8c", @@ -1282,6 +1296,20 @@ "model_peft.print_trainable_parameters()\n" ] }, + { + "cell_type": "markdown", + "id": "c1lora21-2", + "metadata": {}, + "source": [ + "### Lecture chiffrée — 0,42 % des paramètres font tout le travail\n", + "\n", + "La sortie `trainable params: 3,194,880 || all params: 755,587,904 || trainable%: 0.4228` se vérifie à la main : 3 194 880 ÷ 755 587 904 = 0,004228 — exactement les 0,4228 % affichés. Les 755,6 M paramètres totaux expliquent l'étiquette « 0.8B » du modèle (arrondi commercial).\n", + "\n", + "- **Environ un paramètre entraînable sur 237** (755,6 M ÷ 3,19 M ≈ 236,6) : l'adaptateur apprend le format balisé en ne touchant qu'une fraction infime du réseau. C'est la promesse LoRA de la section 1 (« ~0,1–1 % du total »), tenue à 0,42 %.\n", + "- Ces 3,19 M paramètres se répartissent sur 7 modules linéaires × 2 matrices (A en 8×n, B en n×8) ; les largeurs n des projections ne sont **pas imprimées** dans les sorties — la décomposition par module n'est donc pas vérifiable depuis le notebook seul.\n", + "- Conséquence directe, mesurée en section 6 : gradients et états optimiseur ne portent que sur ces 3,19 M paramètres, ce qui maintient le pic VRAM d'entraînement à 2,51 Go — là où un fine-tuning complet exigerait typiquement 3–4× la taille du modèle.\n" + ] + }, { "cell_type": "markdown", "id": "67dd91a2", @@ -1538,6 +1566,20 @@ "print(f\"Perte finale : {stats.training_loss:.4f}\")\n" ] }, + { + "cell_type": "markdown", + "id": "c1lora21-3", + "metadata": {}, + "source": [ + "### Lecture chiffrée — le budget réel de l'entraînement\n", + "\n", + "Trois mesures clôturent la section : `Entrainement termine en 1593.6s`, `VRAM pic pendant l'entrainement : 2.51 Go / 8 Go`, `Perte finale : 0.6147`.\n", + "\n", + "- **Durée** : 1593,6 s = 26 min 34 s. Le modèle voit 60 exemples × 40 epochs = 2400 exemples ; à batch effectif 8 (4 par device × 2 pas d'accumulation), cela fait de l'ordre de 300 pas d'optimisation, soit ≈ 5,3 s par pas. Le compte exact de pas n'est **pas imprimé** (barre de progression en widget, courbe de perte désactivée par `report_to=[]`).\n", + "- **VRAM** : pic à 2,51 Go = 29 % de la carte de 8,6 Go, soit +1,73 Go au-dessus des 0,78 Go du chargement — l'incrément paie gradients + états optimiseur des 3,19 M paramètres libres et les activations. La promesse « fine-tuner un LLM sur 8 Go » est tenue avec plus de 3× de marge.\n", + "- **Perte finale** : 0.6147 sur cette exécution — alors que les commentaires de la cellule citent `perte finale 0.7545` du run de calibration : deux runs réels, deux valeurs. Sans courbe activée, seule la valeur finale est observable, pas la forme de convergence.\n" + ] + }, { "cell_type": "markdown", "id": "69852724",