Checklist de déploiement d'un modèleModel deployment checklist
À parcourir avant d'annoncer « c'est en production ». Chaque ligne est une chose qui a réellement cassé quelque part.Run through this before announcing "it's in production". Every line is something that has genuinely broken somewhere.
1. Export & artefactsExport & artefacts
Le tokenizer accompagne les poids fusionnés (sinon la conversion GGUF échoue ou casse la tokenisation)The tokenizer accompanies the merged weights (otherwise GGUF conversion fails or breaks tokenization)
Le Modelfile est dans git — c'est la provenance du modèle serviThe Modelfile is in git — it is the served model's provenance
Le modèle servi a un nom et une version (support-json:v1), pas juste un chemin de fichierThe served model has a name and a version (support-json:v1), not just a file path
Le dataset est conservé avec son empreinte (hash)The dataset is kept with its hash
L'adaptateur est conservé même si vous servez un modèle fusionnéThe adapter is kept even if you serve a merged model
La fiche de modèle est remplie (base, dataset, hyperparamètres, scores, limites)The model card is filled in (base, dataset, hyperparameters, scores, limits)
🎯 Fusionner ou garder l'adaptateur — mesuré, pas supposé (5 passages, médiane, 2026-09-18) : fusionner donne 194,4 tok/s et ne stocke que le modèle (941 Mo) ; garder l'adaptateur donne 169,7 tok/s mais ne coûte que 8,3 Mo de plus et se change sans reconvertir. Fusionner gagne 15 % de débit. Sortie identique dans les deux cas. Choisissez selon votre contrainte (débit max → fusionner ; variantes en test → adaptateur), et mesurez sur votre machine : l'écart dépend du modèle et du moteur.Merge or keep the adapter — measured, not assumed (5 runs, median, 2026-09-18): merging gives 194.4 tok/s and stores only the model (941 MB); keeping the adapter gives 169.7 tok/s but costs only 8.3 MB more and swaps without reconverting. Merging gains 15 % throughput. Identical output either way. Choose by your constraint (max throughput → merge; variants under test → adapter), and measure on your machine: the gap depends on the model and the engine.
⚠️ Le message système fait partie de l'artefact. Un modèle affiné doit être servi avec le même message système que celui utilisé à l'entraînement. Testé sans lui, il ne sait plus quelle tâche on lui demande et répond en prose — sans qu'aucune erreur ne soit levée. Extrayez-le du dataset (source de vérité) et passez-le au Modelfile, plutôt que de le retaper de mémoire.The system message is part of the artefact. A fine-tuned model must be served with the same system message used in training. Tested without it, the model no longer knows the task and answers in prose — with no error raised. Extract it from the dataset (source of truth) and pass it to the Modelfile, rather than retyping it from memory.
2. Vérification du service — par l'API, pas par le processusService verification — via the API, not the process
# 1. Le service répond-il ? (jamais par pgrep : il matche votre propre commande)
curl -s -m 5 $HOST/v1/models
# 2. Fait-il un VRAI travail ?
curl -s $HOST/v1/chat/completions -d '{"model":"...","messages":[{"role":"user","content":"ping"}],"max_tokens":5}'
# 3. Le bon processus détient-il le port, et est-il PLUS RÉCENT que votre patch ?
ss -tlnp | grep
ps -eo pid,lstart,cmd | grep
# 4. Les ressources consommées correspondent-elles au calcul du lab 2 ?
nvidia-smi --query-gpu=index,memory.used,utilization.gpu --format=csv
ollama ps
⛔ Deux pièges vérifiésTwo verified traps
pgrep -f 'ollama' renvoie aussi le bash -c de votre propre commande SSH. Vous mesurez votre requête, pas le service.pgrep -f 'ollama' also returns the bash -c of your own SSH command. You measure your query, not the service.
Après un redéploiement, un ancien processus peut détenir le port pendant que la nouvelle instance a échoué à s'y attacher : vous testez l'ancien code. Comparez l'heure de démarrage du processus avec la date du fichier patché.After a redeploy, an old process may hold the port while the new instance failed to bind: you are testing the old code. Compare the process start time with the patched file's date.
3. Garde-fousGuardrails
Validation de sortie contre un schéma strict (la seule défense fiable contre l'injection)Output validation against a strict schema (the only reliable injection defence)
Délai d'attente et repli si le modèle ne répond pasTimeout and fallback if the model does not respond
Limite de débit par utilisateur ou par cléRate limit per user or key
Aucune action irréversible sans confirmation humaine (envoi, suppression, paiement)No irreversible action without human confirmation (send, delete, pay)
Liste blanche des outils et des destinataires accessibles à l'agentAllowlist of tools and recipients the agent can reach
Aucun secret dans le prompt système (il peut fuiter)No secrets in the system prompt (it can leak)
Aucune donnée personnelle inutile dans les promptsNo unnecessary personal data in prompts
Suivre le champ usage — la seule source de vérité sur les tokensTrack the usage field — the only token truth
Alerter sur le taux d'erreur et la latence p95, pas seulement la moyenneAlert on error rate and p95 latency, not just the mean
Rejouer périodiquement le jeu d'évaluation : la qualité dérive sans prévenirPeriodically replay the eval set: quality drifts without warning
5. Capacité & coûtCapacity & cost
Mesurer sous charge avant d'annoncer un débit (un débit mono-requête ne dit rien d'un service)Measure under load before advertising throughput (single-request throughput says nothing about a service)
Choisir le moteur selon le nombre d'utilisateurs : Ollama/llama.cpp pour quelques-uns, vLLM au-delàPick the engine by user count: Ollama/llama.cpp for a few, vLLM beyond
Activer la réutilisation de préfixe (prompt système stable en tête) — surtout pour un RAGEnable prefix reuse (stable system prompt at the front) — especially for a RAG
Documenter le démarrage à froid : c'est votre temps d'indisponibilité après un redémarrageDocument the cold start: it is your downtime after a restart
Chercher à supprimer des appels avant de les accélérerLook to remove calls before speeding them up
6. Retour arrièreRollback
La version précédente est encore servable (nouvelle version, jamais d'écrasement)The previous version is still servable (new version, never overwrite)
La procédure de retour est écrite et testée, pas seulement imaginéeThe rollback procedure is written and tested, not just imagined
Vous savez dire pourquoi la nouvelle version est meilleure, avec un chiffreYou can state why the new version is better, with a number
7. Modèle de fiche de modèleModel card template
Nom / version : support-json:v1
Modèle de base : llama3.1:8b (Q4_K_M, 4,92 Go)
Méthode : QLoRA, r=16, alpha=32, lr=2e-4, 2 époques
Dataset : dataset_tickets.jsonl
sha256=... | 255 ex. entraînement, 45 validation
Gabarit de chat : celui du modèle de base (vérifié à l'œil)
ÉVALUATION (jeu tenu à l'écart, N cas)
base : JSON valide _/_ champs _/_ fuites _
affiné : JSON valide _/_ champs _/_ fuites _
-> gain mesuré : ...
COÛT / LATENCE : __ tok/s, TTFT __ ms (matériel : ...)
RETOUR ARRIÈRE : servir (base intacte, adaptateur conservé)
LIMITES CONNUES : ...