¿Qué cambia PagedAttention en la asignación de memoria KV de los LLMs?
Traducción automática
Este artículo se tradujo automáticamente a partir de la versión original en inglés.
PagedAttention permite que la caché de atención de una petición ocupe bloques de memoria separados y de tamaño fijo, en lugar de una única asignación contigua de gran tamaño. Una tabla de bloques relaciona las posiciones lógicas de los tokens de la petición con los bloques físicos. Esto reduce la necesidad de reservar de antemano la longitud máxima posible de la secuencia de una petición.
La ventaja principal es una asignación de memoria KV más flexible para peticiones concurrentes. No reduce la cantidad de datos de claves y valores necesaria para cada token almacenado.
Calcular el espacio sin usar en los bloques
Consideremos una implementación ilustrativa con bloques de 16 tokens. Una secuencia de 35 tokens necesita tres bloques, con espacio para 48 tokens. Trece posiciones del último bloque quedan sin usar: alrededor del 27% de las posiciones asignadas para esta secuencia corta.
Solo el último bloque tiene que estar parcialmente lleno. A medida que las secuencias crecen, ese espacio sin usar representa una fracción menor de la memoria que se les asigna. El tamaño real de los bloques y las disposiciones compatibles dependen del runtime, del backend de atención y de la versión.
El artículo de PagedAttention describe el diseño de la correspondencia y la asignación. Asigna bloques adicionales a medida que crece una secuencia y los libera cuando termina la petición, en lugar de reservar un gran intervalo contiguo por petición.
Compartir requiere algo más que asignar memoria
Varias peticiones pueden hacer referencia al mismo bloque de caché compatible. La caché de prefijos encuentra bloques reutilizables para prefijos idénticos; la gestión de copia en escritura permite que las peticiones diverjan sin corromper el estado compartido. Una disposición por bloques lo permite, pero no proporciona automáticamente una política de búsqueda en la caché ni garantiza la reutilización entre peticiones.
La presentación original de vLLM informó de un desperdicio del 60–80% en los métodos de asignación anteriores con los que se comparó, y de menos del 4% en las cargas de trabajo de PagedAttention que midió. El cálculo anterior para una secuencia corta muestra por qué ese valor inferior al 4% no es un límite superior universal. Sus comparaciones con grandes mejoras de rendimiento también incluyen diferencias en el runtime completo, por lo que no deben atribuirse solo a la asignación de memoria.
Mide los bloques asignados, las posiciones de tokens usadas, las expulsiones de caché o interrupciones y la capacidad para peticiones concurrentes. Compara las mismas longitudes y la misma precisión de caché. Si los datos KV por sí solos ya superan la memoria disponible, la asignación por bloques no puede hacer desaparecer esos datos; también puede ser necesario reducir el número de cabezas KV, usar una cuantización de caché compatible o reducir la carga de trabajo.
Guía de ingeniería: PagedAttention incluye un ejemplo de tabla de bloques.