Conociendo sobre vLLM con Red Hat

 

Integración y funcionalidades del VLM

«VLM se ha vuelto popular porque actúa como una capa de software entre los diferentes modelos y el hardware disponible.»

  • VLM proporciona una forma fácil de ejecutar una amplia variedad de modelos de inteligencia artificial, siendo accesible con simples comandos de instalación como pip install o a través de imágenes de Docker.
  • Las contribuciones a VLM provienen tanto de la comunidad de desarrolladores como de fabricantes de hardware, como Nvidia, AMD, e Intel, lo que resalta su relevancia en el ecosistema de la IA.
  • Además de modelos de lenguaje, VLM también es compatible con modelos multimodales y capacidades de compresión y cuantización de modelos. Esto permite optimizar y adaptar diversos modelos para incrementar su rendimiento.
  • La integración de bibliotecas como TRL y Verl da soporte a técnicas de RLHF (Reinforcement Learning from Human Feedback), mejorando la eficiencia del proceso de aprendizaje.

Actualizaciones y nuevas capacidades

«Esta es una actualización importante, con más de 600 commits de 140 colaboradores, de los cuales 82 son nuevos.»

  • La reciente versión 0.9.0 incluye numerosos cambios, con especial énfasis en la actualización de la base tecnológica al pasar a PyTorch 2.7.0 y CUDA 12.8.
  • Se han introducido nuevos modelos, incluyendo modelos híbridos de Mamba, que mejoran la atención local en el procesamiento.
  • VLM ahora maneja de manera más eficiente la memoria a través de un nuevo asignador de memoria híbrido, que aborda modelos que combinan atención local y global.
  • Estas mejoras no solo deben considerarse para nuevos modelos, sino también para optimizaciones en modelos existentes, garantizando un rendimiento óptimo durante la inferencia.

Soporte para Grafos CUDIGRAPHs Completos en V1

«La ejecución del modelo en sí es bastante pequeña, donde los sobrecostos de CPU aún están presentes.»

  • Se está introduciendo soporte para grafos CUDIGRAPHs completos en la versión 1. Aunque los grafos parciales han existido desde el inicio del desarrollo, esta nueva característica experimental es útil para ciertos casos de uso donde la ejecución del modelo es pequeña y la sobrecarga del CPU es significativa.
  • Los usuarios pueden optar por esta función a través de la configuración de compilación, lo que muestra el enfoque en la personalización y optimización del rendimiento.

Mejoras en el Paralelismo de Secuencias y Estratégias de Deprecación

«Definitivamente hemos escuchado las peticiones de las personas que quieren más transparencia en cómo se están deprecando las cosas.»

  • Se ha comenzado a trabajar en la implementación de un paralelismo de secuencias, que aunque aún no ofrece un rendimiento óptimo, se considera importante para la escalabilidad en contextos largos en el futuro.
  • Además, se ha establecido una estrategia de deprecación más clara y transparente para informar a los usuarios sobre los argumentos que se deprecán y el tiempo estimado antes de retirar características, lo que mejora la comunicación con la comunidad.

Nuevas Funcionalidades y Mejoras de Hardware

«El soporte en VLM es bastante amplio y excelente.»

  • En esta versión se han añadido mejoras en la compatibilidad con modelos NV FP4 y MX FP4, optimizando el rendimiento en las nuevas GPU de Nvidia y AMD.
  • También se han implementado cambios significativos en los kernels de hardware y se han realizado optimizaciones en codificación especulativa, destacando el soporte para Eagle 3.
  • La variedad de modelos compatibles con el backend de transformers ha aumentado, incluyendo la atención de ventana deslizante, y se está trabajando en el soporte multimodal y de modelos de embeddings.

Mejoras de Seguridad y Cambios en Comportamiento

«Hemos estado abordando la mayoría de los avisos de seguridad.»

  • Se han realizado importantes mejoras de seguridad en el sistema, y se alienta a los usuarios interesados a revisar el canal de anuncios y Slack de VLM para más detalles sobre cómo se manejan las advertencias de seguridad.
  • También se ha cambiado el comportamiento del semillero utilizado en varias funciones, ahora utilizando una semilla fija para mayor previsibilidad, aunque se puede anular ajustando la semilla a ningún valor si es necesario.

Uso de Cudagraphs en Torch Compile

«Cudagraphs es una tecnología que nos permite registrar una secuencia de lanzamientos de núcleos y luego reproducirlos en el futuro.»

  • Cudagraphs es una característica que se integra en Torch Compile, permitiendo mejorar el rendimiento al grabar la secuencia de lanzamientos de núcleos en una GPU Nvidia. Esto ahorra el tiempo de ejecución asociado con el lanzamiento repetido de núcleos CUDA, lo que ayuda a reducir la sobrecarga.
  • Al utilizar la API de Cudagraphs directamente, es un desafío mantener la seguridad en la codificación, ya que solo los lanzamientos de núcleos están registrados, y cualquier cálculo realizado por la CPU no se incluye en la grabación. Esto puede generar resultados incorrectos silenciosos.
  • Sin embargo, Torch Compile mejora esta situación al analizar el código y descomponer operaciones potencialmente inseguras, asegurando un funcionamiento correcto.

Optimización de VLM a través de Torch Compile

«VLM utiliza Torch Compile por defecto, lo cual facilita la optimización durante la ejecución de modelos.»

  • En VLM, Torch Compile está habilitado automáticamente, lo que simplifica la implementación y mejora el rendimiento sin requerir cambios adicionales del usuario. A pesar de que existe la opción de forzar compilaciones ávidas, generalmente se prefiere mantener la compilación activada.
  • Un modelo simple se compone de entradas de ejemplo y el compilador captura un gráfico de las operaciones a realizar, lo que permite la optimización de la ejecución posterior.
  • VLM implementa un sistema de almacenamiento en caché que evita la recompilación durante el servicio del modelo, garantizando que artefactos compilados anteriormente sean reutilizados eficientemente al cargarlos desde la caché.

Especialización en Tamaños de Lote

«Al especializarse en tamaños de lote específicos, se puede mejorar el rendimiento entre un 5% y un 10%.»

  • Por defecto, VLM captura un gráfico con un tamaño de lote dinámico, pero puede optimizarse aún más al especializar compilaciones para tamaños de lote comunes como uno, dos y cuatro. Esto requiere pasar configuraciones de compilación apropiadas dentro de la ejecución del modelo.
  • Aunque la especialización aumenta el tiempo de compilación, los beneficios del rendimiento pueden justificar esta inversión, especialmente si se espera que se utilicen esos tamaños de lote específicos durante la inferencia.

Integración de Flex Attention

«Flex Attention es una API que permite implementar diferentes variantes de atención con facilidad.»

  • Flex Attention simplifica el proceso de personalización de mecanismos de atención pasando simplemente las modificaciones necesarias. Previo a esto, modificar la atención implicaba copiar y ajustar código de bajo nivel, lo cual es un proceso engorroso.
  • Mediante el uso de Flex Attention, los desarrolladores pueden implementar atención bidireccional o codificaciones de posición relativas, y la compiler se encarga de transformar estas funciones en código optimizado para su uso en inferencias rápidas.

Implementación Eficiente con Dynamo y Torch

«Todo el flujo de control a la izquierda y toda la sobrecarga de CPU desaparecen.»

  • Se utiliza la herramienta Dynamo combinada con la interfaz de Torch Compile para crear un gráfico optimizado que elimina el flujo de control innecesario y la sobrecarga del CPU, resultando en un gráfico eficiente y lineal.
  • Este enfoque simplifica las operaciones y permite la fusión de operaciones, llevando a la generación de código más eficiente.

Fusión de Operaciones Personalizadas

«Podemos hacer esto mediante el uso de pasos personalizados.»

  • En el caso de operaciones como RMS norm y quantization, se utilizan núcleos personalizados que no son automáticamente compatibles con la fusión de Torch Compile debido a que la herramienta no los comprende de manera nativa.
  • Para fusionar estos núcleos, se emplea un «patrón matcher.» Este permite registrar un patrón de operaciones seguido de su reemplazo, facilitando así la fusión de la función de activación con la operación de cuantización.

Mejoras de Rendimiento con Fusión

«La fusión y los núcleos personalizados superan ligeramente al modelo por defecto.»

  • Al evaluar modelos como Llama 405B cuantificado a FB8, se observa un aumento significativo en el rendimiento al usar tanto núcleos personalizados como la fusión en comparación con el uso solo de núcleos sin fusión.
  • La fusión no solo mejora el rendimiento general, sino que también se ha demostrado que es más eficiente que las implementaciones de Torch 2.7, a pesar de la mejora continua en sus compilaciones predeterminadas.

Añadiendo Pasos Personalizados sin Modificar el Código Fuente

«Hay formas de añadirlos sin tocar el código fuente de VLM.»

  • Se pueden agregar pasos personalizados a través del administrador de pasos de posprocesamiento, que permite la modificación de la fuente VLM.
  • También existen opciones para implementar estos pasos mediante comandos en línea o configuraciones de compilación, lo cual es ideal para aquellos que deseen transformar gráficamente sin alterar la lógica base.

Compilación en Tiempo de Ejecución y Autotuning

«VLM, por defecto, es un híbrido entre tiempo de compilación y tiempo de ejecución.»

  • La compilación y el autotuning en VLM se realizan durante el calentamiento del modelo, donde se ejecutan ejemplos de entrada para preparar y optimizar el modelo.
  • Durante el servicio del modelo, no hay compilación ni autotuning, lo que significa que se pierde la oportunidad de optimización en tiempo de ejecución.
  • Al cambiar los inputs, como la cantidad de prompts y la longitud de secuencia, la autotuning que se realiza inicialmente se basa en el tamaño de entrada que se proporciona.
  • Es beneficioso especificar tamaños de lote estáticos para mejorar el rendimiento, aunque esto puede significar un tiempo de compilación más prolongado.

Dependencia de Operaciones y Contador de Flops

«La intensidad aritmética se refiere a la relación entre las operaciones computacionales y las operaciones de memoria.»

  • No existe una manera estandarizada para determinar si una operación de tensor es limitada por computación o por memoria, pero se puede usar la intensidad aritmética como un indicador.
  • Al medir la cantidad de operaciones (flops) y el tamaño del modelo, se puede calcular la intensidad aritmética, que refleja cuán eficientemente se utilizan los recursos.
  • Generalmente, las operaciones elementwise tienden a ser limitadas por la memoria, mientras que las operaciones con matrices, como multiplicaciones matriciales, suelen ser limitadas por la capacidad de cálculo, especialmente si las dimensiones son compatibles.

Rendimiento de Inductor y Fusión de Kernels

«La mayoría del rendimiento de Inductor proviene de la fusión de operaciones.»

  • Inductor utiliza una biblioteca de plantillas de kernels, pero su rendimiento no depende solamente de estas plantillas; más bien, la fusión de operaciones es clave para la optimización.
  • Se generan kernels específicos para operaciones elementwise y de reducción, leyendo y ensamblando operaciones de manera eficiente.
  • Es posible utilizar herramientas para investigar el rendimiento e identificar la efectividad de las fusiones realizadas por Inductor, proporcionando una mejor comprensión de cómo se forman los kernels.

Activación y uso de compilaciones dinámicas

«No conozco a nadie que no lo haya querido.»

  • La habilitación de compilaciones dinámicas no garantiza su uso, ya que pueden desactivarse si es necesario. Esto es útil para aquellos que prefieren no experimentar los tiempos de inicio asociados con la compilación.
  • A pesar de que activar una función no significa que sea obligatoria, es fundamental que los usuarios comprendan que pueden desactivarla si no la desean.
  • El soporte para diferentes modelos aún no ha sido completamente implementado, especialmente para los modelos multimodales y la capacidad de detección de dimensiones de lotes.

Esfuerzo necesario para la implementación

«Creo que es una cuestión de nivel de esfuerzo.»

  • La decisión de habilitar soporte para compilaciones dinámicas en nuevos modelos depende del esfuerzo necesario para realizar cambios en las definiciones de modelo existentes.
  • Algunos modelos, como los de visión y lenguaje, no son tan críticos para implementar esa función debido a que la mayoría del cómputo se concentra en los modelos de lenguaje compartidos.

Mejoras en la generación de código y futuras expectativas

«¿Esperas utilizar más generación de código Cutlass en el futuro?»

  • Hay una intención clara de incorporar más generación de código Cutlass en Torch Compile y su uso como backend.
  • La integración de opciones como Cutlass con fusiones y optimizaciones ya está en marcha, lo que sugiere un enfoque proactivo para mejorar el rendimiento y la eficiencia en el futuro.

 

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *