El problema que PagedAttention resuelve: cuando llega una solicitud, no sabes qué tan larga será la respuesta, así que debes preasignar KV cache para la longitud máxima posible. Si la longitud máxima es 4096 tokens pero la respuesta es solo de 200 tokens, el 95% de la memoria asignada se desperdicia. Multiplica por cientos de solicitudes concurrentes y la memoria GPU se llena rápido, limitando el rendimiento.
PagedAttention divide el KV cache en páginas de tamaño fijo (por ejemplo, 16 tokens por página). Las páginas se asignan solo cuando se necesitan y pueden almacenarse en cualquier lugar de la memoria GPU (no contiguo). Una tabla de páginas mapea posiciones lógicas a ubicaciones de memoria física, exactamente como la memoria virtual del sistema operativo. Esto elimina la fragmentación: la memoria se asigna página por página a medida que la respuesta crece, y las páginas liberadas están inmediatamente disponibles para nuevas solicitudes.
Una extensión poderosa: cuando múltiples solicitudes comparten el mismo prefijo de prompt (común con prompts de sistema compartidos), sus páginas de KV cache para ese prefijo pueden compartirse físicamente — almacenadas una vez en memoria pero referenciadas por todas las solicitudes. Esta es la semántica copy-on-write del diseño de sistemas operativos aplicada al servicio de LLMs. Para aplicaciones donde muchos usuarios comparten el mismo prompt de sistema, esto puede reducir el uso de memoria en más del 50% para la porción compartida.