Fenêtres de contexte et cache KV
La fenêtre de contexte a un prix, payé en VRAM. Chaque jeton gardé en contexte force le modèle à retenir deux petits vecteurs par couche, et cette mémoire — le cache KV — grossit à chaque jeton et mange tranquillement la marge que vous pensiez avoir. Elle explique les pannes locales les plus étranges : l'OOM au quarantième tour, le modèle qui semblait ralentir à mesure que le chat grandissait, la carte 8 GB qui tient le « contexte 128k » uniquement dans la brochure.
Ce que le cache stocke
L'attention a besoin des projections de clé et de valeur de chaque jeton passé avant de pouvoir y prêter attention. Elles sont calculées une fois pendant le préremplissage et gardées pour la vie de la requête : par couche, par jeton, un vecteur K et un vecteur V de kv_heads × head_dim nombres chacun. Ce stockage est le cache KV, et c'est pourquoi le contexte coûte de la mémoire linéairement, pour toujours, pour chaque requête servie.
La formule
octets par jeton = 2 (K et V) × couches × kv_heads × head_dim × 2 octets (fp16)
Exemple détaillé, GQA classe llama-3-8B (32 couches, 8 têtes KV, head_dim 128) :
2 × 32 × 8 × 128 × 2 = 131,072 octets = 128 KB par jeton.
À contexte 32k, cela fait 32,768 × 128 KB ≈ 4 GB de cache KV — comparable aux poids Q4 assis à côté. Les configurations plus légères à 4 têtes KV tombent près de 2 GB par 32k. Ordre de grandeur pour les modèles classe 8B en KV fp16 : budgétez 0.5–4 GB par 32k selon l'architecture. Les chiffres exacts d'un checkpoint viennent directement de son config.json — num_key_value_heads, num_hidden_layers et la taille de tête.
La GQA est la raison pour laquelle le long contexte est devenu bon marché
L'attention à requêtes groupées partage une poignée de têtes KV entre plusieurs têtes de requête — disons 32 têtes de requête servies par 8 têtes KV — réduisant le cache de 4× par rapport à l'attention multi-têtes complète à un coût de qualité négligeable. Sans GQA, le tableau ci-dessous serait 4–8× plus grand et le long contexte sur une carte 24 GB serait une fantaisie. C'est le plus grand cadeau architectural au travail local à long contexte, et la raison pour laquelle les modèles modernes 7–9B livrent des fenêtres 32k–128k tout court.
À quelle vitesse il grossit
Un modèle GQA classe 8B en KV fp16, 128 KB par jeton :
| Contexte | Taille du cache KV | Sur une carte 8 GB |
|---|---|---|
| 4k | ~0.5 GB | invisible |
| 16k | ~2.1 GB | remarquable à côté de 5 GB de poids |
| 64k | ~8.4 GB | ne tient pas, point |
| 128k | ~16.8 GB | 3× le modèle lui-même |
La mémoire croît linéairement par jeton, mais le calcul d'attention croît avec le carré du contexte — les longs contextes coûtent donc VRAM et temps-par-jeton en même temps.
Leviers quand le KV explose
- Quantifiez le cache. q8_0 le divise par deux, q4_0 par quatre, à un coût de qualité modeste — souvent le meilleur compromis de capacité de toute la pile. Dans llama.cpp, la quantification KV exige la flash attention, montrée ci-dessous.
- Servez un contexte plus court.
-c 8192ne coûte rien si vos prompts font 2k. Allouer les 128k annoncés « au cas où » réserve de la VRAM que vous n'utiliserez jamais utilement. - Modèles à fenêtre glissante. Certaines architectures plafonnent la fenêtre KV par couche quel que soit le contexte nominal — comportement long contexte sans la facture linéaire, au prix d'un peu de rappel sur les anciens éléments.
- Flash attention. Fondamentalement un gain de calcul et d'efficacité de noyaux — attention exacte sans l'explosion quadratique des activations — et dans llama.cpp c'est aussi le sas qui déverrouille la quantification KV.
llama-server -m model-8b-q4_k_m.gguf -c 65536 -fa --cache-type-k q8_0 --cache-type-v q8_0
Contexte annoncé vs effectif
Un modèle annonçant 128k tournera à 128k — le cache tient et les maths fonctionnent. Qu'il raisonne à 128k est une autre affirmation. Le RoPE étiré et le fine-tuning long contexte maintiennent des scores de récupération d'aiguille élevés tandis que la compréhension générale s'affaisse souvent bien avant la limite. Traitez la fenêtre annoncée comme un maximum physique, supposez que la qualité mollit dans la dernière moitié, et cherchez des évals long contexte communautaires du checkpoint précis avant d'y engager un flux de travail.
Perdu au milieu, et habitudes d'hygiène
Le biais de position est réel : les modèles prêtent attention le plus fortement au début et à la fin du prompt et s'affaissent au milieu. Mettez instructions et faits critiques en premier ou en dernier ; n'enterrez jamais la spécification que le modèle doit suivre au milieu d'un document collé. Habitudes qui gardent les contextes petits et affûtés :
- Élaguez ou résumez les anciens tours au lieu de rejouer tout le chat.
- Récupérez et injectez le fragment pertinent, pas le fichier entier.
- Gardez le prompt système court ; il est renvoyé à chaque requête.
- Surveillez la VRAM pendant les longues sessions — la croissance du KV est la variable silencieuse (calcul de VRAM), et les options de service qui la contrôlent sont cataloguées dans paramètres moteur.
Voir aussi : calcul de VRAM · paramètres moteur · vitesse