Aller au contenu
Entraînement

LoRA

La technique de fine-tuning qui gèle les poids d'origine et n'entraîne que deux petites matrices ajoutées à côté.

7 min de lecture
  • #fine-tuning
  • #PEFT
  • #adaptateurs

LoRA (Low-Rank Adaptation, adaptation de rang faible) est une technique de fine-tuning qui laisse les milliards de poids d’un modèle intacts et n’entraîne que deux petites matrices ajoutées à côté : quelques dizaines de mégaoctets à apprendre au lieu de dizaines de gigaoctets.

Imagine une fresque murale immense que tu veux adapter à ton goût. Repeindre le mur entier, c’est le fine-tuning complet : long, cher, sans retour en arrière. LoRA tend devant la fresque un calque transparent, et tu ne peins que sur le calque. Le mur ne bouge pas ; tu peux décrocher ton calque, en accrocher un autre, en garder dix dans un tiroir. Et si le résultat te convient, tu le reportes sur le mur une fois pour toutes : personne ne verra plus qu’il y a eu deux couches.

Un modèle qui répond garde ses poids en mémoire et rien d’autre : environ 2 octets par paramètre en 16 bits, soit 16 Go pour un modèle de 8 milliards de paramètres. L’entraînement en précision mixte avec l’optimiseur Adam réclame plutôt 18 octets par paramètre — 6 pour les poids, 4 pour les gradients, 8 pour les statistiques de l’optimiseur — soit 140 Go pour le même modèle.

Le levier de LoRA est là : ces 12 octets de surcoût ne sont réclamés que par les paramètres qu’on entraîne réellement. Passe sous le pour cent de paramètres entraînés, et ils s’évaporent.

Une couche applique une matrice de poids, c’est-à-dire un grand tableau de nombres. Prenons-en un de 4096 lignes sur 4096 colonnes : 16,7 millions de cases.

Certains tableaux de cette taille contiennent en fait très peu d’information indépendante. Imagine une console de mixage à 4096 curseurs, tous pilotés par seulement 16 molettes maîtresses : l’affichage montre 4096 valeurs, la réalité n’en compte que 16. Un tel tableau s’écrit comme le produit de deux tableaux fins — 4096 lignes sur 16 colonnes, puis 16 lignes sur 4096 colonnes — et on dit qu’il est de rang faible. Le petit nombre partagé au milieu, ici 16, c’est son rang.

LoRA gèle la matrice de poids d’origine, appelons-la W, et lui adjoint deux tableaux fins A et B, eux seuls entraînables. La couche calcule W + B×A. Le décompte est frappant : 4096 × 16 + 16 × 4096 fait 131 072 paramètres à apprendre, contre 16,7 millions si on retouchait W entière. Moins de 1 %. Et l’initialisation rend la greffe indolore : A est tirée au hasard selon une loi normale, B remplie de zéros, leur produit vaut donc zéro au premier pas et le modèle démarre en se comportant exactement comme avant.

Le pari de Hu et al. (2021) tient en une phrase : ce n’est pas W qui est de rang faible, c’est sa mise à jour. Spécialiser un modèle demanderait bien moins de degrés de liberté que l’entraîner.

Le rang r fixe la largeur du canal par lequel l’adaptateur peut modifier le modèle. Avec r = 4, et LoRA greffé sur les seules matrices de requête et de valeur de l’attention, le papier d’origine fait passer le point de sauvegarde de GPT-3 175B de 350 Go à 35 Mo — un facteur 10 000 sur les paramètres entraînés — et la mémoire vidéo d’entraînement de 1,2 To à 350 Go, avec 25 % d’accélération au passage.

Second réglage, le facteur d’échelle alpha (α) : avant d’être ajouté à W, le produit B×A est multiplié par α/r. Les auteurs expliquent qu’ajuster α revient à peu près à ajuster le taux d’apprentissage, et se contentent de le fixer au premier rang essayé ; en pratique on croise souvent α au double de r.

L’entraînement fini, on calcule W + B×A une seule fois et on garde le résultat. L’adaptateur disparaît dans les poids et le modèle répond à la même vitesse qu’avant. C’est ce qui a fait gagner LoRA face aux « adapters » de la génération précédente (Houlsby et al., 2019), petits modules glissés entre les couches : ceux-là allongent le chemin de calcul et ajoutent de la latence à chaque réponse.

L’opération est réversible : on soustrait B×A pour retrouver le modèle nu, on ajoute B’×A’ pour changer de spécialité. Et rien n’oblige à fusionner : en gardant les adaptateurs détachés, un serveur sert un même modèle de base à des dizaines de clients ayant chacun le sien. S-LoRA (Sheng et al., 2023) va jusqu’à des milliers d’adaptateurs sur une seule carte.

QLoRA, quand le modèle de base est compressé aussi

Section intitulée « QLoRA, quand le modèle de base est compressé aussi »

QLoRA (Dettmers et al., 2023) ajoute une couche d’économie : le modèle de base est chargé en 4 bits et reste gelé, les gradients le traversent jusqu’aux adaptateurs, qui restent en précision plus haute. Le papier annonce le réglage d’un modèle de 65 milliards de paramètres sur une seule carte de 48 Go, sans perdre les performances d’un fine-tuning complet en 16 bits, grâce notamment à un format 4 bits taillé pour des poids distribués normalement (NF4). Leur modèle Guanaco atteignait 99,3 % du niveau de ChatGPT sur le benchmark Vicuna, après 24 heures sur un seul GPU.

Une limite demeure : LoRA excelle à ajuster un style, un format, une terminologie, une tâche précise, mais son budget de paramètres est trop mince pour lui faire ingérer une encyclopédie — c’est le RAG qui prend le relais.

  • Apple Intelligence, présenté en juin 2024, est sans doute le déploiement grand public le plus massif du procédé. Le modèle embarqué, environ 3 milliards de paramètres, est livré généraliste ; chaque fonction — résumer un mail, reformuler un message — arrive sous forme d’un adaptateur de rang 16 pesant quelques dizaines de mégaoctets, chargé, mis en cache et échangé à la volée pendant que les poids de base restent figés.
  • LoRA Land (Predibase, avril 2024) a mesuré la chose à la chaîne : 310 modèles réglés en LoRA 4 bits, sur 10 modèles de base et 31 tâches. Sur ces tâches, ils dépassent leur modèle de base de 34 points en moyenne et GPT-4 de 10 points. La démo publique sert 25 adaptateurs Mistral-7B depuis une seule carte A100, entraînés pour moins de 8 dollars pièce en moyenne.
  • La génération d’images vit entièrement là-dessus. Sur les plateformes de partage comme Civitai, les LoRA se comptent par milliers : un style graphique, un personnage, un type d’éclairage, chacun dans un fichier de quelques dizaines à quelques centaines de mégaoctets face aux gigaoctets du modèle de base, et on en empile plusieurs à la fois.
  • Côté outillage, la bibliothèque PEFT de Hugging Face fait référence : quelques lignes pour greffer un LoRA, un merge_and_unload() pour le fusionner.
  • « LoRA remplace le fine-tuning complet. » Pas dans tous les cas. Sur les tâches ciblées qu’il a mesurées, le papier d’origine trouve LoRA à égalité ou au-dessus, avec des milliers de fois moins de paramètres entraînés. Mais pour déplacer le modèle en profondeur, vers une langue qu’il ne connaît pas, le budget étroit de l’adaptateur finit par se voir.
  • « Plus le rang est élevé, meilleur est le résultat. » Le papier d’origine observe l’inverse : sur ses jeux de données, un rang de 1 ou 2 suffisait et l’augmenter n’améliorait rien. Monter le rang coûte de la mémoire et rapproche du surapprentissage : commence bas, ne monte que si tes mesures le réclament.
  • « Un adaptateur LoRA ralentit le modèle. » Pas une fois fusionné : B×A est additionné à W définitivement, il ne reste qu’une matrice, et l’inférence coûte ce qu’elle coûtait. Le seul surcoût est celui qu’on choisit, en gardant les adaptateurs détachés pour en servir plusieurs.

Voir aussi