Información sobre las estrategias de uso compartido de GPU en GKE


En esta página, se explican las características y los mejores tipos de cargas de trabajo para cada estrategia de uso compartido de GPU disponible en Google Kubernetes Engine (GKE), como GPU de varias instancias, uso compartido de tiempo de GPU y NVIDIA MPS.

En esta página, se da por sentado que ya conoces los conceptos de Kubernetes, como Pods, nodos, implementaciones y espacios de nombres, además de los conceptos de GKE como grupos de nodos, ajuste de escala automático y aprovisionamiento automático del nodo. También debes estar familiarizado con las implementaciones básicas de Kubernetes y GKE.

Cómo funcionan las solicitudes de GPU en Kubernetes

Kubernetes permite que las cargas de trabajo soliciten con precisión las cantidades de recursos que necesitan para funcionar. Aunque puedes solicitar unidades de CPU fraccionarias para cargas de trabajo, no puedes solicitar unidades de GPU fraccionarias. Los manifiestos de Pods deben solicitar recursos de GPU en números enteros, lo que significa que una GPU física completa se asigna a un contenedor, incluso si el contenedor solo necesita una fracción de los recursos para funcionar de forma correcta. Esto es ineficiente y puede ser costoso, en especial cuando ejecutas varias cargas de trabajo con requisitos bajos de GPU similares.

Por eso, te recomendamos que apliques estrategias de uso compartido de GPU para mejorar el uso de la GPU cuando tus cargas de trabajo no requieran todos los recursos de GPU.

¿Qué son las estrategias de uso compartido de la GPU?

Las estrategias de uso compartido de la GPU permiten que varios contenedores usen de forma eficiente tus GPU conectadas y ahorren costos de ejecución. GKE proporciona las siguientes estrategias de uso compartido de GPU:

  • GPU de varias instancias: GKE divide una sola GPU compatible en hasta siete porciones. Cada porción se puede asignar a un contenedor en el nodo de forma independiente, para un máximo de siete contenedores por GPU. La GPU de varias instancias proporciona aislamiento de hardware entre las cargas de trabajo y calidad de servicio (QoS) coherente y predecible para todos los contenedores que se ejecutan en la GPU.
  • Uso de tiempo compartido de GPU: GKE usa la capacidad de uso de tiempo compartido integrada que proporcionan la GPU de NVIDIA y la pila de software. A partir de la arquitectura Pascal, las GPU de NVIDIA admiten la interrupción del nivel de instrucción. Cuando se realiza el cambio de contexto entre procesos que se ejecutan en una GPU, la interrupción a nivel de instrucción garantiza que cada proceso obtenga un fragmento de tiempo justo. El uso compartido de tiempo de GPU proporciona aislamiento a nivel de software entre las cargas de trabajo en términos de aislamiento de espacio de direcciones, aislamiento de rendimiento y aislamiento de errores.
  • NVIDIA MPS: GKE usa el servicio de procesos múltiples (MPS) de NVIDIA. NVIDIA MPS es una implementación alternativa y compatible con el objeto binario de la API CUDA, que está diseñada para habilitar de manera transparente las cargas de trabajo CUDA de procesos múltiples cooperativos para que se ejecuten de forma simultánea en un solo dispositivo de GPU. GPU con NVIDIA MPS proporciona aislamiento a nivel de software en términos de límites de recursos (porcentaje de subprocesos activos y memoria de dispositivo fijada).

Qué estrategia de uso compartido de GPU debes usar

En la siguiente tabla, se resumen y comparan las características de las estrategias de uso compartido de GPU disponibles:

GPU de varias instancias Uso de tiempo compartido de GPU NVIDIA MPS
General Uso compartido paralelo de GPU entre contenedores Cambio rápido de contexto Uso compartido paralelo de GPU entre contenedores
Aislamiento Una sola GPU se divide en hasta siete porciones y cada contenedor de la misma GPU física tiene procesamiento, memoria y ancho de banda dedicados. Por lo tanto, un contenedor en una partición tiene una capacidad de procesamiento y una latencia predecibles, incluso cuando otros contenedores saturan a otras particiones.

Cada contenedor accede a la capacidad completa de la GPU física subyacente mediante el cambio de contexto entre los procesos que se ejecutan en una GPU.

Sin embargo, el uso de tiempo compartido no proporciona aplicación forzosa de los límites de memoria entre los trabajos compartidos y el cambio rápido de contexto para el acceso compartido puede generar sobrecargas.

NVIDIA MPS tiene un aislamiento de recursos limitado, pero obtiene más flexibilidad en otras dimensiones, por ejemplo, los tipos de GPU y la cantidad máxima de unidades compartidas, lo que simplifica la asignación de recursos.
Apto para estas cargas de trabajo Se recomienda para cargas de trabajo que se ejecutan en paralelo y que necesitan cierta resiliencia y QoS. Por ejemplo, cuando se ejecutan cargas de trabajo de inferencia de IA, la GPU de varias instancias permite que varias consultas de inferencia se ejecuten de forma simultánea para obtener respuestas rápidas, sin ralentizarse entre sí.

Se recomienda para cargas de trabajo interactivas y poco estables que tienen períodos de inactividad. Estas cargas de trabajo no son rentables con una GPU completamente dedicada. Mediante el uso de tiempo compartido, las cargas de trabajo obtienen acceso rápido a la GPU cuando están en fases activas.

El uso compartido de tiempo de GPU es óptimo para situaciones en las que se evitan GPU costosas en las que el aislamiento completo y el acceso continuo a la GPU no sean necesarios, por ejemplo, cuando varios usuarios prueban o crean prototipos de cargas de trabajo.

Las cargas de trabajo que aplican el uso compartido de tiempo deben tolerar ciertos compromisos de rendimiento y latencia.

Se recomienda para el procesamiento por lotes en trabajos pequeños porque MPS maximiza la capacidad de procesamiento y el uso simultáneo de una GPU. MPS permite que los trabajos por lotes se procesen en paralelo de forma eficiente para cargas de trabajo pequeñas y medianas.

NVIDIA MPS es óptimo para procesos cooperativos que actúan como una sola aplicación. Por ejemplo, los trabajos de la MPI con el paralelismo de clasificaciones entre las MPI. Con estos trabajos, cada proceso CUDA pequeño (por lo general, las clasificaciones de la MPI) puede ejecutarse de forma simultánea en la GPU para saturar por completo la GPU.

Las cargas de trabajo que usan MPS CUDA deben tolerar las limitaciones de protección de memoria y contención de errores.

Supervisión Las métricas de uso de GPU no están disponibles para GPU de varias instancias. Usa Cloud Monitoring para supervisar el rendimiento del uso de tiempo compartido de la GPU. Para obtener más información sobre las métricas disponibles, consulta Supervisa el uso compartido de tiempo de la GPU o los nodos de NVIDIA MPS. Usa Cloud Monitoring para supervisar el rendimiento de tu NVIDIA MPS. Para obtener más información sobre las métricas disponibles, consulta Supervisa el uso compartido de tiempo de la GPU o los nodos de NVIDIA MPS.
Solicita las GPU compartidas en cargas de trabajo Ejecuta GPU de usuarios múltiples Ejecuta GPU con uso de tiempo compartido Ejecuta GPU con NVIDIA MPS

Si deseas maximizar el uso de la GPU, puedes combinar las estrategias de uso compartido de la GPU a fin de aplicar el uso de tiempo compartido o NVIDIA MPS para cada partición de GPU de varias instancias. Luego, puedes ejecutar varios contenedores en cada partición, y esos contenedores comparten el acceso a los recursos de esa partición. Te recomendamos que uses cualquiera de las siguientes combinaciones:

  • Uso de tiempo compartido de GPU y GPU de varias instancias.
  • GPU de varias instancias y NVIDIA MPS.

Cómo funcionan las estrategias de uso compartido de la GPU

Puedes especificar la cantidad máxima de contenedores que pueden compartir una GPU física.

  • En los clústeres de Autopilot, esto se configura en la especificación de tu carga de trabajo.
  • En los clústeres estándar, esto se configura cuando creas un grupo de nodos nuevo con GPUs conectadas. Cada GPU en el grupo de nodos se comparte según la configuración que especifiques a nivel del grupo de nodos.

En las siguientes secciones, se explica el comportamiento y el funcionamiento de la programación de cada estrategia de uso compartido de la GPU.

GPU de varias instancias

Puedes solicitar una GPU de varias instancias en cargas de trabajo si especificas la etiqueta cloud.google.com/gke-gpu-partition-size en el campo nodeSelector de especificación del pod, en spec: nodeSelector.

GKE programa las cargas de trabajo en los nodos disponibles adecuados mediante la coincidencia de estas etiquetas. Si no hay nodos disponibles adecuados, GKE usa el ajuste de escala automático y el aprovisionamiento automático de nodos para crear nodos o grupos de nodos nuevos que coincidan con la etiqueta.

Uso de tiempo compartido de GPU o NVIDIA MPS

Puedes solicitar el uso de tiempo compartido de GPU o NVIDIA MPS en las cargas de trabajo si especificas las siguientes etiquetas en el campo nodeSelector de la especificación del pod, en spec:nodeSelector.

  • cloud.google.com/gke-max-shared-clients-per-gpu: Selecciona nodos que permitan que una cantidad específica de clientes comparta la GPU subyacente.
  • cloud.google.com/gke-gpu-sharing-strategy: Selecciona nodos que usen la estrategia de uso compartido de tiempo o NVIDIA MPS para las GPU.

En la siguiente tabla, se describe cómo cambia el comportamiento de la programación según la combinación de etiquetas de nodo que especifiques en los manifiestos.

Etiquetas de nodos
cloud.google.com/gke-max-shared-clients-per-gpu

y

cloud.google.com/gke-gpu-sharing-strategy

GKE programa las cargas de trabajo en los nodos disponibles que coinciden con ambas etiquetas.

Si no hay nodos disponibles, GKE usa el ajuste de escala automático y el aprovisionamiento automático de nodos para crear nodos o grupos de nodos nuevos que coincidan con ambas etiquetas.

Solo cloud.google.com/gke-max-shared-clients-per-gpu

Autopilot: GKE rechaza la carga de trabajo.

Standard: GKE programa las cargas de trabajo en los nodos disponibles que coinciden con la etiqueta. Si no hay nodos disponibles, GKE usa el ajuste de escala automático y el aprovisionamiento automático de nodos para crear nodos o grupos de nodos nuevos que coincidan con la etiqueta. De forma predeterminada, los nodos aprovisionados automáticamente reciben la siguiente etiqueta y valor para cada estrategia:

  • Uso de tiempo compartido de GPU: cloud.google.com/gke-gpu-sharing-strategy=TIME_SHARING
  • NVIDIA MPS: cloud.google.com/gke-gpu-sharing-strategy=MPS
Solo cloud.google.com/gke-gpu-sharing-strategy

Autopilot: GKE rechaza la carga de trabajo.

Estándar: GKE programa las cargas de trabajo en los nodos disponibles que usan estrategias de uso compartido específicas.

  • Si hay varios grupos de nodos de uso compartido con valores diferentes para cloud.google.com/gke-max-shared-clients-per-gpu, la carga de trabajo se puede programar en cualquier nodo disponible.
  • Si no hay nodos disponibles en ningún grupo de nodos, el escalador automático del clúster escala verticalmente el grupo de nodos con el valor más bajo para cloud.google.com/gke-max-shared-clients-per-gpu.
  • Si todos los grupos de nodos están al máximo de capacidad, el aprovisionamiento automático de nodos crea un grupo de nodos nuevo con un valor predeterminado de cloud.google.com/gke-max-shared-clients-per-gpu=2.

El proceso de solicitud de GPU que completas es el mismo para el uso compartido de tiempo de GPU y la estrategia de NVIDIA MPS.

Si estás desarrollando aplicaciones de GPU que se ejecutan en el uso compartido de tiempo de GPU o NVIDIA MPS, solo puedes solicitar una GPU para cada contenedor. GKE rechaza una solicitud de más de una GPU en un contenedor para evitar comportamientos inesperados. Además, la cantidad de GPU solicitadas con el uso compartido de tiempo y NVIDIA MPS no es una medida de la potencia de procesamiento disponible para el contenedor.

En la siguiente tabla, se muestra qué esperar cuando solicitas cantidades específicas de GPU.

Solicitudes de GPU que se aplican al uso compartido de tiempo de GPU y NVIDIA MPS
Un tiempo compartido de GPU o NVIDIA MPS por contenedor GKE permite la solicitud, incluso si el nodo tiene una GPU física o varias GPU físicas.
Más de un uso compartido de tiempo de GPU por contenedor

GKE rechaza la solicitud.

Este comportamiento es el mismo cuando se solicita más de una instancia de GPU de varias instancias en un contenedor, ya que cada instancia de GPU se considera una GPU física discreta.

Más de un MPS de NVIDIA por contenedor

Según la cantidad de GPU físicas en el nodo, GKE hace lo siguiente:

  • GKE permite la solicitud cuando el nodo solo tiene una GPU física.
  • GKE rechaza la solicitud cuando el nodo tiene varias GPUs físicas. Este comportamiento es el mismo cuando se solicita más de una instancia de GPU de varias instancias en un contenedor, ya que cada instancia de GPU se considera una GPU física discreta.

Si GKE rechaza la carga de trabajo, verás un mensaje de error similar al siguiente:

status:
  message: 'Pod Allocate failed due to rpc error: code = Unknown desc = [invalid request
    for sharing GPU (time-sharing), at most 1 nvidia.com/gpu can be requested on GPU nodes], which is unexpected'
  phase: Failed
  reason: UnexpectedAdmissionError

Supervisar el uso compartido de tiempo de la GPU o los nodos MPS de NVIDIA

Usa Cloud Monitoring para supervisar el rendimiento del uso compartido de tiempo de la GPU o de los nodos de NVIDIA MPS. GKE envía métricas para cada nodo de GPU a Cloud Monitoring. Estas métricas de uso compartido de tiempo de GPU o de nodo de NVIDIA MPS se aplican a nivel de nodo (node/accelerator/).

Puedes verificar las siguientes métricas para cada nodo de tiempo compartido de GPU o nodo de NVIDIA MPS en Cloud Monitoring:

  • Ciclo de trabajo (node/accelerator/duty_cycle): Porcentaje de tiempo en el último período de muestra (10 segundos) durante el cual el nodo de GPU estuvo procesando de forma activa. Va de 1% a 100%.
  • Uso de memoria (node/accelerator/memory_used): Cantidad de memoria del acelerador asignada en bytes para cada nodo de GPU.
  • Capacidad de memoria (node/accelerator/memory_total): Memoria total del acelerador en bytes para cada nodo de GPU.

Estas métricas son diferentes de las métricas de las GPU normales que no son nodos de tiempo compartido ni de NVIDA MPS. Las métricas para las GPU físicas normales se aplican a nivel de contenedor (container/accelerator) y no se recopilan para los contenedores programados en una GPU que usa el uso compartido de tiempo de GPU o NVIDIA MPS.

¿Qué sigue?