No history yet

Limites du cache KV

Le goulot d'étranglement de la mémoire

Le cache Clé-Valeur (KV) est essentiel pour accélérer l'inférence des Transformers en évitant de recalculer les états d'attention des tokens précédents. Cependant, cette optimisation a un coût élevé : la mémoire. À mesure que les séquences s'allongent, la gestion de ce cache devient le principal facteur limitant les performances, en particulier sur la précieuse mémoire à haute bande passante (HBM) des GPU.

Le problème ne vient pas du cache lui-même, mais de la manière rigide dont la mémoire lui est traditionnellement allouée.

L'approche classique consiste à utiliser une allocation de mémoire contiguë. Pour chaque nouvelle requête, le système réserve un bloc de mémoire suffisamment grand pour contenir l'intégralité de la séquence de sortie potentielle, jusqu'à la longueur maximale autorisée par le modèle (max_seq_len). Imaginez réserver une place de parking pour un bus, même si vous venez la plupart du temps avec une simple moto. Vous payez pour un espace que vous n'utilisez presque jamais entièrement.

La fragmentation, un gaspillage invisible

Cette stratégie de sur-réservation (over-provisioning) mène inévitablement à un gaspillage massif de la mémoire, un phénomène connu sous le nom de fragmentation. On distingue deux types principaux de fragmentation qui, combinés, peuvent rendre inutilisable 60 à 80 % de la mémoire allouée au cache KV.

La : C'est l'espace perdu à l'intérieur d'un bloc de mémoire alloué. Quand une requête ne nécessite que 50 tokens mais que le système en a réservé 2048, les 1998 emplacements restants sont gaspillés. Ils sont réservés pour cette requête unique et ne peuvent être utilisés par aucune autre.

La : Elle se produit lorsque des blocs de mémoire libres existent, mais qu'ils sont trop petits ou non contigus pour satisfaire une nouvelle demande d'allocation. Même s'il y a assez de mémoire libre au total, si elle est éparpillée en petits morceaux, le système ne peut pas allouer un nouveau grand bloc contigu et doit rejeter la requête.

De la mémoire au débit

Le lien entre la fragmentation de la mémoire et le débit (throughput) est direct. Le débit mesure le nombre de requêtes qu'un système peut traiter par unité de temps. Dans le contexte de l'inférence LLM, il est souvent limité par la capacité de la mémoire du GPU.

Nconcurrents=MtotaleMreque^teN_{concurrents} = \frac{M_{totale}}{M_{requête}}

Avec une allocation statique, Mreque^teM_{requête} est calculée sur la base de max_seq_len, et non sur la longueur réelle de la séquence. Par conséquent, même si la mémoire totale est importante, le gaspillage dû à la fragmentation réduit considérablement le nombre de requêtes pouvant être traitées simultanément. Moins de requêtes en parallèle signifie un débit plus faible et des temps d'attente plus longs pour les utilisateurs.

Le compromis principal est la mémoire (utilisation de la VRAM) : le cache augmente avec les couches, les têtes, la taille du lot et la longueur de la séquence, ce qui déplace le goulot d'étranglement vers la capacité et la bande passante de la mémoire.

Pour surmonter ces limites, il est devenu impératif de développer des stratégies de gestion de la mémoire plus intelligentes et dynamiques. L'objectif est de découpler l'allocation logique de l'organisation physique de la mémoire, permettant une utilisation beaucoup plus efficace de la HBM et, par conséquent, une augmentation significative du débit.

Quiz Questions 1/5

Quel est le principal inconvénient du cache Clé-Valeur (KV) pour accélérer l'inférence des Transformers, malgré son efficacité ?

Quiz Questions 2/5

Qu'est-ce que la "fragmentation interne" dans le contexte de l'allocation de mémoire pour le cache KV ?

Cette approche rigide de l'allocation mémoire est le principal obstacle à l'efficacité. Dans la section suivante, nous verrons comment des techniques innovantes résolvent ce problème.