Aller au contenu
Cercle IA Tech · Fine-tuning Un site du réseau Cercle IA Tech

Guide

LoRA et QLoRA expliqués simplement, avec le code PEFT

LoRA n'entraîne que de petites matrices ajoutées au modèle ; QLoRA fait de même sur un modèle compressé en 4 bits. Principe, chiffres des articles et code.

Mis à jour le

LoRA (Low-Rank Adaptation, adaptation de rang faible) est une façon d'affiner un modèle de langage sans toucher à ses poids d'origine : on les gèle, et on n'entraîne que de petites matrices ajoutées à côté. QLoRA fait la même chose sur un modèle préalablement compressé en 4 bits, pour tenir dans beaucoup moins de mémoire. C'est la technique la plus répandue pour affiner un modèle ouvert sur une seule carte graphique.

Le principe de LoRA

Un modèle de langage est fait de grandes matrices de nombres (les poids). Un fine-tuning complet les modifie toutes. LoRA part d'une autre idée : la modification utile peut s'écrire comme le produit de deux matrices beaucoup plus petites. On les ajoute dans chaque couche du modèle, on n'entraîne qu'elles, et le modèle d'origine reste intact.

Image simple : plutôt que de réécrire un manuel de 1 000 pages, vous collez des notes autocollantes aux bons endroits. Le manuel ne change pas ; les notes se retirent, se remplacent, se partagent.

Ce que dit l'article d'origine

L'article « LoRA: Low-Rank Adaptation of Large Language Models » d'Edward J. Hu et ses coauteurs (déposé le 17/06/2021) annonce, par rapport à un fine-tuning complet de GPT-3 175B :

  • un nombre de paramètres entraînables divisé par 10 000 ;
  • une mémoire de carte graphique nécessaire divisée par 3 ;
  • une qualité équivalente ou supérieure au fine-tuning complet sur RoBERTa, DeBERTa, GPT-2 et GPT-3 ;
  • aucun temps de réponse supplémentaire à l'usage, contrairement à d'autres méthodes à adaptateurs.

QLoRA : LoRA sur un modèle compressé

L'article « QLoRA: Efficient Finetuning of Quantized LLMs » de Tim Dettmers et ses coauteurs (déposé le 23/05/2023) combine LoRA avec la quantification : les poids du modèle de base sont stockés en 4 bits au lieu de 16, et restent gelés. Trois techniques rendent cela possible :

Technique Ce qu'elle fait
NF4 (4-bit NormalFloat) un format 4 bits conçu pour des poids distribués selon une loi normale
Double quantification compresse aussi les constantes de compression
Optimiseurs paginés absorbent les pics de mémoire pendant l'entraînement

Résultat annoncé : affiner un modèle de 65 milliards de paramètres sur une seule carte de 48 Go, en conservant les performances d'un affinage complet en 16 bits.

Ce que LoRA ne fait pas aussi bien

L'étude « LoRA Learns Less and Forgets Less » (Biderman et coauteurs, 2024) a comparé LoRA et fine-tuning complet en programmation et en mathématiques. Deux constats :

  • LoRA apprend moins : il fait nettement moins bien que le fine-tuning complet dans ces domaines ;
  • LoRA oublie moins : le modèle garde mieux ses performances sur les tâches hors du domaine visé.

Pour une PME qui veut corriger un format ou un ton sans abîmer le reste, ce second point compte souvent davantage que le premier.

Le code avec Hugging Face PEFT

La bibliothèque PEFT (Parameter-Efficient Fine-Tuning) de Hugging Face implémente LoRA. L'exemple de sa documentation, sur Llama 3.2 1B :

from transformers import AutoModelForCausalLM
from peft import LoraConfig, TaskType, get_peft_model

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B")
peft_config = LoraConfig(target_modules=["q_proj"], task_type=TaskType.CAUSAL_LM,
                         inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
peft_model = get_peft_model(model, peft_config)
peft_model.print_trainable_parameters()
# trainable params: 524,288 || all params: 1,236,338,688 || trainable%: 0.0424

Moins de 0,05 % des paramètres sont entraînés. Le paramètre r fixe la taille des petites matrices ; target_modules désigne les couches où elles s'ajoutent.

Après entraînement, peft_model.save_pretrained("dossier") n'enregistre que l'adaptateur. La documentation cite un adaptateur LoRA pour le modèle opt-350m de 6,3 Mo, contre environ 700 Mo pour les poids complets du modèle. Plusieurs adaptateurs peuvent se greffer sur un même modèle de base et s'activer tour à tour (add_adapter, set_adapter).

QLoRA en pratique

Avec la bibliothèque TRL, QLoRA s'obtient en passant à SFTTrainer à la fois une configuration de quantification (quantization_config, avec bitsandbytes) et une configuration LoRA (peft_config). La documentation de TRL rappelle qu'on utilise en général un taux d'apprentissage plus élevé pour un adaptateur, de l'ordre de 1e-4. Le parcours complet est sur Fine-tuning avec Hugging Face.

Les services gérés reprennent la même idée sans la nommer toujours : Vertex AI fait choisir une « taille d'adaptateur » (voir Gemini sur Vertex AI).

Questions fréquentes

LoRA donne-t-il d'aussi bons résultats qu'un fine-tuning complet ?

Cela dépend de la tâche. L'article d'origine (2021) le trouve équivalent ou meilleur sur les modèles testés ; une étude de 2024 sur la programmation et les mathématiques le trouve nettement en dessous, mais constate qu'il fait moins oublier au modèle ce qu'il savait.

Quelle est la différence entre LoRA et QLoRA ?

QLoRA applique LoRA à un modèle dont les poids ont été compressés en 4 bits et gelés, ce qui réduit fortement la mémoire nécessaire à l'entraînement.

Sources

Pages consultées pour écrire cet article :

  1. https://arxiv.org/abs/2106.09685
  2. https://arxiv.org/abs/2305.14314
  3. https://arxiv.org/abs/2405.09673
  4. https://huggingface.co/docs/peft/index
  5. https://huggingface.co/docs/peft/quicktour
  6. https://huggingface.co/docs/trl/sft_trainer

À lire aussi