💾 Le KV Cache & La Gestion du Contexte
Si le poids d’un modèle (les paramètres) détermine la quantité de VRAM minimale pour démarrer une IA, la longueur du contexte (le prompt + l’historique) dicte la quantité de mémoire dynamique consommée pendant l’utilisation.
À l’usage, un contexte très long (32K, 128K ou plus) peut consommer plus de VRAM que le modèle lui-même 1. Ce goulot d’étranglement est géré par un mécanisme physique appelé le KV Cache (Key-Value Cache) 1.
🧠 Le mécanisme physique : Pourquoi le KV Cache existe-t-il ?
Dans l’architecture Transformer, pour générer le token , le modèle doit calculer l’attention (les relations) entre ce nouveau token et tous les tokens précédents ( à ) 2.
graph TD
subgraph "Sans KV Cache (Inefficace - O(n²))"
A[Générer Token N+1] --> B[Recalculer Attention pour TOUS les tokens 1 à N]
B --> C[Coût quadratique en longueur]
end
graph TD
subgraph "Avec KV Cache (Standard - O(n))"
D[Générer Token N+1] --> E[Lire Clés/Valeurs stockées des tokens 1 à N]
E --> F[Calculer Attention UNIQUEMENT pour le nouveau token]
F --> G[Sauvegarder nouveau K/V dans le Cache]
end
- Sans KV Cache : Pour chaque mot généré, le modèle devrait ré-exécuter l’intégralité des calculs pour tout l’historique depuis le début. La complexité de calcul serait quadratique (), rendant l’IA inutilisable sur des prompts longs 2.
- Avec KV Cache : Le moteur d’inférence calcule les vecteurs Key (K) et Value (V) de chaque token une seule fois (lors de la phase de Prefill) et les stocke en VRAM 2. Pendant la phase de Decoding, le modèle n’a plus qu’à lire ce cache au lieu de recalculer l’historique 2.
📐 L’Équation Mathématique du KV Cache
Pour calculer l’empreinte mémoire exacte (en octets) du KV Cache, on utilise la formule suivante, adaptée à l’architecture moderne GQA (Grouped-Query Attention) 34 :
Où :
- : Représente les deux tenseurs stockés (Key et Value) 3.
- : Nombre de couches du Transformer (Layers) 3.
- : Nombre de têtes d’attention Key-Value (après application du GQA) 3.
- : Dimension de chaque tête (Head Dimension) 3.
- : Longueur de la séquence (Sequence Length, en tokens) 3.
- : Taille du lot (Batch Size, nombre de requêtes simultanées) 3.
- : Taille d’un élément en mémoire (Bytes Per Element, ex: pour FP16/BF16, pour FP8/INT8 ; NVFP4 vise ~ octet avec un léger overhead de scaling) 35.
💡 Focus : L’impact de l’architecture GQA
Dans l’ancienne architecture MHA (Multi-Head Attention), chaque tête de Query avait sa propre tête Key-Value (). Avec Grouped-Query Attention (GQA), plusieurs têtes de Query partagent la même tête Key/Value (sur Llama 3.1 70B : têtes Query pour têtes KV, soit un ratio de 8:1) 6. Cela divise par 8 la taille du KV Cache en mémoire, avec une perte de qualité généralement faible — proche du MHA sur les benchmarks courants, bien qu’elle ne soit pas nulle 6.
📊 Cas Pratiques : Sizing de la VRAM (Llama 3.1 70B)
Prenons le modèle de référence Llama 3.1 70B 4. Ses caractéristiques physiques sont :
- Nombre de couches () = 4
- Nombre de têtes KV () = (GQA) 4
- Dimension des têtes () = 4
- Précision native () = octets (BF16) 4
- Fenêtre de contexte native = 128K tokens 4
Calculons la VRAM nécessaire pour une seule requête () à différentes fenêtres de contexte :
| Longueur du Contexte () | Taille du KV Cache (BF16) | Taille avec Quantification (FP8) 7 | Taille avec NVFP4 (Blackwell) 5 |
|---|---|---|---|
| 8 192 tokens | |||
| 32 768 tokens (32K) | |||
| 128 000 tokens (128K, max natif) | |||
| 300 000 tokens (extrapolation) |
Le Piège de l’OOM (Out Of Memory) en contexte long
🛠️ Les Technologies d’Optimisation du Contexte
Pour éviter l’explosion de la VRAM sur site, les ingénieurs système déploient plusieurs optimisations logicielles :
1. PagedAttention (vLLM / SGLang)
Dans les moteurs d’inférence classiques, le KV Cache est souvent pré-alloué de manière contiguë en VRAM 9. Cela crée fragmentation et gaspillage : les implémentations naïves n’utilisent typiquement que 20 à 38 % de la mémoire GPU réservée au KV cache 9. PagedAttention s’inspire de la mémoire paginée des systèmes d’exploitation 9. Le KV Cache est découpé en blocs fixes, alloués à la demande et mappés via une table de pages. L’utilisation mémoire monte à ~96 %, et le débit augmente typiquement de 2 à 4× à latence équivalente (jusqu’à plus selon le workload) 9.
2. La Quantification du KV Cache (FP8 / INT8 / Q4)
De la même manière que l’on compresse les poids d’un modèle, on peut compresser son KV Cache 1.
- FP8 / INT8 : Supportés nativement par
vLLM(kv_cache_dtype="fp8") et d’autres moteurs de production 7. Cela divise la taille du cache par 2 ; la précision reste proche du BF16 si les scales sont calibrées (dataset oullm-compressor), avec des écarts possibles sur certains modèles à attention hybride ouhead_dimélevé 710. - Q4 / INT8 sur K et V :
llama.cppexpose--cache-type-ket--cache-type-v(ex.q8_0/q4_0) 11. La compression agressive peut dégrader la perplexité sur des raisonnements longs, surtout si les clés (K) sont trop quantifiées 11.
3. Flash-Decoding (FlashAttention-2/3)
Sur de très longs contextes, la phase de décodage devient limitée par la bande passante mémoire : avec un batch de 1, FlashAttention classique sous-utilise le GPU 12. Flash-Decoding (Together AI, 2023) ajoute une dimension de parallélisme sur la longueur de la séquence Key-Value : les blocs K/V sont lus et traités en parallèle, puis recombinés 12. Cette technique est reprise dans FlashAttention-3 (split-KV, parallélisation GQA) pour les GPU Hopper et au-delà 13.
📋 Le Conseil de l’Architecte
Pour tout déploiement d’assistant on-premise, la gestion du KV cache dicte votre stratégie matérielle :
- Injectez le contexte, ne noyez pas le modèle : Plutôt que de charger des fichiers entiers de 150 000 mots dans la fenêtre du LLM (ce qui saturerait votre VRAM dynamique), récupérez seulement les passages pertinents — via un Memory Tree structuré (chunks Markdown + résumés hiérarchiques)14, un RAG vectoriel, ou les deux combinés.
- Activez le FP8 KV Cache : Si vous utilisez un moteur basé sur vLLM ou LMDeploy, configurez le KV cache en FP8 pour diviser par deux votre consommation dynamique de VRAM, en calibrant les scales si possible 7.
- Surveillez le ratio Batch/Contexte : Sur un serveur partagé par plusieurs collaborateurs en simultané, le KV Cache se multiplie par le nombre d’utilisateurs actifs () — dimensionner la VRAM en conséquence.
📚 Sources et Références
Footnotes
-
NVIDIA Technical Blog, Mastering LLM Techniques: Inference Optimization, novembre 2023. https://developer.nvidia.com/blog/mastering-llm-techniques-inference-optimization/ ↩ ↩2 ↩3 ↩4
-
NVIDIA Technical Blog, Mastering LLM Techniques: Inference Optimization (prefill, decode, mécanisme KV cache), novembre 2023. https://developer.nvidia.com/blog/mastering-llm-techniques-inference-optimization/ ↩ ↩2 ↩3 ↩4
-
VMware Cloud Foundation Blog, LLM Inference Sizing and Performance Guidance (formule KV cache GQA), septembre 2024. https://blogs.vmware.com/cloud-foundation/2024/09/25/llm-inference-sizing-and-performance-guidance/ ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Meta, Llama 3.1 Model Card (architecture, GQA, contexte 128K), juillet 2024. https://github.com/meta-llama/llama-models/blob/main/models/llama3_1/MODEL_CARD.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
NVIDIA Technical Blog, Optimizing Inference for Long Context and Large Batch Sizes with NVFP4 KV Cache, décembre 2025. https://developer.nvidia.com/blog/optimizing-inference-for-long-context-and-large-batch-sizes-with-nvfp4-kv-cache/ ↩ ↩2
-
Joshua Ainslie et al., GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints (arXiv:2305.13245), 2023. https://arxiv.org/html/2305.13245 ↩ ↩2
-
vLLM Documentation, Quantized KV Cache (FP8, calibration), 2026. https://docs.vllm.ai/en/latest/features/quantization/quantized_kvcache.html ↩ ↩2 ↩3 ↩4
-
Hugging Face Blog, Llama 3.1 (tableau empreinte KV cache FP16 par taille de modèle), juillet 2024. https://github.com/huggingface/blog/blob/main/llama31.md ↩
-
Woosuk Kwon et al., Efficient Memory Management for Large Language Model Serving with PagedAttention (SOSP 2023). https://dl.acm.org/doi/10.1145/3600006.3613165 ↩ ↩2 ↩3 ↩4
-
vLLM Blog, The State of FP8 KV-Cache and Attention Quantization in vLLM, avril 2026. https://vllm.ai/blog/2026-04-22-fp8-kvcache ↩
-
llama.cpp, Server README (
--cache-type-k,--cache-type-v), 2026. https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md ↩ ↩2 -
Together AI, Flash-Decoding for long-context inference, octobre 2023. https://www.together.ai/blog/flash-decoding-for-long-context-inference ↩ ↩2
-
Dao-AILab, FA3 kvcache + split kv + gqa parallelization (PR #1236), septembre 2024. https://github.com/Dao-AILab/flash-attention/pull/1236 ↩
-
OpenHuman, Memory Trees (GitBook — pipeline local SQLite + Markdown, injection sélective), 2025. https://tinyhumans.gitbook.io/openhuman/features/memory-tree ↩
Références entrantes
- 🏢 Scénario B : L'Appliance PME (Mémoire Unifiée)
- 🏭 Serveurs rack GPU
- 🖼️ Multimodalité : Impact Matériel (VRAM & KV Cache)
- 🗜️ La Quantification (4-bit & 8-bit)
- 🧠 APU & Mémoire Unifiée
- 🧩 RAG & Agents : L'architecture de la connaissance
- 🧩 Stations Multi-GPU : NVIDIA, PCIe et VRAM
- 🚀 Démarrer avec Ollama
- 🚀 Index Zero to Hero
- Attention (mécanisme)
- Fenêtre de contexte
- KV Cache
- MoE
- PagedAttention
- Prefill
- Speculative Decoding
- Tokenisation