Descifrando el almacenamiento en caché de mensajes: desde los principios de PagedAttention hasta la reducción de costes y la mejora de la eficiencia por 10 Este artículo de @dejavucoder profundiza en los principios subyacentes del almacenamiento en caché de Prompt, en particular basándose en la tecnología PagedAttention de @vllm_project. Basándose en su propia experiencia al encontrar dificultades durante el desarrollo, el autor corrige muchos conceptos erróneos comunes que los desarrolladores tienen sobre los mecanismos de almacenamiento en caché y ofrece sugerencias de optimización muy prácticas. Mito fundamental y verdad: El almacenamiento en caché es global, no privado. Mito: El autor (como muchos de nosotros) inicialmente creía que el almacenamiento en caché de mensajes se basaba en "sesiones de usuario". Es decir, solo los mensajes posteriores del mismo usuario dentro del mismo cuadro de diálogo podían utilizar los mensajes almacenados previamente en caché. La verdad es que el almacenamiento en caché de indicaciones se basa en el contenido, no en el usuario. • Lógica central: siempre que los mensajes del sistema o las definiciones de herramientas sean texto completamente consistente, el caché generado por el usuario A puede ser reutilizado completamente por el usuario B. • Importancia: Esto significa que en escenarios de alta concurrencia, siempre que el prefijo sea consistente, el sistema puede lograr una "reutilización global", reduciendo en gran medida los cálculos redundantes. ¿Por qué es necesario el almacenamiento en caché? (Costo vs. velocidad) El proceso de razonamiento de LLM se divide en dos etapas, y comprender esta diferencia es clave para entender el valor del almacenamiento en caché: • Etapa de prellenado: Esta etapa procesa la gran cantidad de solicitudes que introduce y calcula su caché clave-valor. Este proceso requiere un uso intensivo de recursos computacionales. • Fase de decodificación: Generación de tokens de respuesta uno por uno. Este proceso consume mucha memoria y ancho de banda. • Sin almacenamiento en caché: cada vez que llega una solicitud, incluso si el primer 90 % de las solicitudes son las mismas, el modelo debe volver a calcularse para el llenado previo, lo que es lento y costoso. • Accede al caché: puede omitir directamente el engorroso cálculo de llenado previo, lo que reduce el costo de ingresar tokens en 10 veces y mejora significativamente la velocidad de generación del primer carácter. Presentación técnica: PagedAttention La gestión tradicional de caché de valor clave es muy ineficiente y requiere la preasignación de un gran bloque de memoria de video contigua, lo que fácilmente conduce a la fragmentación y al desperdicio. vLLM introduce la idea de la gestión de memoria del sistema operativo: paginación. • Bloques: En lugar de asignar grandes bloques de memoria contiguos, el sistema divide la caché KV en bloques de tamaño fijo. Estos bloques pueden estar dispersos y no ser contiguos dentro de la memoria física de video. • Hashing de bloques: la clave para un almacenamiento en caché eficaz: ¿Cómo sabe el sistema que este pasaje ya se ha calculado? Calcula el valor hash del bloque. • Dependencia del bloque padre: el valor hash de un bloque depende no solo de su propio contenido, sino también del valor hash del bloque anterior. • Reacción en cadena: Es similar a una cadena de bloques. El valor hash actual solo coincidirá si todo, desde el principio, es completamente consistente. Esto garantiza la exactitud de la causalidad: no se puede simplemente reutilizar un segmento intermedio; el prefijo debe coincidir exactamente. • Búsqueda global: Al recibir una nueva solicitud, el sistema calcula el hash del bloque de su palabra de solicitud y lo busca en la tabla hash global. Si encuentra una coincidencia, apunta directamente a un bloque de memoria existente, sin necesidad de realizar cálculos adicionales. Consejos prácticos para desarrolladores: ¿Cómo “engañar” al sistema para que acceda a la caché? Para maximizar la tasa de aciertos de la caché, es necesario que el sistema trate las diferentes solicitudes como si fueran iguales. El artículo ofrece varias reglas de oro: • Mantener un prefijo estable. Coloque todo el contenido estático (indicaciones del sistema, definiciones de herramientas, texto de muestra) al principio. • Contraejemplo: si coloca "hora actual" o "nombre de usuario" al comienzo del mensaje, toda la cadena hash se rompe desde el principio y el contenido posterior, incluso si es idéntico, no se puede reutilizar en la memoria caché. • Serialización determinista Al utilizar el formato JSON para transmitir datos (por ejemplo, para llamadas de utilidad), el orden de las claves debe mantenerse constante. Consejo: Use `json.dumps(..., sort_keys=True)` en Python. Porque `{ "a": 1, "b": 2 }` y `{ "b": 2, "a": 1 }`, aunque semánticamente idénticos, generan cadenas diferentes, lo que provoca un error de caché. • Modo de solo anexar Al mantener el historial de diálogos multi-turno, intente agregar contenido nuevo solo al final. No modifique ni trunque el historial en la parte intermedia, ya que una vez modificado, toda la cadena de caché posterior quedará inválida. • Tenga cuidado con los cambios en las definiciones de herramientas. El modelo suele añadir estas definiciones a las indicaciones del sistema. Si habilita o deshabilita dinámicamente diferentes herramientas para distintos usuarios, el prefijo cambiará, lo que invalidará la caché. Resumir La esencia del almacenamiento en caché de Prompt no es la "memoria", sino la "reutilización de los resultados de los cálculos". Comprender los mecanismos subyacentes de las cadenas de bloques y hash permite a los desarrolladores comprender la importancia de los prefijos. En resumen: coloque siempre todo lo que no cambia (comandos del sistema, documentos de fondo, listas de herramientas) al principio, y lo que cambia (preguntas del usuario, variables dinámicas) al final. Lea el texto original
Cargando el detalle del hilo
Obteniendo los tweets originales de X para ofrecer una lectura limpia.
Esto suele tardar solo unos segundos.
