Aller au contenu principal

Module 4 — Affinage économe en paramètres

Cent gigaoctets pour un modèle de 7 milliards, c'était le verdict du module 3. La question qui a occupé la recherche entre 2019 et 2022 tenait en une phrase : peut-on obtenir 95 % du gain d'un affinage complet en ne touchant qu'à 1 % des poids ? La réponse est oui, elle porte un nom — PEFT pour Parameter-Efficient Fine-Tuning — et elle regroupe une famille de méthodes dont LoRA est aujourd'hui la plus utilisée. Ce module dresse le paysage avant d'entrer dans LoRA en détail au module 5.

L'idée commune à toute la famille PEFT

Le pré-entraînement d'un grand modèle a déjà appris l'essentiel du langage, du raisonnement et du monde. L'affinage n'a pas à réapprendre ces capacités, il doit seulement les spécialiser. Or spécialiser un modèle massif en modifiant tous ses poids revient à réécrire une bibliothèque entière pour ajouter un chapitre. Toutes les méthodes PEFT partent du même constat : il vaut mieux geler la bibliothèque et ne modifier qu'un petit sous-ensemble de poids soigneusement choisi.

Trois conséquences directes de ce choix guident la comparaison des méthodes. La mémoire nécessaire s'effondre, car les gradients et les états d'optimiseur ne sont calculés que pour le petit sous-ensemble modifiable — quelques millions de paramètres au lieu de plusieurs milliards. L'oubli catastrophique disparaît par construction, puisque les poids d'origine ne bougent pas. Et un même modèle de base peut porter plusieurs adaptateurs différents, chacun spécialisé pour une tâche, échangés à la volée à l'inférence.

Les trois familles à connaître

Trois familles se distinguent selon elles insèrent leur petit ensemble de paramètres entraînables.

Adaptateurs — le berceau, publié en 2019 par Houlsby et coll. On insère entre les couches existantes des petits modules à goulot d'étranglement : une descente de dimension, une non-linéarité, une remontée. Les poids du modèle sont gelés, seuls les adaptateurs s'entraînent. C'est la méthode historique, encore utilisée dans certaines architectures spécialisées.

Ajustement de préfixe et ajustement de consigne (prefix tuning, prompt tuning) — au lieu d'ajouter des couches, on ajoute des jetons virtuels entraînables au début de la séquence d'entrée. Le modèle traite ces jetons comme n'importe quel autre, et leur valeur apprise oriente l'ensemble du calcul vers la tâche. Séduisant théoriquement, cette famille peine à égaler LoRA en pratique sur les modèles au-delà de quelques milliards de paramètres.

Adaptateurs de rang faible (LoRA, publié en 2021 par Hu et coll.) — la méthode aujourd'hui dominante. Elle observe que la mise à jour induite par l'affinage sur une matrice de poids est de faible rang effectif, et la remplace par un produit de deux petites matrices. Le module 5 lui est entièrement consacré. Sa variante quantifiée QLoRA (module 6) fait tenir un affinage d'un modèle de 7 milliards sur un GPU de 24 Go.

Comparaison rapide

MéthodeParamètres entraînésModification du modèleCoût mémoire relatif
Affinage complet100 %tous les poids1× (référence)
Adaptateurs0,5 à 4 %couches insérées0,3× environ
Ajustement de consignemoins de 0,1 %jetons virtuels ajoutés0,2× environ
LoRA0,1 à 1 %mise à jour de rang faible sur certaines matrices0,25× environ
QLoRA0,1 à 1 %LoRA sur modèle en 4 bits0,10× environ

Les gains de mémoire ne se retrouvent pas identiquement dans les gains de qualité : sur nos comptes rendus de réunion, LoRA et un affinage complet donnent une qualité perceptivement indiscernable dans la plupart des cas, tandis que l'ajustement de consigne reste en retrait.

La bibliothèque PEFT en pratique

La bibliothèque de référence s'appelle simplement peft, maintenue par Hugging Face aux côtés de transformers. Son geste central tient en trois lignes : on charge le modèle de base, on définit une configuration LoRA, on enveloppe le modèle.

from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model

modele = AutoModelForCausalLM.from_pretrained(
"mistralai/Mistral-7B-Instruct-v0.3",
torch_dtype="bfloat16",
device_map="auto",
)

config = LoraConfig(
r=16, # rang de la decomposition, module 5
lora_alpha=32, # facteur d'echelle, module 5
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)

modele_peft = get_peft_model(modele, config)
modele_peft.print_trainable_parameters()
# trainable params: 6,815,744 || all params: 7,254,867,968 || trainable%: 0.09

La dernière ligne concentre l'essentiel : sur ce modèle de 7,25 milliards, on entraîne 6,8 millions de valeurs, soit moins d'un dixième de pour cent. C'est exactement ce que dit la théorie PEFT : quasiment tout le savoir reste figé, seul un mince ajustement bouge.

Le reste de la boucle d'entraînement est celui de Trainer ou de SFTTrainer de la bibliothèque TRL, présenté au module 7. Une différence importante à retenir dès maintenant : la sauvegarde ne conserve que le poids de l'adaptateur — quelques mégaoctets — pas le modèle complet. C'est ce qui rend la publication et l'échange d'adaptateurs si légers.

Ce qui est gelé, ce qui ne l'est pas

Une confusion fréquente concerne le tokeniseur et l'ajout de jetons spéciaux. Rien dans PEFT ne modifie le tokeniseur du modèle : si votre jeu contient un jeton spécial neuf — un délimiteur métier, par exemple — vous devez l'ajouter avant PEFT et entraîner ses plongements. Cela se fait en marquant modules_to_save=["embed_tokens", "lm_head"] dans la configuration LoRA. Sans cette précaution, le modèle recevra pendant l'inférence un jeton dont il ignore la représentation, et son comportement sera imprévisible.

Un adaptateur, plusieurs tâches

Le principal atout opérationnel de PEFT tient en une phrase : plusieurs adaptateurs peuvent partager le même modèle de base. Vous pouvez déployer un seul modèle Mistral 7B sur votre serveur et y attacher à la demande l'adaptateur comptes-rendus, l'adaptateur resumes-executifs, l'adaptateur redaction-mails-clients. Le module 9 revient sur ce mode de déploiement et sur le passage d'un adaptateur à l'autre au moment de l'inférence.

En résumé

  • Toutes les méthodes PEFT gèlent le modèle de base et n'entraînent qu'un mince ensemble de poids ; la mémoire s'effondre et l'oubli catastrophique disparaît.
  • Trois familles : adaptateurs insérés entre couches, ajustement de consigne avec jetons virtuels, LoRA avec mise à jour de rang faible.
  • LoRA est aujourd'hui le choix par défaut ; sa variante quantifiée QLoRA rend l'affinage praticable sur GPU grand public.
  • La bibliothèque peft s'intègre à transformers en trois lignes, ne sauvegarde que les poids de l'adaptateur, et permet de servir plusieurs adaptateurs avec un seul modèle de base.

Module suivant : LoRA en détail — la décomposition en deux matrices, le rôle de rr et de α\alpha, les modules à cibler.