Optimización del uso de GPU para mejorar la eficiencia en entornos de Kubernetes

En los entornos de producción de Kubernetes, la discrepancia entre los requisitos de los modelos y el tamaño de las GPU genera ineficiencias. Modelos ligeros de reconocimiento automático de voz (ASR) o de sintetización de voz (TTS) a menudo requieren solo 10 GB de VRAM, pero ocupan una GPU completa en implementaciones estándar de Kubernetes.

Este problema no solo se trata de reducir costos, sino de optimizar la densidad del clúster para atender a más usuarios concurrentes con el mismo hardware de alta calidad. Esta guía detalla cómo implementar y evaluar estrategias de partición de GPU, específicamente NVIDIA Multi-Instance GPU (MIG) y la división por tiempo, para aprovechar completamente los recursos de cómputo.

Abordando la fragmentación de recursos de GPU

Por defecto, el complemento de dispositivo NVIDIA para Kubernetes muestra las GPU como recursos enteros. Un pod solicita nvidia.com/gpu: 1, y el programador lo asigna a un dispositivo físico.

Modelos de lenguaje grandes (LLMs) como NVIDIA Nemotron, Llama 3 o Qwen 7B/8B requieren cómputo dedicado para mantener un bajo tiempo hasta el primer token (TTFT) y un alto rendimiento por lote. Sin embargo, los modelos de soporte en un pipeline de IA generativa, como los modelos de incrustación, ASR, TTS o guardrails, a menudo utilizan solo una fracción de una tarjeta.

Esto resulta en baja utilización, hinchazón del clúster y fricción al escalar, ya que se requieren más nodos para ejecutar la misma cantidad de pods.

Estrategias de partición

Se evaluaron dos estrategias principales para la partición de GPU soportadas por el operador de GPU de NVIDIA.

Partición basada en software: División por tiempo y MPS

La división por tiempo permite que múltiples procesos de NVIDIA CUDA compartan una GPU mediante la ejecución intercalada. Funciona de manera similar a un programador de CPU donde el contexto A se detiene y el contexto B se ejecuta.

Sin embargo, esto no proporciona aislamiento de hardware, lo que significa que un desbordamiento de memoria en un pod puede afectar a los demás en el contexto compartido.

Configuración experimental: El pipeline de voz AI

A technical architecture diagram of a multimodal Voice AI pipeline. It shows a User interacting with a Voice Gateway-Orchestrator that manages data flow between an ASR NIM, LLM NIM, and TTS NIM. The system includes Redis for session context and a monitoring namespace with Prometheus and Grafana.
Figura 3: Flujo de trabajo de voz a voz AI

Para validar estas estrategias en un escenario de producción realista, utilizamos un pipeline de voz a voz multimodal. Este tipo de carga de trabajo es ideal para realizar pruebas, ya que mezcla tres patrones de tráfico distintos.

Resultados

Se probaron dos patrones de tráfico distintos:

  • Carga ligera: 5 usuarios concurrentes simulando ~135 segundos de interacción sostenida.
  • Carga pesada: 50 usuarios concurrentes simulando ~375 segundos de interacción sostenida.
A bar chart comparing GenAI inference throughput in requests per second per GPU across light and heavy loads. Under heavy load, Experiment 3 (MIG) achieves the highest efficiency at 1.00 Req/Sec, compared to 0.74 for the Baseline and 0.76 for Time-Slicing.
Figura 5. Comparación de rendimiento

La figura 5 compara el rendimiento de inferencia de IA generativa en diferentes patrones de tráfico. Se observa cómo la partición afecta la cantidad de solicitudes a medida que aumenta la concurrencia, mostrando que la estrategia MIG logra la mayor eficiencia.

Recomendaciones para la partición

Con base en los datos de referencia, se recomienda:

  1. Usar MIG para producción y estabilidad.
  2. Utilizar la división por tiempo para aplicaciones de desarrollo o de baja concurrencia.

Comienza

  1. Experimenta más con el repositorio.
  2. Implementa la partición siguiendo nuestra Guía de Implementación.
  3. Escala con NIM: Despliega pipelines de NVIDIA NIM.
Ilustración de un hombre mayor con auriculares y chaqueta