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 :