En entornos de producción basados en 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 texto a voz (TTS) pueden requerir solo 10 GB de VRAM, pero utilizan una GPU completa en implementaciones estándar de Kubernetes. Esto se debe a que el programador asigna un modelo a una o más GPU y no puede compartir fácilmente entre ellas, lo que resulta en la subutilización de recursos computacionales costosos.
Resolver este problema no solo se trata de reducir costos; implica optimizar la densidad del clúster para atender a más usuarios concurrentes utilizando el mismo hardware de alto rendimiento. Esta guía detalla cómo implementar y evaluar estrategias de particionamiento de GPU, específicamente NVIDIA Multi-Instance GPU (MIG) y el uso de time-slicing para maximizar el uso de los recursos computacionales.
Abordando la fragmentación de recursos de GPU
Por defecto, el plugin 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 computación dedicada para mantener un bajo tiempo de primer token (TTFT) y alta capacidad de procesamiento 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 la capacidad de la GPU. Ejecutar estos modelos ligeros en GPU dedicadas resulta en:
- Baja utilización: la utilización de la GPU suele estar entre el 0 y el 10%.
- Creación de clústeres innecesarios: se necesitan más nodos para ejecutar el mismo número de pods.
- Fricción en la escalabilidad: agregar una nueva capacidad requiere una nueva GPU física.
Para solucionar esto, debemos romper la relación 1:1 entre pods y GPUs.
Arquitectura: Estrategias de particionamiento
Evaluamos dos estrategias principales para el particionamiento de GPU, apoyadas por el operador NVIDIA GPU.
Particionamiento basado en software: Time-slicing y MPS
El time-slicing permite que múltiples procesos NVIDIA CUDA compartan una GPU intercalando la ejecución. Funciona de manera similar a un programador de CPU: el contexto A se ejecuta, se pausa y luego se ejecuta el contexto B.
- Mecanismo: programación a nivel de software a través del controlador CUDA.
- Ventajas: maximiza la utilización. Permite el “bursting”: si el Pod A está inactivo, el Pod B puede utilizar el 100% de los núcleos computacionales de la GPU.
- Desventajas: no hay aislamiento de hardware. Un desbordamiento de memoria en un pod puede afectar el contexto de ejecución compartido, y un cálculo intensivo en un pod puede limitar a los vecinos (el efecto del “vecino ruidoso”).
Además del time-slicing, el Servicio de Múltiples Procesos de NVIDIA (MPS) ofrece un enfoque alternativo basado en software. MPS permite que múltiples procesos compartan recursos de GPU simultáneamente utilizando una arquitectura cliente-servidor. Esto proporciona más flexibilidad que MIG y es más resistente a ciertos problemas como fugas de memoria en comparación con el time-slicing estándar.


