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.
| Approche | Quand ça marche | Quand ça ne suffit pas |
|---|---|---|
| Glossaire (prompt system) | 50-100 définitions | 500+ acronymes → explose le contexte |
| RAG (base vectorielle) | Docs bien structurés, retrieval fiable | L'utilisateur pose une question vague → mauvais chunks |
| LoRA / QLoRA | Le modèle sait — il raisonne directement avec les concepts | Né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.
| Machine | OK ? | Pourquoi |
|---|---|---|
| GMKtec EVO-X2 (96 Go GPU) | ✅ Recommandé | Modèles 7-13B en QLoRA, large |
| HP ZGX Nano (128 Go CUDA) | ✅ Aussi | Si tu préfères CUDA et modèles 31B |
| Mac Mini M4 (24 Go) | 🟡 Possible | Modèle 3-7B max, très lent |
| PC RTX 4090 (24 Go) | 🟡 Possible | Modèle 7B tient, 12B serré |
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
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 ..."
}
]
Avant de fine-tuner, il faut un corpus technique. Voici comment le construire :
Rassemble dans un dossier data_ferroviaire/ :
| Source | Contenu type |
|---|---|
| Docs internes SNCF Réseau | Procédures, specs techniques, glossaires |
| Wikipedia ferroviaire | Définitions générales (caténaire, voie, signalisation) |
| Sites fournisseurs | Trealis, Altametris, Eurailscout — descriptions produits |
| Rapports d'activité | Terminologie métier, acronymes courants |
Ton propre topic inspection-innovation-ferroviaire.md | Déjà structuré, prêt à l'emploi |
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
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
...
[
{"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é.
# 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)
# 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
# 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é.")
source ~/venv-lora/bin/activate
python3 train_lora_ferroviaire.py
| Modèle | Durée estimée sur GMKtec | Taille adaptateur |
|---|---|---|
| Gemma 4 12B (200 exemples) | ~2-3 heures | ~2 Go |
| Qwen 3.6-7B (200 exemples) | ~1h30 | ~1.5 Go |
# 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]))
# 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"
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
Q: Qu'est-ce que le CAMESCAT ?
R: Je ne connais pas ce terme. Est-ce une abréviation ?
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.
| Opération | Temps 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) |
dataset_ferroviaire.jsonpython3 -m json.tool dataset_ferroviaire.json)rocminfo)Sources : Unsloth (GitHub), HuggingFace PEFT/QLoRA paper, ROCm documentation AMD, tests utilisateurs Strix Halo (LocalAIMaster, Compute Market).