Inteligencia Artificial 5-8 minutos

Reducir la Latencia de Inicio en Inferencia LLM con NVIDIA Run:ai Model Streamer

Diego Cortés
Diego Cortés
Full Stack Developer & SEO Specialist
Compartir:
Reducir la Latencia de Inicio en Inferencia LLM con NVIDIA Run:ai Model Streamer

El despliegue de grandes modelos de lenguaje (LLMs) implica el desafío de optimizar la eficiencia de la inferencia. En particular, las demoras de inicio en frío—cuando los modelos requieren un tiempo considerable para cargarse en la memoria GPU—pueden afectar la experiencia del usuario y la escalabilidad. En entornos de producción cada vez más complejos, se hace evidente la necesidad de una carga eficiente de modelos. Estos modelos suelen requerir decenas a cientos de gigabytes de memoria, lo que genera problemas de latencia y de recursos al escalarlos para satisfacer una demanda impredecible. Las demoras de inicio frío afectan tanto la experiencia del usuario final como la eficiencia operativa.

Este artículo presenta el NVIDIA Run:ai Model Streamer, un SDK de Python de código abierto diseñado para mitigar estos problemas al leer simultáneamente los pesos del modelo desde el almacenamiento y transmitirlos directamente a la memoria GPU. Se realizaron pruebas comparativas con el cargador por defecto de vLLM, Hugging Face (HF) Safetensors Loader y CoreWeave Tensorizer, utilizando SSD locales y Amazon S3.

Los experimentos descritos evidencian que el NVIDIA Run:ai Model Streamer reduce significativamente los tiempos de carga del modelo, disminuyendo la latencia de inicio en frío incluso en entornos de nube. Además, es compatible con el formato Safetensor, evitando así la necesidad de conversión de pesos. Los hallazgos subrayan la importancia de la elección del almacenamiento y la transmisión concurrente para una implementación eficiente de LLMs. En concreto, para mejorar el rendimiento de la inferencia, se recomienda utilizar el NVIDIA Run:ai Model Streamer, con el fin de reducir la latencia de inicio en frío, saturar el ancho de banda de almacenamiento y acelerar el tiempo hasta la inferencia.

¿Cómo se carga un modelo a una GPU para la inferencia?

Para proporcionar información de contexto, esta sección explica los dos pasos principales involucrados en la carga de un modelo de aprendizaje automático en la memoria GPU para la inferencia: la lectura de pesos desde el almacenamiento en la memoria CPU y la transferencia de estos a la GPU. Comprender este proceso es clave para optimizar la latencia de inferencia, especialmente en implementaciones a gran escala o en la nube.

Lectura de pesos desde el almacenamiento hasta la memoria CPU

Los pesos del modelo se cargan desde el almacenamiento a la memoria CPU. Estos pueden estar en diversos formatos, como .pt, .h5 y .safetensors, o en formatos personalizados; el almacenamiento puede ser local, en clúster o en la nube. Para los propósitos de este artículo, se utiliza el formato .safetensors debido a su amplia adopción. Sin embargo, es posible emplear otros formatos en diferentes contextos.

Transferencia del modelo a la GPU

Los parámetros del modelo y los tensores relevantes se transfieren a la memoria GPU. 

Cargar modelos desde almacenamiento en la nube, como Amazon S3, frecuentemente implica un paso adicional: primero, los pesos se descargan al disco local antes de ser trasladados a la memoria CPU y posteriormente a la memoria GPU. Tradicionalmente, estos pasos se llevan a cabo de forma secuencial, lo que convierte los tiempos de carga del modelo en uno de los mayores cuellos de botella al escalar la inferencia.

¿Cómo funciona el Model Streamer?

El Model Streamer es un SDK con un backend en C++ de alto rendimiento diseñado para acelerar la carga de modelos en GPUs desde diversas fuentes de almacenamiento (por ejemplo, sistemas de archivos de red, nube, discos locales, etc.). Utiliza múltiples hilos para leer tensores de manera concurrente desde un archivo en almacenamiento de objetos o archivos hacia un búfer dedicado en la memoria CPU. Cada tensor tiene un identificador, lo que permite la lectura y transferencia simultáneas: mientras algunos tensores se leen desde el almacenamiento hacia la CPU, otros se trasladan de la CPU a la GPU.

La herramienta aprovecha al máximo el hecho de que los subsistemas de GPU y CPU son independientes. Las GPU acceden a la memoria de la CPU directamente a través de PCIe sin intervención de la CPU, lo que permite la superposición en tiempo real entre lecturas de almacenamiento y transferencias de memoria. Los experimentos se llevaron a cabo en una instancia de AWS g5.12xlarge con GPUs NVIDIA A10G y CPUs AMD EPYC de 2da generación, ofreciendo una arquitectura equilibrada para un manejo paralelo eficiente de datos.

Características clave del Model Streamer incluyen:

  • Concurrencia: Varios hilos leen archivos de pesos del modelo en paralelo, incluyendo soporte para dividir tensores grandes.
  • Carga de trabajo equilibrada: El trabajo se distribuye en función del tamaño del tensor para saturar el ancho de banda de almacenamiento.
  • Soporte para múltiples tipos de almacenamiento: Funciona con SSDs, almacenamiento remoto y tiendas de objetos en la nube como S3.
  • Sin conversión de formato de tensor: Soporta Safetensors de manera nativa, evitando la sobrecarga de la conversión.
  • Integración sencilla: Ofrece una API de Python y un iterador similar al de Safetensors, pero con lectura en segundo plano concurrente. Se integra fácilmente con motores de inferencia como vLLM y TGI.

Para más detalles sobre la configuración y uso, consultar la documentación de Model Streamer.

Funcionamiento del HF Safetensors Loader

El HF Safetensors Loader es una utilidad de código abierto que proporciona un formato seguro y rápido para guardar y cargar múltiples tensores. Utiliza un sistema de archivos mapeados en memoria para minimizar la copia de datos. En la CPU, los tensores se mapean directamente en la memoria. En la GPU, crea un tensor vacío con PyTorch y luego mueve los datos tensoriales utilizando cudaMemcpy, facilitando un proceso de carga sin copias.

Funcionamiento del CoreWeave Tensorizer

El CoreWeave Tensorizer es una herramienta de código abierto que serializa los pesos del modelo y sus respectivos tensores en un solo archivo. En lugar de cargar todo el modelo en RAM antes de trasladarlo a la GPU, Tensorizer transmisión los datos del modelo tensor por tensor desde una fuente HTTP/HTTPS o S3.

Comparación del rendimiento de cargadores de modelo a través de tres tipos de almacenamiento

Se comparó el rendimiento de diferentes cargadores de modelo (NVIDIA Run:ai Model Streamer, CoreWeave Tensorizer y HF Safetensors Loader) en tres tipos de almacenamiento:

Experimento #1: GP3 SSD

Se midieron los tiempos de carga del modelo con varios cargadores. Se evaluó el impacto de la concurrencia en el Model Streamer y se examinó cómo el número de trabajadores afectaba al Tensorizer.

Experimento #2: IO2 SSD

Se probaron los mismos cargadores en IO2 SSD para evaluar el impacto de mayores IOPS y ancho de banda.

Experimento #3: Amazon S3

Se compararon cargadores en almacenamiento en la nube; el Safetensors Loader fue excluido, ya que no soporta S3.

Experimento #4: vLLM con diferentes cargadores

Se integró el Model Streamer en vLLM para medir los tiempos totales de carga y preparación, comparándolo con el cargador por defecto de HF Safetensors Loader y Tensorizer.

Todos los testes se realizaron bajo condiciones de inicio en frío para evitar efectos de caché. Se observó que durante estos experimentos, emergieron comportamientos de caché inesperados en AWS S3. Al repetir experimentos en rápida sucesión, los tiempos de carga del modelo mejoraron significativamente, probablemente debido a un mecanismo de almacenamiento en caché de S3. Para garantizar consistencia y evitar beneficiarse de este “caché caliente,” se introdujo un período de espera mínimo de tres minutos entre cada ejecución de prueba.

Resultados y Conclusiones

Las pruebas muestran que el NVIDIA Run:ai Model Streamer acelera significativamente los tiempos de carga de modelos en almacenamiento local y remoto, superando a otros cargadores comunes. Mediante la habilitación de la carga de pesos concurrente y la transmisión de memoria GPU, ofrece una solución práctica y de alto impacto para cargas de trabajo de inferencia a escala de producción.

Para quienes estén construyendo o escalando sistemas de inferencia, especialmente con modelos grandes o almacenamiento basado en la nube, estos resultados ofrecen conclusiones inmediatas: utilizar el Model Streamer para reducir la latencia de inicio en frío, saturar el ancho de almacenamiento y acelerar el tiempo de inferencia. Con fácil integración en marcos como vLLM y soporte para entornos de alta concurrencia y múltiples tipos de almacenamiento, representa una optimización simple que puede generar mejoras medibles. 

Aproveche el rendimiento de carga de su modelo con el NVIDIA Run:ai Model Streamer. Para más información, se invita a seguir explorando en este blog.

¿Te gustó este artículo?
Por Diego Cortés

Categorías

Page loaded in 26.48 ms