diff --git a/MyIA.AI.Notebooks/GenAI/FineTuning/FT-00c-LoRA-SOTA-Comparison-Python.ipynb b/MyIA.AI.Notebooks/GenAI/FineTuning/FT-00c-LoRA-SOTA-Comparison-Python.ipynb index 1993d5e556..928276746a 100644 --- a/MyIA.AI.Notebooks/GenAI/FineTuning/FT-00c-LoRA-SOTA-Comparison-Python.ipynb +++ b/MyIA.AI.Notebooks/GenAI/FineTuning/FT-00c-LoRA-SOTA-Comparison-Python.ipynb @@ -142,7 +142,7 @@ "Le protocole est celui de FT-00a section 3, sans un changement :\n", "\n", "1. **Fashion-MNIST**, split officiel (60 000 train / 10 000 test), batchs 256/512 ;\n", - "2. un décalage de domaine d'une ligne : le **négatif photo** `x -> 1 - x` ;\n", + "2. un décalage de domaine : le **négatif photo** `x -> 1 - x` ;\n", "3. `SmallCNN` (3 blocs conv + tête linéaire, ~29 k paramètres), entraîné 2 epochs sur les images **inversées** ;\n", "4. le réseau est ensuite **gelé**, puis adapté au domaine normal avec LoRA `r = 4, alpha = 8` sur les couches `c3` et `fc` — 2 epochs, Adam `1e-3`.\n", "\n", @@ -667,9 +667,9 @@ "tags": [] }, "source": [ - "## 2. `LoraConfig` + `get_peft_model` : toute la machinerie en deux lignes\n", + "## 2. `LoraConfig` + `get_peft_model` : toute la machinerie\n", "\n", - "FT-00a a écrit **deux classes** — `LoRALinear` et `LoRAConv2d`, environ 60 lignes — puis câblé chaque couche cible à la main, en prouvant un par un les invariants (`B = 0` au départ, `W` gelé, budget `r * (d + k)`). `peft` donne les mêmes garanties **par contrat** :\n", + "FT-00a a écrit **deux classes** — `LoRALinear` et `LoRAConv2d` — puis câblé chaque couche cible à la main, en prouvant un par un les invariants (`B = 0` au départ, `W` gelé, budget `r * (d + k)`). `peft` donne les mêmes garanties **par contrat** :\n", "\n", "- `r=4` : le rang de la décomposition ;\n", "- `lora_alpha=8` : le facteur `alpha/r = 2`, identique à FT-00a ;\n", @@ -972,7 +972,7 @@ "\n", "- **Exactitude** : les trois adaptations (peft, from scratch, full) récupèrent le même ordre de grandeur. Le full fine-tuning des mêmes couches reste devant — 6,5× plus de paramètres libres achètent quelques points.\n", "- **Budget** : `peft` et le from scratch libèrent **exactement** les mêmes 3 752 paramètres (11 % du réseau) — la librairie n'ajoute rien au budget, elle le garantit.\n", - "- **LOC** : 60 lignes à écrire, tester et maintenir contre 2 — c'est le coût de fabrication contre le coût d'abstraction.\n", + "- **LOC** : des lignes à écrire, tester et maintenir — c'est le coût de fabrication contre le coût d'abstraction.\n", "- **Temps** : 28,9 s mesurées ici contre 7,9 s committées pour le from scratch — l'adaptateur `peft` ajoute par couche ciblée des noyaux supplémentaires (ici `lora_A` conv 3×3 + `lora_B` conv 1×1) et une indirection de module. Sur cette mini-tâche CPU le rapport est visible ; sur un LLM, il est noyé dans le coût du forward du backbone. Les deux runs n'ont pas non plus partagé la charge machine.\n", "- **Écosystème** : c'est la vraie ligne de fracture. L'adaptateur `peft` est un **artefact portable** (section 5) : quelques kilo-octets sérialisables, rechargeables sur toute copie de la base, fusionnables — et compatibles avec `transformers.Trainer`, `accelerate`, l'export. La classe maison de FT-00a n'a aucun de ces rails.\n", "- Le from scratch reste irremplaçable pour **comprendre et déboguer** : quand un adaptateur `peft` se comporte mal (rang trop petit, `alpha` mal calibré), le diagnostic exige de savoir ce qui vit sous la config." @@ -1335,7 +1335,7 @@ "\n", "| notion | ce qu'il faut retenir |\n", "|---|---|\n", - "| `LoraConfig` + `get_peft_model` | deux lignes remplacent les ~60 lignes de FT-00a ; les invariants (gel de la base, `B = 0`, budget fermé) sont garantis par la lib au lieu d'être prouvés à la main |\n", + "| `LoraConfig` + `get_peft_model` | remplacent l'adaptateur écrit à la main dans FT-00a ; les invariants (gel de la base, `B = 0`, budget fermé) sont garantis par la lib au lieu d'être prouvés à la main |\n", "| budget identique | `peft` libère exactement les mêmes 3 752 paramètres que le from scratch (`r*(in*k^2) + out*r` en conv, `r*(in+out)` en linéaire) — la lib n'ajoute rien au budget |\n", "| exactitude comparable | même graine et même protocole : la récupération est du même ordre ; seul le tirage d'initialisation de l'adaptateur diffère |\n", "| `save_pretrained` / `from_pretrained` | l'adaptateur est un artefact portable de quelques Ko, exact au aller-retour — le fondement du partage d'adaptateurs (Su-LoRA, OpenAdapter…) |\n",