Le problème que PagedAttention résout : quand une requête arrive, tu ne sais pas quelle sera la longueur de la réponse, alors tu dois pré-allouer le KV cache pour la longueur maximale possible. Si la longueur max est de 4096 tokens mais la réponse n'en fait que 200, 95% de la mémoire allouée est gaspillée. Multiplie par des centaines de requêtes simultanées et la mémoire GPU se remplit rapidement, limitant le débit.
PagedAttention divise le KV cache en pages de taille fixe (ex : 16 tokens par page). Les pages ne sont allouées qu'au besoin et peuvent être stockées n'importe où en mémoire GPU (non contigu). Une table de pages fait la correspondance entre les positions logiques et les emplacements mémoire physiques, exactement comme la mémoire virtuelle d'un OS. Cela élimine la fragmentation : la mémoire est allouée page par page au fur et à mesure que la réponse grandit, et les pages libérées sont immédiatement disponibles pour de nouvelles requêtes.
Une extension puissante : quand plusieurs requêtes partagent le même préfixe de prompt (courant avec les prompts système partagés), leurs pages de KV cache pour ce préfixe peuvent être physiquement partagées — stockées une seule fois en mémoire mais référencées par toutes les requêtes. C'est la sémantique copy-on-write du design d'OS appliquée au serving de LLM. Pour les applications où de nombreux utilisateurs partagent le même prompt système, cela peut réduire l'utilisation mémoire de 50%+ pour la portion partagée.