Ce qu’est réellement le cache KV
« KV » signifie clé/valeur (key/value) — les représentations internes que le modèle calcule pour chaque jeton qu’il a traité jusqu’à présent. Au lieu de recalculer ces représentations à partir de zéro pour chaque nouveau jeton, le modèle les stocke dans le cache KV et les réutilise, en ajoutant une nouvelle entrée chaque fois qu’un jeton est ajouté à la séquence. C’est ce qui rend la génération praticable. Sans cache, générer le jeton 500 d’une réponse signifierait retraiter tous les 499 jetons qui le précèdent, à chaque fois. Avec le cache, le modèle n’a à effectuer que le nouveau travail pour chaque nouveau jeton, et réutilise tout ce qu’il a déjà calculé. Le cache est construit pendant le préremplissage (lorsque le modèle lit votre invite) et étendu d’une entrée par jeton pendant le décodage (lorsqu’il génère la réponse) — consultez Comment fonctionne l’inférence pour comprendre comment fonctionnent ces deux phases.Pourquoi un contexte plus long coûte plus de mémoire
Le cache KV contient une entrée par jeton, par couche, aussi longtemps que ce jeton reste dans le contexte actif. Cela signifie que sa taille évolue directement avec :- Context length — plus de jetons en jeu signifie plus d’entrées dans le cache. Une conversation de 128K jetons contient beaucoup plus d’état mis en cache qu’une conversation de 4K jetons.
- La taille du lot (batch size) — si vous servez plusieurs requêtes simultanément, chacune nécessite son propre cache KV, donc la mémoire totale du cache est multipliée par les requêtes concurrentes.
Le compromis contexte-vitesse
Au-delà de la mémoire, un cache KV plus important a également un coût en vitesse. Le décodage est limité par la bande passante mémoire — à chaque jeton généré, le modèle lit l’intégralité du cache KV construit jusqu’à présent, en plus de ses poids (voir Comment fonctionne l’inférence). Un cache plus grand signifie plus de données à lire à chaque étape, donc :- Un contexte plus long ralentit le décodage. La vitesse de génération (jetons/sec) a tendance à diminuer au fur et à mesure que la conversation grandit, même si le modèle lui-même n’a pas changé.
- Un contexte plus long coûte plus de mémoire, indépendamment du coût en vitesse — c’est une deuxième facture, séparée.
Il n’y a aucun moyen de contourner ce compromis en choisissant une quantification différente — la quantification des poids et la quantification du cache KV sont des leviers distincts, et certains backends prennent en charge la quantification du cache KV indépendamment comme moyen de faire tenir des contextes plus longs. Il s’agit d’un paramètre spécifique au backend ; vérifiez la documentation de votre runtime pour le support avant de vous y fier.
Conclusion pratique
Lorsque vous décidez de la quantité de contexte à allouer pour un déploiement, considérez-le comme un budget de ressources réel, et non comme un paramètre gratuit. Un modèle annoncé avec un contexte maximum énorme (128K, 256K) ne signifie pas que vous devez toujours l’exécuter à cette limite — dimensionnez votre contexte en fonction des besoins réels de la tâche, et vérifiez le coût mémoire réel avec le guide d’ajustement du modèle sur GPU avant de vous engager.Pour aller plus loin
Comment fonctionne l'inférence
Le cycle de vie complet de l’invite — préremplissage, décodage, et ce qui va où en mémoire.
Mémoire et délestage
La formule de dimensionnement complète, incluant les poids et la surcharge en plus du cache KV.
Une fois le contexte et la mémoire adaptés
Dimensionner votre cache KV fait partie de faire fonctionner un modèle correctement localement. Une fois qu’il fonctionne et répond aux requêtes surlocalhost, l’étape suivante est d’y accéder depuis n’importe où ailleurs.
Donnez-lui un point de terminaison stable
Tokios ne choisit, n’héberge ni n’affine le modèle — une fois qu’il fonctionne localement, Tokios le transforme en un point de terminaison stable et authentifié que vous pouvez appeler depuis n’importe où.