Aller au contenu

Le cache clé-valeur et le contexte long

Le poste de mémoire que personne n'annonce, et qui décide en pratique de la longueur de contexte réellement utilisable.


Pourquoi un cache

Reprenons la génération jeton par jeton. Pour produire le jeton n° 1 001, le modèle a besoin des clés et des valeurs des mille jetons précédents.

Les recalculer à chaque étape serait absurde : elles ne changent jamais. La clé du jeton n° 3 est la même que le texte fasse 10 ou 100 000 jetons de long.

On les stocke donc. C'est le cache clé-valeur (KV cache).

génération du jeton 1001 :
   → calcule q, k, v pour le seul jeton 1000
   → ajoute k et v au cache
   → interroge le cache complet (1000 entrées)
   → produit le jeton 1001

Sans cache, la génération serait quadratique. Avec cache, elle est linéaire en calcul — mais elle consomme de la mémoire qui croît avec la longueur du texte.


Le calcul, en général

Pour un modèle dont toutes les couches sont en attention complète :

\[ \text{octets par jeton} = L \times 2 \times H_{kv} \times d_h \times b \]
Symbole Signification
\(L\) nombre de couches produisant un cache
\(2\) il faut stocker \(K\) et \(V\)
\(H_{kv}\) nombre de têtes clé-valeur
\(d_h\) dimension d'une tête
\(b\) octets par nombre (2 en BF16)

Le calcul pour Qwen3.8-Max

Voici le point décisif, et il n'apparaît dans aucune communication officielle.

Seules les couches d'attention complète produisent un cache. Les couches d'attention linéaire maintiennent un état de taille fixe (voir le chapitre 03) qui ne grandit pas avec le contexte.

Sur les 92 couches, 23 sont en attention complète.

\[ 23 \times 2 \times 4 \times 256 \times 2 = 94\,208\ \text{octets} = 92\ \text{KiO par jeton} \]

D'où :

Longueur du contexte Cache clé-valeur
32 768 jetons 3,1 Go
262 144 jetons (natif) 24,7 Go
1 010 000 jetons (étendu) 95,2 Go

Et le contrefactuel, qui donne la mesure de ce que l'hybride apporte :

Architecture Cache à 1 010 000 jetons
23 couches complètes (réel) 95,2 Go
92 couches complètes (hypothétique) 381 Go

L'hybride économise 75 % du cache

C'est là que se joue la faisabilité du contexte long. Un million de jetons à 381 Go de cache exigerait cinq GPU rien que pour le cache, en plus des poids. À 95 Go, cela tient sur un seul nœud.

Ni le communiqué ni la carte de modèle ne donnent ce chiffre. Il se déduit entièrement de config.json.

Il faut ajouter l'état récurrent des 69 couches linéaires :

\[ 69 \times 128 \times 128 \times 128 \times 4\ \text{octets} \approx 0{,}58\ \text{Go} \]

Constant, quelle que soit la longueur. Négligeable devant le reste.


Ce que ce chiffre change concrètement

Le cache est proportionnel à la longueur et au nombre de requêtes traitées en parallèle. Un serveur qui sert 20 conversations simultanées de 100 000 jetons chacune :

\[ 20 \times 100\,000 \times 92\ \text{KiO} \approx 184\ \text{Go} \]

Soit plus de deux GPU H100 dédiés au seul cache.

L'erreur de dimensionnement classique

On calcule la mémoire nécessaire à partir des poids seuls, on commande le matériel, et l'on découvre en production que le débit s'effondre dès que les contextes s'allongent.

En service réel, le cache est souvent le premier poste de dépense mémoire, pas le second.


Le prix, aussi

Les fournisseurs facturent la mise en cache de préfixe séparément, parce qu'elle leur coûte de la mémoire. Chez Qwen :

Poste Tarif par million de jetons
Entrée standard 2,00 $
Entrée relue depuis le cache implicite 0,25 $
Lecture depuis un cache explicite 0,17 $

Un facteur 8 à 12 entre relire depuis le cache et renvoyer le texte. Sur un agent qui rejoue le même long préambule à chaque tour, c'est l'optimisation la plus rentable disponible. Voir Coûts.


Réduire le cache

Quatre leviers existent, par ordre d'adoption :

Technique Gain Utilisée par Qwen3.8-Max ?
GQA — partager les têtes clé-valeur ×16 ici oui (64 requêtes → 4 KV)
Attention hybride — moins de couches avec cache ×4 ici oui (23/92)
Quantification du cache en FP8 ou INT4 ×2 à ×4 possible côté serveur
Éviction — jeter les jetons peu consultés variable non documenté

Les deux premiers sont dans l'architecture. Combinés, ils font passer le cache d'un modèle de cette taille de plus de 6 To à 95 Go au million de jetons.


À retenir

Ce chapitre en cinq points

  1. Le cache clé-valeur évite de recalculer clés et valeurs, au prix d'une mémoire qui croît avec la longueur du contexte.
  2. Dans Qwen3.8-Max, seules les 23 couches d'attention complète alimentent le cache.
  3. Le calcul donne 92 KiO par jeton, soit 95,2 Go à un million de jetons — contre 381 Go sans architecture hybride.
  4. L'état récurrent des couches linéaires est constant : 0,58 Go.
  5. En service réel avec des requêtes concurrentes, le cache dépasse souvent les poids comme premier poste mémoire.

Chapitre suivant : Quantification et matériel — combien de GPU, et ce que coûte de les réduire.