Dépannage : symptôme → cause → correctif
L'inférence locale échoue selon des motifs. La même douzaine de symptômes couvre presque chaque demande d'aide, et chacun a une cause ennuyeuse et un correctif de deux minutes. Parcourez le tableau, appliquez le correctif, puis lisez les chiffres pour confirmer que vous êtes vraiment réparé.
Le tableau de diagnostic
| Symptôme | Cause probable | Correctif |
|---|---|---|
la sortie contient des jetons de rôle (user:, `< |
im_start | >`) |
| réponse vide immédiate | le gabarit rend un chat « fini », ou mauvais jeton EOS | corrigez le gabarit ; vérifiez l'EOS : prompting |
| répète votre question au lieu de répondre | modèle base, pas un modèle instruct | utilisez un GGUF instruct/chat |
| plus de mémoire au chargement | poids + quant dépassent la VRAM | quant plus petit ou modèle plus petit : calcul de VRAM |
| plus de mémoire en pleine génération | le cache KV dépasse la marge | contexte plus court, cache KV q8_0 : cache KV |
| 1–3 tok/s malgré un GPU | couches encore sur CPU | délestage complet (n_gpu_layers) : paramètres moteur |
| premier jeton lent, flux rapide ensuite | limité par le préremplissage : prompts très longs | raccourcir les prompts, batch, préremplissage plus rapide : vitesse |
| répétition sans fin, boucles de phrases | échantillonneur trop permissif, pénalités éteintes | temp ≤ 0.8, repeat_penalty 1.05–1.1 : échantillonnage |
| la sortie coréenne est du charabia ou raide | modèle faible en coréen | familles multilingues (Qwen, Gemma) : familles de modèles |
| sortie tronquée en pleine phrase | fenêtre de contexte pleine ou max_tokens trop bas | élaguez le contexte ou montez la limite de sortie |
| JSON invalide d'un bon modèle | échantillonnage libre | décodage contraint : sortie structurée |
| le modèle ignore vos instructions | perdu au milieu sur les longs prompts | objectif d'abord, charge ensuite, répétez la demande : prompting |
| crash ou coredump au chargement | téléchargement corrompu | vérifiez la somme de contrôle, retéléchargez |
Lisez-le symptôme d'abord, pas cause d'abord : appariez ce que vous voyez, appliquez le correctif, mesurez à nouveau. La plupart des rapports « mon modèle est cassé » finissent aux lignes 1, 2 ou 6.
Le pré-vol de cinq minutes
Avant tout débogage profond, collectez les faits :
nvidia-smi --query-gpu=name,memory.total,memory.used --format=csv # GPU + VRAM
ls -lh model.gguf # taille vs VRAM
llama-server --version # build du moteur
Si le fichier modèle est plus gros que la VRAM libre, la ligne 4 est votre réponse et aucune option ne vous sauvera. Si memory.used grimpe régulièrement pendant la génération, c'est le cache KV, pas une fuite.
À quoi ressemble le normal
Avant de déboguer la performance, connaissez les ordres de grandeur. Vitesse de décodage d'un modèle 7–8B Q4_K_M, lot 1 :
| Matériel | Décodage tok/s |
|---|---|
| GPU milieu de gamme (classe RTX 3060/4060) | 30–60 |
| GPU haut de gamme (classe RTX 3090/4090) | 100–150 |
| Apple série M (mémoire unifiée) | 20–40 |
| CPU seul (8 cœurs moderne) | 3–8 |
Deux formules expliquent l'essentiel :
tok/s de décodage ≈ bande passante mémoire (GB/s) ÷ taille du modèle (GB)
VRAM nécessaire ≈ poids + cache KV + 1–2 GB de frais généraux
Un quant 7B de 4.5 GB sur une carte à 288 GB/s plafonne près de 64 tok/s en théorie ; attendez ~45–55 réels. Si vous êtes à 2× du tableau, votre matériel n'est pas le bug.
Le temps jusqu'au premier jeton (TTFT) devrait être bien sous la seconde pour des prompts courts ; il croît avec la longueur du prompt divisée par le débit de préremplissage (qui tourne à 10–100× la vitesse de décodage). Un prompt de 10k jetons qui prend 20 s avant le premier jeton est limité par le préremplissage, pas cassé.
Comptabilité VRAM : si les poids se sont bien chargés mais que vous faites un OOM plus tard, c'est le cache KV ou la longueur de contexte, pas le quant — cache KV.
Le protocole : échangez une variable
Les bugs se cachent quand vous changez deux choses à la fois. Isolez le long de cette chaîne — modèle → moteur → config → prompt :
- Référence. Modèle connu-bon, moteur connu-bon, options par défaut. Le chat marche ? Alors la pile va bien.
- Échangez le modèle (même moteur, mêmes options). Ça casse ? C'est le fichier ou son gabarit.
- Échangez le moteur (même modèle). Ça casse ? Bug moteur ou traduction d'option.
- Bissectez vos options. Restaurez les défauts, réajoutez les options une à une jusqu'à la casse.
- Videz le prompt rendu. Quand la sortie est bizarre-mais-tourne, le gabarit rendu est là où vit la vérité.
Prenez des notes en chemin — « marche à temp 0.8, casse avec min_p 0.2 » est un diagnostic ; « essayé des trucs, toujours mauvais » non.
Bien demander de l'aide
Un bon message d'aide est un compte-rendu de labo. Incluez :
- Fichier modèle : nom exact, quant et source (
qwen2.5-7b-instruct-q4_k_m.gguf, quel dépôt). - Moteur et version : date de build de llama.cpp, version d'Ollama, release de vLLM — les moteurs changent chaque semaine.
- Options exactes ou appel d'API : toute la ligne de commande ou le corps de requête, pas une paraphrase.
- Matériel : GPU + VRAM (ou Mac + RAM), CPU s'il porte des couches.
- Chiffres observés : tok/s, TTFT, VRAM utilisée, et le texte d'erreur exact s'il y en a un.
- Ce que vous avez déjà essayé et ce qui a changé en conséquence.
Squelette à copier-coller :
Modèle: qwen2.5-7b-instruct-q4_k_m.gguf (dépôt bartowski)
Moteur: llama.cpp b4321 (llama-server)
Options: -ngl 99 -c 8192 --temp 0.7
Matériel: RTX 4060 8GB / Ryzen 7 / 32GB RAM
Observé: charge en 21s, ~35 tok/s, TTFT ~1.2s, puis OOM à ~6k ctx
Essayé: -c 4096 → pas de crash ; q8_0 KV → pas de crash
Avec ces six faits, la plupart des problèmes se mappent à une ligne du tableau ci-dessus en une réponse. Ce forum existe exactement pour ces messages — apportez le compte-rendu de labo et vous aurez le correctif.
Voir aussi : paramètres moteur · calcul de VRAM · cache KV · échantillonnage