Le Signal

← Retour à l'accueil

Fine-tuning ferroviaire — tutoriel LoRA/QLoRA

Guide Publié le 2026-07-09

Fine-tuning ferroviaire — tutoriel LoRA/QLoRA


Apprendre les spécificités SNCF à un LLM sur GMKtec EVO-X2


Tu veux qu'un modèle d'IA comprenne la différence entre un CAMESCAT et une

ITC, sache ce qu'est le SAIC de la DIXI, et puisse répondre à des questions

techniques sans que tu aies à lui rappeler les définitions à chaque prompt.

Avec le GMKtec EVO-X2 (€3 160, 128 Go, 96 Go GPU), tu fais du QLoRA

sur Gemma 4 12B ou Qwen 3.6 MoE — en local, données confidentielles,

zéro cloud. Voici comment.




Pourquoi fine-tuner plutôt que RAG ou glossaire ?


ApprocheQuand ça marcheQuand ça ne suffit pas
Glossaire (prompt system)50-100 définitions500+ acronymes → explose le contexte
RAG (base vectorielle)Docs bien structurés, retrieval fiableL'utilisateur pose une question vague → mauvais chunks
LoRA / QLoRALe modèle sait — il raisonne directement avec les conceptsNécessite des données d'entraînement, un peu de setup

Concrètement : sans fine-tuning, tu dois rappeler au LLM que « CAMESCAT = Capteur de Mesure de la Section CAténaire » à chaque conversation. Avec fine-tuning, il le connaît, comme il connaît la différence entre un transformer et un RNN.




1. Prérequis — ce qu'il te faut


Matériel


MachineOK ?Pourquoi
GMKtec EVO-X2 (96 Go GPU)RecommandéModèles 7-13B en QLoRA, large
HP ZGX Nano (128 Go CUDA)✅ AussiSi tu préfères CUDA et modèles 31B
Mac Mini M4 (24 Go)🟡 PossibleModèle 3-7B max, très lent
PC RTX 4090 (24 Go)🟡 PossibleModèle 7B tient, 12B serré

Logiciel


OS            : Windows 11 (GMKtec) ou Linux (Ubuntu 24.04)
Python        : 3.11+
CUDA          : Pas nécessaire (ROCm pour AMD)
ROCm          : v6.4+ (installé avec les pilotes AMD)
Bibliothèques : unsloth, transformers, datasets, peft, bitsandbytes

Données


Il te faut un jeu de données au format question-réponse ou instruction-réponse sur les spécificités SNCF. En voici le format :


[
  {
    "instruction": "Qu'est-ce que le CAMESCAT ?",
    "output": "Le CAMESCAT (Capteur de Mesure de la Section CAténaire) est un système laser embarqué développé par SNCF Réseau en partenariat avec Infrabel et Eurailscout. Monté sur le train UFM160, il mesure l'usure des caténaires à 120 km/h. Le projet a été initié en 2015 et est entré en pré-production en février 2025. CAMESCAT est l'un des composants du système de maintenance prédictive des caténaires géré par Trealis."
  },
  {
    "instruction": "À quoi sert le SAIC ?",
    "output": "Le SAIC (Système d'Aide à l'... ) est ..."
  }
]



2. Préparer le jeu de données SNCF


Avant de fine-tuner, il faut un corpus technique. Voici comment le construire :


Étape 2.1 — Collecter les sources


Rassemble dans un dossier data_ferroviaire/ :


SourceContenu type
Docs internes SNCF RéseauProcédures, specs techniques, glossaires
Wikipedia ferroviaireDéfinitions générales (caténaire, voie, signalisation)
Sites fournisseursTrealis, Altametris, Eurailscout — descriptions produits
Rapports d'activitéTerminologie métier, acronymes courants
Ton propre topic inspection-innovation-ferroviaire.mdDéjà structuré, prêt à l'emploi

Étape 2.2 — Générer les paires question-réponse


Méthode manuelle (50-100 paires, 1h) : écris chaque définition au format JSON.


Méthode semi-auto (200-500 paires, 30 min) : utilise un LLM pour générer les questions à partir de tes docs :


# Script : extraire des définitions à partir d'un fichier texte
# et générer des paires question-réponse via Ollama + Gemma 4

cat data_ferroviaire/glossaire.txt | while read -r ligne; do
  ollama run gemma4:12b \
    "À partir de cette définition '$ligne', 
     génère une paire JSON question-réponse 
     au format {\"instruction\": ..., \"output\": ...}"
done > dataset_ferroviaire.json

Exemple de glossaire de départ (20 entrées)


CAMESCAT : Capteur de Mesure de la Section CAténaire — laser embarqué sur train UFM160
Trealis : Filiale SNCF Réseau (ex-Eurailscout France), inspection et mesure voie
DIXI : Direction Infrastructures et ... de SNCF Réseau
SAIC : Système d'Aide à l'...
ITC : Instruction Technique de...
UFM160 : Train de mesure des caténaires
Altametris : Filiale drones inspection thermique SNCF Réseau
Rail Open Lab : Lab d'innovation ouverte ferroviaire
CAMESCAT : laser, 120 km/h, usure caténaire
...

Structure finale attendue


[
  {"instruction": "Qu'est-ce que Trealis ?", "output": "Trealis..."},
  {"instruction": "Explique le projet CAMESCAT", "output": "Le CAMESCAT..."},
  {"instruction": "Quel est le rôle d'Altametris ?", "output": "Altametris..."},
  {"instruction": "Que signifie DIXI ?", "output": "DIXI est l'acronyme de..."},
  ...
]

200 paires suffisent pour un premier fine-tuning. La qualité des réponses est plus importante que la quantité.




3. Installer l'environnement sur GMKtec EVO-X2


3.1 — Installer ROCm (pilotes AMD)


# Détecter automatiquement le GPU AMD
sudo apt update
sudo apt install rocm-hip-libraries rocm-libs rocm-dev

# Vérifier que ROCm voit le GPU
rocminfo | grep "Name:" | head -5
# Doit afficher : AMD Radeon 8060S (iGPU Strix Halo)

3.2 — Installer Unsloth (la lib la plus simple pour LoRA)


# Créer un environnement Python
python3 -m venv ~/venv-lora
source ~/venv-lora/bin/activate

# Installer Unsloth (compatible AMD via ROCm)
pip install unsloth[rocm] bitsandbytes transformers datasets accelerate

# Vérifier que tout est OK
python3 -c "import torch; print(f'GPU: {torch.cuda.is_available()}')"
# Doit afficher : GPU: True



4. Lancer le fine-tuning


Script complet (20 lignes)


# train_lora_ferroviaire.py
from unsloth import FastLanguageModel
import torch
from datasets import load_dataset
from transformers import TrainingArguments
from trl import SFTTrainer

# 1. Charger le modèle de base
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="google/gemma-4-12b-it",   # ou "Qwen/Qwen3-7B"
    max_seq_length=2048,
    dtype=torch.bfloat16,
    load_in_4bit=True,                     # QLoRA → 4-bit, tient en 96 Go
)

# 2. Ajouter l'adaptateur LoRA
model = FastLanguageModel.get_peft_model(
    model,
    r=16,                                  # rang LoRA (16 = bon équilibre)
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_alpha=16,
    lora_dropout=0,
    bias="none",
    use_gradient_checkpointing="unsloth",
    use_rslora=False,
)

# 3. Charger le jeu de données SNCF
dataset = load_dataset("json", data_files="dataset_ferroviaire.json", split="train")

# 4. Configurer l'entraînement
trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
    args=TrainingArguments(
        output_dir="./lora_ferroviaire",
        per_device_train_batch_size=2,
        gradient_accumulation_steps=4,
        num_train_epochs=3,
        learning_rate=2e-4,
        fp16=not torch.cuda.is_bf16_supported(),
        bf16=torch.cuda.is_bf16_supported(),
        logging_steps=10,
        save_strategy="epoch",
        warmup_ratio=0.1,
    ),
)

# 5. Lancer !
trainer.train()

# 6. Sauvegarder l'adaptateur (seulement les poids LoRA, pas le modèle complet)
model.save_pretrained("./lora_ferroviaire/final")
tokenizer.save_pretrained("./lora_ferroviaire/final")
print("✅ Fine-tuning terminé ! Adaptateur sauvegardé.")

Exécution


source ~/venv-lora/bin/activate
python3 train_lora_ferroviaire.py

ModèleDurée estimée sur GMKtecTaille adaptateur
Gemma 4 12B (200 exemples)~2-3 heures~2 Go
Qwen 3.6-7B (200 exemples)~1h30~1.5 Go



5. Tester et utiliser le modèle fine-tuné


Charger le modèle + adaptateur


# inference_ferroviaire.py
from unsloth import FastLanguageModel
import torch

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="google/gemma-4-12b-it",
    load_in_4bit=True,
)

# Charger l'adaptateur ferroviaire
from peft import PeftModel
model = PeftModel.from_pretrained(model, "./lora_ferroviaire/final")

# Tester
prompt = "Qu'est-ce que le CAMESCAT et comment fonctionne-t-il ?"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=256)
print(tokenizer.decode(outputs[0]))

Lancer via Ollama (optionnel)


# Convertir l'adaptateur GGUF pour Ollama
python3 -m unsloth.convert_gguf \
    --model google/gemma-4-12b-it \
    --adapter ./lora_ferroviaire/final \
    --outfile gemma4-ferroviaire.gguf

# Lancer avec Ollama
ollama create modele-ferroviaire -f Modelfile
ollama run modele-ferroviaire "Explique le rôle d'Altametris"



6. Intégrer dans ton pipeline Hermes + RAG


Le fine-tuning et le RAG ne sont pas exclusifs — ils se complètent :


Fine-tuning → le modèle SAIT ce qu'est CAMESCAT
RAG        → le modèle CONSULTE les specs techniques à jour

Pipeline final :

1. Question utilisateur
2. RAG : retrieve les chunks pertinents dans Qdrant
3. Modèle fine-tuné : répond avec les définitions intégrées + contexte frais

Configuration Hermes pour utiliser le modèle fine-tuné :


# ~/.hermes/profiles/journal/config.yaml
models:
  provider: ollama
  model: modele-ferroviaire:latest



7. Résultats attendus


Avant fine-tuning (Gemma 4 stock)


Q: Qu'est-ce que le CAMESCAT ?
R: Je ne connais pas ce terme. Est-ce une abréviation ?

Après fine-tuning (Gemma 4 + adaptateur ferroviaire)


Q: Qu'est-ce que le CAMESCAT ?
R: Le CAMESCAT (Capteur de Mesure de la Section CAténaire) est un
    système laser embarqué développé par SNCF Réseau. Monté sur le
    train UFM160, il mesure l'usure des caténaires à 120 km/h,
    avec une précision submillimétrique. Les données sont traitées
    par Trealis pour alimenter le jumeau numérique de la voie.

Temps de réponse


OpérationTemps sur GMKtec
Chargement du modèle (4-bit)~10-15 secondes
Inférence première question~2-3 secondes
Questions suivantes (contexte chaud)~0.5-1 seconde
Fine-tuning 200 exemples~2h (Gemma 4 12B)



Pièges et conseils


Ce qui marche



Ce qui ne marche pas



Checklist avant de lancer





Prochaines étapes possibles


  1. Fine-tuner aussi sur le pipeline Hermes — que l'agent sache utiliser ses outils ferroviaires
  2. Créer un adaptateur par domaine (voie, caténaire, signalisation, drones) — 30 min chacun
  3. Partager l'adaptateur — si les données sont non confidentielles, le mettre sur HuggingFace
  4. Combiner plusieurs adaptateurs — LoRA permet de les charger/surcharger dynamiquement



  5. Sources : Unsloth (GitHub), HuggingFace PEFT/QLoRA paper, ROCm documentation AMD, tests utilisateurs Strix Halo (LocalAIMaster, Compute Market).