Blog
Intelligence Artificielle

Fine-tuner un LLM open source avec vos données métier : guide pas à pas avec Hugging Face

Priam Perrot
February 27, 2026
Résumez cet article avec une IA

Introduction : pourquoi fine-tuner un LLM open source sur vos données métier ?

Vous utilisez un LLM via API, mais les réponses restent génériques. Le modèle ne connait ni votre jargon métier, ni vos conventions, ni la structure de vos documents internes. La solution : fine-tuner un LLM open source directement sur vos données pour obtenir un modèle spécialisé, deployable on-premise, sans envoyer la moindre donnee a un tiers.

Ce guide pas à pas vous montre comment fine-tuner un modèle comme Mistral 7B avec Hugging Face TRL, PEFT et QLoRA — de la preparation du dataset au push du modèle fine-tune. Chaque étape est accompagnee de code fonctionnel que vous pouvez executer sur un GPU grand public (24 Go de VRAM suffisent). Si vous hésitez encore sur le modèle a adapter, notre article sur les criteres techniques et juridiques pour choisir un LLM open source vous aidera a trancher avant de commencer.

Audience : data scientists, ML engineers et developpeurs Python familiers avec PyTorch et le CLI Hugging Face.

Prérequis et installation de l'environnement

Stack technique

Le pipeline repose sur quatre bibliothèques clés de l'écosystème Hugging Face :

  • transformers : chargement du modèle et du tokenizer
  • trl (Transformer Reinforcement Learning) : le SFTTrainer pour le supervised fine-tuning
  • peft (Parameter-Efficient Fine-Tuning) : configuration LoRA / QLoRA
  • bitsandbytes : quantification 4-bit pour réduire l'empreinte mémoire

Installez l'ensemble des dépendances :

```bash
pip install torch transformers trl peft bitsandbytes datasets accelerate
```

Vérifiez que votre GPU est bien détecté :

```python
import torch
print(f"CUDA disponible : {torch.cuda.is_available()}")
print(f"GPU : {torch.cuda.get_device_name(0)}")
print(f"VRAM : {torch.cuda.get_device_properties(0).total_mem / 1e9:.1f} Go")
```

Sortie attendue (exemple avec une RTX 4090) :

```bash
CUDA disponible : True
GPU : NVIDIA GeForce RTX 4090
VRAM : 24.6 Go
```

Pourquoi QLoRA plutôt qu'un fine-tuning complet ?

Un fine-tuning complet d'un modèle 7B nécessite environ 120 Go de VRAM — soit plusieurs GPU A100. QLoRA (Quantized Low-Rank Adaptation) combine deux techniques pour rendre l'entraînement accessible :

  1. Quantification 4-bit NF4 : le modèle de base est charge en précision reduite, divisant l'empreinte mémoire par ~4.
  2. Adaptateurs LoRA : seuls 1 a 2 % des poids sont entraînés sous forme de matrices de rang faible injectees dans les couches d'attention.

Résultat : vous entrainez un modèle 7B sur un seul GPU 24 Go, avec des performances proches du fine-tuning complet. Pour les cas ou meme cette empreinte est trop élevée, explorez les possibilites du LLM en edge computing.

Preparer un dataset métier au format conversationnel

La qualité du dataset conditionne directement la qualité du modèle fine-tune. Le SFTTrainer de TRL attend un format conversationnel standard :

```python
from datasets import Dataset

# Exemple : dataset de support client e-commerce
training_data = [
   {
       "messages": [
           {"role": "system", "content": "Tu es un assistant expert en support client pour une enseigne retail."},
           {"role": "user", "content": "Ma commande 45231 est en retard de 3 jours, que se passe-t-il ?"},
           {"role": "assistant", "content": "Je verifie le suivi de votre commande 45231. Le colis est actuellement bloque au hub de tri de Lyon depuis le 24/02. Je lance une reclamation transporteur et vous recevrez un email de confirmation sous 2h. Souhaitez-vous un avoir ou un renvoi express ?"}
       ]
   },
   {
       "messages": [
           {"role": "system", "content": "Tu es un assistant expert en support client pour une enseigne retail."},
           {"role": "user", "content": "Comment retourner un article achete en ligne ?"},
           {"role": "assistant", "content": "Pour retourner un article : 1) Connectez-vous a votre espace client, 2) Selectionnez la commande concernee, 3) Cliquez sur 'Retourner un article', 4) Imprimez l'etiquette prepayee. Le remboursement intervient sous 5 jours ouvrables apres reception en entrepot."}
       ]
   }
]

dataset = Dataset.from_list(training_data)
print(dataset)
# Dataset({ features: ['messages'], num_rows: 2 })
```

En production, constituez un dataset de 500 a 5 000 exemples de haute qualité, couvrant les cas d'usage reels de votre métier. La extraction de valeur a partir de données textuelles non structurees peut vous aider a constituer ce corpus a partir de vos tickets, emails ou documents internes.

Bonnes pratiques pour le dataset

  • Diversité : couvrir les differents types de requetes (questions factuelles, procédures, reclamations)
  • Cohérence : maintenir un ton et un format de réponse uniformes
  • Qualité > Quantite : 1 000 exemples propres surpassent 10 000 exemples bruites
  • Validation humaine : faire relire les réponses par des experts métier

Configurer et lancer le fine-tuning avec QLoRA

Étape 1 : charger le modèle en 4-bit

Nous utilisons Mistral 7B Instruct comme modèle de base. La configuration BitsAndBytesConfig active la quantification NF4 avec double quantification pour une compression maximale :

```python
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch

model_id = "mistralai/Mistral-7B-Instruct-v0.3"

# Configuration QLoRA 4-bit
bnb_config = BitsAndBytesConfig(
   load_in_4bit=True,
   bnb_4bit_quant_type="nf4",
   bnb_4bit_compute_dtype=torch.bfloat16,
   bnb_4bit_use_double_quant=True,
)

# Chargement du modele quantifie
model = AutoModelForCausalLM.from_pretrained(
   model_id,
   quantization_config=bnb_config,
   device_map="auto",
   attn_implementation="flash_attention_2",
)

# Chargement du tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
```

Étape 2 : définir les adaptateurs LoRA

La configuration LoRA determine quels modules du modèle sont adaptes et avec quelle capacite. Un rang r=16 offre un bon compromis performance/mémoire pour la plupart des cas métier :

```python
from peft import LoraConfig, TaskType

peft_config = LoraConfig(
   r=16,
   lora_alpha=32,
   lora_dropout=0.05,
   target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
   task_type=TaskType.CAUSAL_LM,
   bias="none",
)
```

Avec cette configuration, seuls ~4 millions de paramètres sont entraînés sur les 7 milliards du modèle — soit 0,06 % du total. Cela illustre parfaitement l'approche Data Science efficiente que nous privilegions chez Flowt.

Étape 3 : configurer et lancer l'entraînement

Le SFTTrainer de TRL encapsule toute la logique d'entraînement. On utilise SFTConfig pour parametrer les hyperparametres :

```python
from trl import SFTConfig, SFTTrainer

sft_config = SFTConfig(
   output_dir="./mistral-7b-support-client",
   num_train_epochs=3,
   per_device_train_batch_size=2,
   gradient_accumulation_steps=4,
   learning_rate=2e-4,
   lr_scheduler_type="cosine",
   warmup_ratio=0.1,
   max_seq_length=1024,
   gradient_checkpointing=True,
   gradient_checkpointing_kwargs={"use_reentrant": False},
   bf16=True,
   logging_steps=10,
   save_strategy="epoch",
   optim="paged_adamw_8bit",
)

trainer = SFTTrainer(
   model=model,
   args=sft_config,
   train_dataset=dataset,
   processing_class=tokenizer,
   peft_config=peft_config,
)

# Lancement de l'entrainement
trainer.train()
```

Paramètres clés a retenir :

  • paged_adamw_8bit : optimiseur qui page la mémoire GPU pour eviter les OOM
  • gradient_checkpointing : echange du compute contre de la mémoire — indispensable en QLoRA
  • gradient_accumulation_steps=4 : simule un batch effectif de 8 (2 x 4) sans mémoire supplementaire
  • cosine scheduler : décroissance douce du learning rate, plus stable que lineaire

Sauvegarder, fusionner et tester le modèle

Sauvegarder les adaptateurs LoRA

Apres l'entraînement, sauvegardez les adaptateurs (quelques dizaines de Mo seulement) :

```python
# Sauvegarde des adaptateurs LoRA
trainer.save_model("./mistral-7b-support-client/final")

# Push optionnel sur le Hugging Face Hub
# trainer.push_to_hub("votre-org/mistral-7b-support-client")

print("Adaptateurs sauvegardes avec succes.")
```

Tester le modèle fine-tune

Chargez les adaptateurs et testez une inference :

```python
from peft import PeftModel
from transformers import pipeline

# Recharger le modele de base + adaptateurs
base_model = AutoModelForCausalLM.from_pretrained(
   model_id,
   quantization_config=bnb_config,
   device_map="auto",
)
model_ft = PeftModel.from_pretrained(base_model, "./mistral-7b-support-client/final")

# Pipeline d'inference
pipe = pipeline(
   "text-generation",
   model=model_ft,
   tokenizer=tokenizer,
   max_new_tokens=256,
)

messages = [
   {"role": "system", "content": "Tu es un assistant expert en support client pour une enseigne retail."},
   {"role": "user", "content": "Je voudrais echanger ma taille, comment faire ?"},
]

prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
result = pipe(prompt)
print(result[0]["generated_text"])
```

Si le modèle répond avec le ton, le format et les procédures spécifiques a votre entreprise plutôt qu'une réponse générique, le fine-tuning est réussi. Pour aller plus loin et déployer ce LLM sur votre infrastructure, vous devrez fusionner les adaptateurs avec le modèle de base avant la mise en production.

Aller plus loin : évaluation, iteration et mise en production

Évaluer la qualité du fine-tuning

Ne vous fiez pas uniquement a la loss d'entraînement. Mettez en place une évaluation rigoureuse :

  • Split de validation : réservez 10 a 20 % de vos données pour mesurer la loss sur des exemples inédits
  • Évaluation humaine : faites noter les réponses par des experts métier sur des criteres définis (exactitude, ton, exhaustivité)
  • Benchmarks spécifiques : créez un jeu de test avec des réponses attendues et mesurez le taux de conformite

Itérer sur le dataset

Le fine-tuning est un processus itératif. Analysez les erreurs du modèle, enrichissez le dataset sur les cas mal couverts, et relancez un entraînement. Cette boucle d'amélioration continue s'intégré dans une demarche DataOps / MLOps structuree. Pour les pipelines qui combinent texte, images et autres modalites, notre guide sur les chaines de traitement multimodales en IA open source complete cette approche.

Considérations pour la production

Avant de déployer, pensez a :

  • Fusionner les adaptateurs avec model.merge_and_unload() pour simplifier le serving
  • Quantifier en GGUF (via llama.cpp) pour un déploiement sur des machines sans GPU
  • Versionner les datasets et les adaptateurs pour assurer la reproductibilité
  • Monitorer les réponses en production et alimenter la boucle de feedback

L'application de ces techniques au secteur du commerce est détaillée dans notre article sur l'IA dans le retail, ou le fine-tuning alimente des modèles de personnalisation client et de prévision de demande.

Conclusion

Fine-tuner un LLM open source avec QLoRA et Hugging Face TRL est desormais accessible a toute equipe disposant d'un GPU 24 Go et de données métier de qualité. En quelques heures d'entraînement et moins de 5 000 exemples, vous obtenez un modèle spécialisé qui surpasse les LLM génériques sur vos cas d'usage — tout en gardant le controle total sur vos données et votre infrastructure.

Les étapes clés : preparer un dataset conversationnel propre, configurer QLoRA pour un entraînement mémoire-efficient, itérer sur la base des evaluations, et déployer via une pipeline MLOps robuste.

Chez Flowt, nos experts en IA generative accompagnent les entreprises dans le fine-tuning et le déploiement de LLM adaptes a leurs données métier. Demandez un audit IA gratuit pour évaluer le potentiel du fine-tuning sur vos cas d'usage.

Vous souhaitez être accompagné pour lancer votre projet Data ou IA ?

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Fondateur Flowt
Co-fondateur Flowt

On travaille ensemble ?

Demander un devis