KV cache : calcul et dimensionnement
Formule du KV cache, effet de GQA et MLA, quantification q8_0/q4_0, tableau d'estimations pour gpt-oss-120b, Qwen3-30B-A3B et Llama 70B à 8k/32k/128k, et impact du nombre de slots sur la mémoire.
L'essentiel
- Le KV cache stocke, pour chaque token du contexte, les clés et valeurs d'attention de chaque couche. Sa taille est proportionnelle au contexte et au nombre de slots.
- Formule : KV (octets) = 2 × couches × têtes KV × dimension de tête × octets par valeur × tokens 1 2.
- GQA (peu de têtes KV) divise la taille ; MLA (DeepSeek) la réduit de plus de 90 % 3.
- q8_0 divise par deux, q4_0 par quatre, pour une perte faible à modérée 5.
- Ordres de grandeur à 32k tokens en f16 : 2,4 Go (gpt-oss-120b), 3,2 Go (Qwen3-30B-A3B), 10,7 Go (Llama 70B) par slot. Estimations, à confirmer par la mesure.
Formule
NVIDIA : « Size of KV cache per token in bytes = 2 × num_layers × (num_heads × dim_head) × precision_in_bytes » ; exemple Llama 2 7B, 4 096 tokens ≈ 2 Go 1. Databricks donne la même expression pour Llama2-70B en explicitant n_kv_heads 2.
Pour un modèle à GQA (grouped-query attention), on remplace le nombre de têtes d'attention par le nombre de têtes KV, bien plus petit (4 à 8 au lieu de 32 à 64). C'est ce qui rend les modèles récents économes en mémoire de contexte.
Octets par valeur : 2 (f16, bf16), 1 (q8_0), environ 0,5 (q4_0).
Cas particuliers :
- Fenêtre glissante : les couches à attention locale (gpt-oss-120b une couche sur deux, Gemma 3) ne gardent que les derniers tokens (128 pour gpt-oss) ; la formule donne alors une borne haute.
- MLA (DeepSeek V2 et suivants) : clés et valeurs sont compressées en un vecteur latent ; réduction de 93,3 % par rapport à DeepSeek 67B 3. La formule par token devient environ couches × (dim latente + dim RoPE) × octets (estimation de la forme).
- Architectures hybrides (Qwen3.5 Gated DeltaNet) : une partie des couches n'a pas de KV classique ; la formule ne s'applique pas telle quelle.
Paramètres des modèles candidats
| Modèle | Couches | Têtes KV | Dim. tête | KV par token (f16) | Source des paramètres |
|---|---|---|---|---|---|
| gpt-oss-120b | 36 | 8 | 64 | 73 728 o ≈ 0,07 Mo (borne haute) | 6 (à revérifier sur config.json) |
| Qwen3-30B-A3B-2507 | 48 | 4 | 128 | 98 304 o ≈ 0,09 Mo | 7 |
| Qwen3-235B-A22B-2507 | 94 | 4 | 128 | 192 512 o ≈ 0,18 Mo | 9 |
| Qwen3-32B | 64 | 8 | 128 | 262 144 o ≈ 0,25 Mo | 8 |
| Llama 3.3 70B | 80 | 8 | 128 | 327 680 o ≈ 0,31 Mo | 10 |
Tableau d'estimations par slot
Toutes les valeurs sont des estimations (formule ci-dessus, 1 Go = 10⁹ octets). Un slot = une conversation servie en parallèle.
| Modèle | Précision KV | 8k tokens | 32k tokens | 128k tokens |
|---|---|---|---|---|
| gpt-oss-120b | f16 | 0,6 Go | 2,4 Go | 9,7 Go |
| gpt-oss-120b | q8_0 | 0,3 Go | 1,2 Go | 4,8 Go |
| gpt-oss-120b | q4_0 | 0,15 Go | 0,6 Go | 2,4 Go |
| Qwen3-30B-A3B | f16 | 0,8 Go | 3,2 Go | 12,9 Go |
| Qwen3-30B-A3B | q8_0 | 0,4 Go | 1,6 Go | 6,4 Go |
| Qwen3-30B-A3B | q4_0 | 0,2 Go | 0,8 Go | 3,2 Go |
| Llama 3.3 70B | f16 | 2,7 Go | 10,7 Go | 42,9 Go |
| Llama 3.3 70B | q8_0 | 1,3 Go | 5,4 Go | 21,5 Go |
| Llama 3.3 70B | q4_0 | 0,7 Go | 2,7 Go | 10,7 Go |
Pour gpt-oss-120b, la valeur réelle est plus basse (fenêtre glissante sur la moitié des couches) ; pour les autres, la formule est exacte à l'implémentation près (alignement des blocs, buffers de calcul).
Impact du nombre de slots
Sans --kv-unified, llama-server réserve pour chaque slot une part du contexte total (-c divisé par -np, formulation du README à vérifier) ; la mémoire KV totale est celle du contexte total, quel que soit le remplissage. Avec --kv-unified, un seul buffer est partagé et se répartit selon l'usage réel 4. Dans les deux cas, la mémoire à réserver est celle du contexte total, pas celle d'un slot.
Budget total (poids + KV) pour N slots à 32k tokens chacun, KV q8_0, estimation :
| Modèle (poids) | 1 slot | 2 slots | 4 slots | 8 slots |
|---|---|---|---|---|
| gpt-oss-120b (59 Go 11) | 60,2 Go | 61,4 Go | 63,8 Go | 68,6 Go |
| Qwen3-30B-A3B Q4_K_M (18,6 Go 12) | 20,2 Go | 21,8 Go | 25,0 Go | 31,4 Go |
| Llama 3.3 70B Q4_K_M (42,5 Go 13) | 47,9 Go | 53,3 Go | 64,1 Go | 85,7 Go |
Lecture : avec gpt-oss-120b et 8 slots de 32k en q8_0, on reste sous 70 Go, ce qui laisse de la place pour un modèle d'embeddings, un reranker et la base vectorielle dans les 96 à 110 Go allouables au GPU (Q-011). Avec le 70B dense, 8 slots longs approchent la limite. Ces chiffres ignorent les buffers de calcul (batch, flash attention) et l'occupation système : prévoir une marge de 10 à 15 % (hypothèse).
Quantification du KV cache
Options llama-server : --cache-type-k et --cache-type-v parmi f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1 4. La FAQ Ollama, qui repose sur llama.cpp, résume : q8_0 « environ la moitié de f16 avec une très faible perte de précision », q4_0 « environ le quart, perte faible à moyenne » 5. La quantification de V requiert la flash attention.
Position de travail : q8_0 pour K et V par défaut (Q-003), à valider par un test de qualité sur des tâches de citation (le KV quantifié peut dégrader la fidélité des extraits longs ; hypothèse à tester).
Où va cette mémoire sur Strix Halo
Le KV cache vit dans la mémoire GPU, c'est-à-dire dans la part de la mémoire unifiée allouable via GTT. AMD recommande une réservation VRAM BIOS minimale (0,5 Go) et une augmentation de la limite TTM/GTT 14. Voir Linux / ROCm et Q-011.
Ce qu'il reste à tester
- Mesurer la mémoire réellement allouée par llama-server pour
-c 131072 -np 4avec et sans--kv-unified, en f16 et q8_0, pour gpt-oss-120b et Qwen3-30B-A3B ; comparer aux estimations. - Vérifier les paramètres de gpt-oss-120b sur le config.json.
- Mesurer l'effet de q8_0 vs f16 sur la fidélité des citations longues.
Sources
- 1NVIDIA — Mastering LLM Techniques: Inference OptimizationArticle techniqueFiabilité hauteNVIDIA · S. Verma, N. Vaidya · publié 2023-11-17 · consulté le 16 sept. 2026 · fiche source
- 2Databricks — LLM Inference Performance Engineering: Best PracticesArticle techniqueFiabilité hauteDatabricks (Mosaic) · publié 2023-10-12 · consulté le 16 sept. 2026 · fiche source
- 3DeepSeek-V2 — Multi-head Latent Attention (arXiv 2405.04434)ÉtudeFiabilité hauteDeepSeek-AI · publié 2024-05 · consulté le 16 sept. 2026 · fiche source
- 4llama.cpp — README de llama-server (tools/server)GitHubFiabilité hauteggml-org · publié 2026 (master) · consulté le 16 sept. 2026 · fiche source
- 5Ollama — FAQ officielleDocumentation officielleFiabilité hauteOllama · publié 2026 · consulté le 16 sept. 2026 · fiche source
- 6Hugging Face — Welcome GPT OSSArticle techniqueFiabilité hauteHugging Face · publié 2025-08-05 · consulté le 16 sept. 2026 · fiche source
- 7Qwen/Qwen3-30B-A3B-Instruct-2507 — fiche modèleDocumentation officielleFiabilité hauteAlibaba Qwen · publié 2025-07 · consulté le 16 sept. 2026 · fiche source
- 8Qwen/Qwen3-32B — fiche modèleDocumentation officielleFiabilité hauteAlibaba Qwen · publié 2025-04 · consulté le 16 sept. 2026 · fiche source
- 9Qwen/Qwen3-235B-A22B-Instruct-2507 — fiche modèleDocumentation officielleFiabilité hauteAlibaba Qwen · publié 2025-07 · consulté le 16 sept. 2026 · fiche source
- 10meta-llama/Llama-3.3-70B-Instruct — fiche modèleDocumentation officielleFiabilité hauteMeta · publié 2024-12-06 · consulté le 16 sept. 2026 · fiche source
- 11Guide officiel llama.cpp : running gpt-oss (#15396)GitHubFiabilité hauteggml-org · Georgi Gerganov · publié 2025-08 · consulté le 16 sept. 2026 · fiche source
- 12unsloth/Qwen3-30B-A3B-Instruct-2507-GGUFAutreFiabilité moyenneUnsloth · publié 2025 · consulté le 16 sept. 2026 · fiche source
- 13bartowski/Llama-3.3-70B-Instruct-GGUFAutreFiabilité moyennebartowski · publié 2024-12 · consulté le 16 sept. 2026 · fiche source
- 14AMD Strix Halo / RDNA3.5 system optimization (ROCm 10.0)Documentation officielleFiabilité hauteAMD · publié 2026 · consulté le 16 sept. 2026 · fiche source