Aller au contenu
Multi-utilisateurs

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.

À vérifier#kv-cache#multi-utilisateurs#llama-cppPublié le 16 sept. 2026Mis à jour le 16 sept. 2026Vérifié le 16 sept. 2026À revérifier le 15 déc. 2026

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èleCouchesTêtes KVDim. têteKV par token (f16)Source des paramètres
gpt-oss-120b3686473 728 o ≈ 0,07 Mo (borne haute)6 (à revérifier sur config.json)
Qwen3-30B-A3B-250748412898 304 o ≈ 0,09 Mo7
Qwen3-235B-A22B-2507944128192 512 o ≈ 0,18 Mo9
Qwen3-32B648128262 144 o ≈ 0,25 Mo8
Llama 3.3 70B808128327 680 o ≈ 0,31 Mo10

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èlePrécision KV8k tokens32k tokens128k tokens
gpt-oss-120bf160,6 Go2,4 Go9,7 Go
gpt-oss-120bq8_00,3 Go1,2 Go4,8 Go
gpt-oss-120bq4_00,15 Go0,6 Go2,4 Go
Qwen3-30B-A3Bf160,8 Go3,2 Go12,9 Go
Qwen3-30B-A3Bq8_00,4 Go1,6 Go6,4 Go
Qwen3-30B-A3Bq4_00,2 Go0,8 Go3,2 Go
Llama 3.3 70Bf162,7 Go10,7 Go42,9 Go
Llama 3.3 70Bq8_01,3 Go5,4 Go21,5 Go
Llama 3.3 70Bq4_00,7 Go2,7 Go10,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 slot2 slots4 slots8 slots
gpt-oss-120b (59 Go 11)60,2 Go61,4 Go63,8 Go68,6 Go
Qwen3-30B-A3B Q4_K_M (18,6 Go 12)20,2 Go21,8 Go25,0 Go31,4 Go
Llama 3.3 70B Q4_K_M (42,5 Go 13)47,9 Go53,3 Go64,1 Go85,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 4 avec 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

  1. 1NVIDIA — Mastering LLM Techniques: Inference OptimizationArticle techniqueFiabilité hauteNVIDIA · S. Verma, N. Vaidya · publié 2023-11-17 · consulté le 16 sept. 2026 · fiche source
  2. 2Databricks — LLM Inference Performance Engineering: Best PracticesArticle techniqueFiabilité hauteDatabricks (Mosaic) · publié 2023-10-12 · consulté le 16 sept. 2026 · fiche source
  3. 3DeepSeek-V2 — Multi-head Latent Attention (arXiv 2405.04434)ÉtudeFiabilité hauteDeepSeek-AI · publié 2024-05 · consulté le 16 sept. 2026 · fiche source
  4. 4llama.cpp — README de llama-server (tools/server)GitHubFiabilité hauteggml-org · publié 2026 (master) · consulté le 16 sept. 2026 · fiche source
  5. 5Ollama — FAQ officielleDocumentation officielleFiabilité hauteOllama · publié 2026 · consulté le 16 sept. 2026 · fiche source
  6. 6Hugging Face — Welcome GPT OSSArticle techniqueFiabilité hauteHugging Face · publié 2025-08-05 · consulté le 16 sept. 2026 · fiche source
  7. 7Qwen/Qwen3-30B-A3B-Instruct-2507 — fiche modèleDocumentation officielleFiabilité hauteAlibaba Qwen · publié 2025-07 · consulté le 16 sept. 2026 · fiche source
  8. 8Qwen/Qwen3-32B — fiche modèleDocumentation officielleFiabilité hauteAlibaba Qwen · publié 2025-04 · consulté le 16 sept. 2026 · fiche source
  9. 9Qwen/Qwen3-235B-A22B-Instruct-2507 — fiche modèleDocumentation officielleFiabilité hauteAlibaba Qwen · publié 2025-07 · consulté le 16 sept. 2026 · fiche source
  10. 10meta-llama/Llama-3.3-70B-Instruct — fiche modèleDocumentation officielleFiabilité hauteMeta · publié 2024-12-06 · consulté le 16 sept. 2026 · fiche source
  11. 11Guide officiel llama.cpp : running gpt-oss (#15396)GitHubFiabilité hauteggml-org · Georgi Gerganov · publié 2025-08 · consulté le 16 sept. 2026 · fiche source
  12. 12unsloth/Qwen3-30B-A3B-Instruct-2507-GGUFAutreFiabilité moyenneUnsloth · publié 2025 · consulté le 16 sept. 2026 · fiche source
  13. 13bartowski/Llama-3.3-70B-Instruct-GGUFAutreFiabilité moyennebartowski · publié 2024-12 · consulté le 16 sept. 2026 · fiche source
  14. 14AMD Strix Halo / RDNA3.5 system optimization (ROCm 10.0)Documentation officielleFiabilité hauteAMD · publié 2026 · consulté le 16 sept. 2026 · fiche source
content/docs/multi-user/kv-cache.md1060 mots