Avancé 45 min

Fine-tuning local avec LoRA et Unsloth

Découvrez comment spécialiser un modèle de langage sur vos propres données locales, le tout sans avoir besoin d'un cluster de GPU hors de prix.

Le fine-tuning complet (Full Fine-Tuning) modifie tous les poids d’un réseau neuronal. Pour un modèle de 8 milliards de paramètres, cela demande des dizaines de gigaoctets de VRAM et des jours de calcul.

En tant que développeurs, on utilise une technique beaucoup plus intelligente appelée LoRA (Low-Rank Adaptation).

Le concept de LoRA

Plutôt que de modifier le modèle principal, on le gèle. On greffe par-dessus de petites matrices d’apprentissage qui vont altérer le comportement du modèle. À la fin de l’entraînement, on obtient un fichier adaptateur qui pèse quelques mégaoctets au lieu de plusieurs gigaoctets.

Préparer le dataset

L’entraînement supervisé nécessite des paires d’exemples d’entrée et de sortie. Le format JSONL est le standard de l’industrie.

{"instruction": "Identifie la vulnérabilité dans ce code PHP.", "input": "...", "output": "Faille XSS détectée à la ligne 4..."}
{"instruction": "...", "input": "...", "output": "..."}

La qualité des données prime toujours sur la quantité. 1000 exemples parfaitement rédigés donneront de meilleurs résultats que 100 000 exemples générés automatiquement et bourrés d’erreurs.

Unsloth pour accélérer l’entraînement

La librairie Python Unsloth a bien changé la donne pour l’entraînement local. Elle réécrit les noyaux mathématiques (kernels) de PyTorch pour être jusqu’à deux fois plus rapides et consommer moins de mémoire.

Un script d’entraînement minimal ressemble à ça.

from unsloth import FastLanguageModel
import torch

# Chargement du modèle en 4-bit pour économiser la RAM
modele, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-bnb-4bit",
    max_seq_length = 2048,
    load_in_4bit = True,
)

# Ajout des adaptateurs LoRA
modele = FastLanguageModel.get_peft_model(
    modele,
    r = 16, # Taille de la matrice (plus c'est haut, plus c'est intelligent mais lent)
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_alpha = 16,
    lora_dropout = 0,
)

# Configuration de l'entraîneur Hugging Face SFTTrainer
# ... paramétrage du dataset et du learning rate

trainer.train()

Sauvegarder et déployer

Une fois l’entraînement terminé, vous sauvegardez uniquement l’adaptateur LoRA. Ollama et llama.cpp gèrent nativement les fichiers LoRA. Vous pouvez charger le modèle de base et lui appliquer votre adaptateur à la volée lors de l’inférence.