Compresión dinámica de KV Cache basada en el framework vLLM

Motivación

Tras revisar artículos académicos recientes del último año en el campo de la dispersión KV (H2O, SnapKV, PyramidKV), aplicamos la dispersión KV a diferentes capas del modelo. Empleando una estrategia de poda, eliminamos pares KV con puntuaciones bajas mientras conservamos aquellos con puntuaciones altas y mayor proximidad. Este enfoque reduce el uso de memoria, así como la sobrecarga computacional y de E/S, lo que finalmente acelera la inferencia.

Experimentos

Líneas base y configuraciones: Ejecutamos todos los experimentos de KV-Compress utilizando nuestra integración con vLLM bifurcada de v0.6.2, en modo cuda graph con un tamaño de bloque de 16. Para todos los experimentos con RTX 4090 / Llama-3.1-8B-Instruct, usamos una utilización de memoria GPU predeterminada de 0.9 y establecemos maxmodel-length en 32k. Evaluamos nuestra compresión en Llama-3.1-8B-Instruct, comparando el rendimiento con los siguientes métodos de línea base presentados en trabajos anteriores:

  • vLLM-0.6.2
  • Novita AI, compresión de Pyramid KV Cache basada en el framework vLLM

MMLU Pro y LongBench: Controlamos diferentes ratios de compresión de KV Cache configurando diferentes longitudes de ventana deslizante en distintas capas. En el experimento, establecimos principalmente tres longitudes de ventana deslizante: 1024, 1280 y 1536, y realizamos pruebas cruzadas en diferentes números de capas. En la prueba MMLU Pro, diferentes capas de dispersión KV y diferentes longitudes de ventana deslizante muestran rendimientos distintos. Considerando la relación de aceleración, se puede garantizar una precisión general superior al 98%.

vllm-0.6.2 Novita AI
Capas de dispersión KV completo ventana deslizante=1536
22 0.4517 0.4496
26 0.4517 0.4476
31 0.4517 0.4476

En la prueba LongBench, seleccionamos una ventana deslizante de 1024 para las pruebas de rendimiento y encontramos que la pérdida de precisión fue de aproximadamente 1.03%.

vllm base VS Novita AI

Pruebas de rendimiento (Throughput): En aplicaciones reales de LLM, una longitud de entrada/salida de 5000/500 es la configuración más comúnmente observada, y el índice TTFT debe ser inferior a 2 s. Basándonos en estas condiciones, realizamos pruebas comparativas de rendimiento por lotes, obteniendo una aceleración de inferencia de 1.5× para vLLM.

Throughput vllm-0.6.2 Novita AI
Capas de dispersión KV completo ventana deslizante=1536
22 1 1.26
26 1 1.34
31 1 1.44

Cambios principales

Los archivos modificados incluyen principalmente:

  • Flash attention, puntuación dispersa basada en Flash attention garantizando que la pérdida de rendimiento del kernel sea inferior al 1%.
  • Paged attention y reshape_and_cache, puntuación dispersa basada en Paged attention y sincronización de la puntuación dispersa en las etapas de prefill y decode.
  • Block_manager y otras funciones relacionadas con la gestión de memoria y la preparación de tensores.

Conclusión

Novita AI también soporta paralelismo de tensores para permitir que modelos como Llama3-70B se ejecuten en múltiples GPUs. Actualmente, no respaldamos código abierto por ciertas razones, pero esperamos contribuir con algo de tecnología e ideas a la comunidad, y agradecemos los intercambios técnicos con todos. Solo un aviso: Las siguientes características aún no están soportadas en vLLM-0.6.2:

  • Chunked-prefill
  • Prefix caching
  • Backends que no sean FlashAttention, como FlashInfer
  • Decodificación especulativa (Speculative Decoding)

Novita AI es una plataforma en la nube de IA que ofrece a los desarrolladores una forma sencilla de implementar modelos de IA mediante nuestra API simple, al mismo tiempo que proporciona una GPU en la nube asequible y confiable para construir y escalar.

Lectura recomendada

  1. Cómo la dispersión KV logra una aceleración de 1.5× para vLLM
  2. Desbloquea el chat zero-shot de Llama 3–8b: consejos y técnicas de expertos
  3. Utiliza Clipboard Conqueror con la clave API de Novita AI para la productividad del desarrollador