Inférence

KV-Cache

KV-Cache (Key-Value Cache) est un buffer mémoire qui stocke les tenseurs clé et valeur produits par les couches d'attention d'un transformateur pour les tokens déjà traités, éliminant la recomputation redondante lors de la génération autorégressive. C'est le mécanisme principal qui rend la génération par token des LLM pratique à la latence de production.

Dans le mécanisme d'attention multi-têtes d'un transformateur, chaque token d'entrée produit trois vecteurs : une requête (Q), une clé (K) et une valeur (V). Lors de la génération autorégressive — où le modèle émet un token à la fois — la requête de chaque nouveau token doit faire attention aux clés et valeurs de tous les tokens précédents. Sans mise en cache, ces tenseurs K et V seraient recalculés à partir de zéro à chaque étape de génération, ce qui ferait que le coût d'inférence augmente au carré avec la longueur de la séquence. Le KV-cache stocke les tenseurs K et V calculés en mémoire GPU ou CPU pour que chaque paire soit calculée exactement une fois et réutilisée pour toutes les étapes de génération suivantes.

Au début d'une demande de génération, le modèle exécute une phase « prefill » : l'invite d'entrée entière est traitée en une seule passe avant parallèle et les tenseurs K et V résultants pour chaque token de l'invite sont écrits dans le cache. La phase « decode » suivante traite un nouveau token par étape ; chaque étape lit le cache KV complet pour calculer l'attention et ajoute l'entrée K/V du nouveau token au cache. La taille du cache augmente en O(num_layers × num_key_value_heads × head_dim × sequence_length), atteignant des dizaines de gigaoctets pour les contextes longs sur les modèles volumineux, ce qui rend la capacité de mémoire GPU une contrainte principale dans la production.

Sans KV-cache, le coût de décodage par token augmenterait en O(n) car la séquence croissante complète serait retraitée à chaque étape. Avec le cache, chaque étape de décodage est O(1) en calcul (excluant la bande passante mémoire), maintenant la latence à peu près constante quel que soit le nombre de tokens déjà générés. Le KV-cache permet également des optimisations de services avancées : PagedAttention de vLLM (2023) applique le paging de mémoire virtuelle au stockage du cache KV pour éliminer la fragmentation et supporter des tailles de lots concurrents plus grandes ; le décodage spéculatif utilise un cache KV partagé entre un petit modèle de brouillon et un vérificateur volumineux pour augmenter le débit effectif.

En 2026, la gestion du cache KV est au cœur de l'ingénierie d'inférence des LLM. La quantification des tenseurs du cache KV en INT8 ou INT4 (indépendamment de la quantification des poids) est une pratique standard dans les piles de services de production incluant vLLM, TensorRT-LLM et SGLang, réduisant à peu près de moitié l'utilisation de mémoire d'activation mise en cache. Flash Attention 2 et 3 réduisent le coût de bande passante mémoire pour lire et écrire le cache. La recherche sur le déchargement du cache (versement de tenseurs vers CPU ou NVMe lorsque la mémoire GPU est épuisée) et la compression du cache (Infini-Attention, éviction de tokens H2O) est active, ciblant les déploiements où la longueur du contexte dépasse la mémoire GPU disponible.

Exemple

Lors de la génération d'une réponse de 500 tokens à une invite de 4 000 tokens, le cache KV stocke tous les tenseurs clé et valeur pour les 4 000 tokens de l'invite après une seule passe de prefill ; chacune des 500 étapes de décodage lit ensuite le cache plutôt que de retraiter l'invite, réduisant la latence par token d'environ un ordre de grandeur par rapport à l'inférence sans cache.

Termes liés

Dernières actualités sur le sujet

← Glossaire