Acerca de las estrategias de uso compartido de GPUs 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 GPUs disponible en Google Kubernetes Engine (GKE), como las GPUs multiinstancia, el tiempo compartido de GPUs y NVIDIA MPS. El uso compartido de GPUs te ayuda a minimizar la capacidad infrautilizada de tu clúster y a proporcionar a las cargas de trabajo la capacidad suficiente para completar las tareas.

Esta página está dirigida a administradores y operadores de la plataforma, así como a especialistas en datos e IA que quieran ejecutar cargas de trabajo basadas en GPUs que consuman capacidad de GPU de la forma más eficiente posible. Para obtener más información sobre los roles habituales a los que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas habituales de los usuarios de GKE.

Antes de leer esta página, asegúrate de que conoces los siguientes conceptos:

Cómo funcionan las solicitudes de GPU en Kubernetes

Kubernetes permite que las cargas de trabajo soliciten exactamente la cantidad de recursos que necesitan para funcionar. Aunque puedes solicitar unidades de CPU fraccionarias para las 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 se asigna una GPU física completa a un contenedor aunque este solo necesite una fracción de los recursos para funcionar correctamente. Este proceso es ineficiente y puede resultar caro, sobre todo si ejecutas varias cargas de trabajo con requisitos de GPU bajos similares.

Práctica recomendada:

Usa estrategias de uso compartido de GPUs para mejorar la utilización de las GPUs cuando tus cargas de trabajo no necesiten todos los recursos de GPU.

¿Qué son las estrategias de uso compartido de GPUs?

Las estrategias de uso compartido de GPU permiten que varios contenedores usen de forma eficiente las GPUs conectadas y ahorren costes de ejecución. GKE ofrece las siguientes estrategias de uso compartido de GPUs:

  • GPU con varias instancias: GKE divide una sola GPU compatible en hasta siete porciones. Cada segmento se puede asignar a un contenedor del nodo de forma independiente, con un máximo de siete contenedores por GPU. La GPU con varias instancias proporciona aislamiento de hardware entre las cargas de trabajo, así como una calidad de servicio (QoS) coherente y predecible para todos los contenedores que se ejecutan en la GPU.
  • Tiempo compartido de GPU: GKE usa la función de tiempo compartido integrada que proporcionan la GPU NVIDIA y la pila de software. Desde la arquitectura Pascal, las GPUs de NVIDIA admiten la apropiación a nivel de instrucción. Al cambiar de contexto entre procesos que se ejecutan en una GPU, la apropiación a nivel de instrucción asegura que cada proceso obtenga un tiempo de ejecución justo. El tiempo compartido de la GPU proporciona aislamiento a nivel de software entre las cargas de trabajo en términos de aislamiento del espacio de direcciones, aislamiento del rendimiento y aislamiento de errores.
  • MPS de NVIDIA: GKE usa el servicio multiproceso (MPS) de NVIDIA. NVIDIA MPS es una implementación alternativa y compatible con binarios de la API de CUDA diseñada para permitir de forma transparente que las cargas de trabajo de CUDA multiproceso cooperativas se ejecuten simultáneamente en un único dispositivo de GPU. La GPU con MPS de NVIDIA 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 usar

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

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

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

Sin embargo, el tiempo compartido no aplica ningún límite de memoria entre los trabajos compartidos, y el cambio rápido de contexto para el acceso compartido puede introducir una sobrecarga.

MPS de NVIDIA tiene un aislamiento de recursos limitado, pero ofrece más flexibilidad en otros aspectos, como los tipos de GPU y las unidades compartidas máximas, lo que simplifica la asignación de recursos.
Adecuado para estas cargas de trabajo Se recomienda para cargas de trabajo que se ejecutan en paralelo y que necesitan cierta resiliencia y calidad del servicio. Por ejemplo, al ejecutar cargas de trabajo de inferencia de IA, la GPU con varias instancias permite que se ejecuten varias consultas de inferencia simultáneamente para obtener respuestas rápidas sin que se ralenticen entre sí.

Recomendada para cargas de trabajo interactivas y con picos que tienen periodos de inactividad. Estas cargas de trabajo no son rentables con una GPU totalmente dedicada. Gracias al tiempo compartido, las cargas de trabajo obtienen acceso rápido a la GPU cuando están en fases activas.

El tiempo compartido de GPU es óptimo en situaciones en las que se quiere evitar que las GPUs costosas estén inactivas y en las que no es necesario que haya un aislamiento completo ni un acceso continuo a las GPUs. Por ejemplo, cuando varios usuarios prueban o crean prototipos de cargas de trabajo.

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

Se recomienda para el procesamiento por lotes de tareas pequeñas, ya que MPS maximiza el rendimiento y el uso simultáneo de una GPU. MPS permite que los trabajos por lotes se procesen de forma eficiente en paralelo para cargas de trabajo de tamaño pequeño o mediano.

NVIDIA MPS es óptimo para procesos cooperativos que actúan como una sola aplicación. Por ejemplo, trabajos de MPI con paralelismo de rango entre MPI. Con estos trabajos, cada proceso pequeño de CUDA (normalmente, rangos de MPI) puede ejecutarse simultáneamente en la GPU para saturarla por completo.

Las cargas de trabajo que usan CUDA MPS 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 las GPUs con varias instancias. Usa Cloud Monitoring para monitorizar el rendimiento de tu uso compartido de tiempo de GPU. Para obtener más información sobre las métricas disponibles, consulta Monitorizar nodos de tiempo compartido de GPU o MPS de NVIDIA. Usa Cloud Monitoring para monitorizar el rendimiento de tu MPS de NVIDIA. Para obtener más información sobre las métricas disponibles, consulta Monitorizar nodos de tiempo compartido de GPU o MPS de NVIDIA.
Solicitar GPUs compartidas en cargas de trabajo Ejecutar GPUs con varias instancias Ejecutar GPUs con tiempo compartido Ejecutar GPUs con MPS de NVIDIA
Práctica recomendada:

Para maximizar el uso de la GPU, combina estrategias de uso compartido de GPU. Para cada partición de GPU de varias instancias, usa el tiempo compartido o NVIDIA MPS. Después, puedes ejecutar varios contenedores en cada partición, y esos contenedores compartirán el acceso a los recursos de esa partición. Te recomendamos que uses cualquiera de las siguientes combinaciones:

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

Cómo funcionan las estrategias de uso compartido de GPUs

Puedes especificar el número máximo de contenedores que pueden compartir una GPU física:

  • En los clústeres Autopilot, esto se configura en la especificación de la carga de trabajo.
  • En los clústeres estándar, esta opción se configura al crear un grupo de nodos con GPUs conectadas. Todas las GPUs del grupo de nodos se comparten en función de la configuración que especifiques a nivel del grupo de nodos.

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

GPU con varias instancias

Puedes solicitar GPUs con varias instancias en cargas de trabajo especificando la etiqueta cloud.google.com/gke-gpu-partition-size en el campo nodeSelector de las especificaciones del pod, en spec: nodeSelector.

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

Uso compartido de la GPU o MPS de NVIDIA

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

  • cloud.google.com/gke-max-shared-clients-per-gpu: selecciona los nodos que permiten que un número específico de clientes compartan la GPU subyacente.
  • cloud.google.com/gke-gpu-sharing-strategy: selecciona los nodos que usan la estrategia de tiempo compartido o MPS de NVIDIA para las GPUs.

En la siguiente tabla se describe cómo cambia el comportamiento de la programación en función de la combinación de etiquetas de nodo que especifiques en tus manifiestos.

Etiquetas de nodo
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 autoescalado y el aprovisionamiento automático de nodos para crear nodos o grupos de nodos que coincidan con ambas etiquetas.

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

Autopilot: GKE rechaza la carga de trabajo.

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

  • Tiempo compartido de GPU: cloud.google.com/gke-gpu-sharing-strategy=TIME_SHARING
  • MPS de NVIDIA: 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 compartidos 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, la herramienta de adaptación dinámica del clúster aumenta el tamaño del grupo de nodos con el valor más bajo de cloud.google.com/gke-max-shared-clients-per-gpu.
  • Si todos los grupos de nodos han alcanzado su capacidad, el aprovisionamiento automático de nodos crea un grupo de nodos con el valor predeterminado cloud.google.com/gke-max-shared-clients-per-gpu=2.

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

Si desarrollas aplicaciones de GPU que se ejecutan en GPU de tiempo compartido o NVIDIA MPS, solo puedes solicitar una GPU por contenedor. GKE rechaza una solicitud de más de una GPU en un contenedor para evitar comportamientos inesperados. Además, el número de GPUs solicitadas con el tiempo compartido y NVIDIA MPS no es una medida de la potencia de cálculo disponible para el contenedor.

En la siguiente tabla se muestra lo que puedes esperar cuando solicitas cantidades específicas de GPUs.

Solicitudes de GPU que se aplican al uso compartido de tiempo de GPU y a NVIDIA MPS
Una GPU con tiempo compartido o NVIDIA MPS por contenedor GKE permite la solicitud, aunque el nodo tenga una o varias GPUs físicas.
Más de una GPU compartida por contenedor

GKE rechaza la solicitud.

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

Más de un MPS de NVIDIA por contenedor

En función del número de GPUs físicas del 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 con varias instancias en un contenedor, ya que cada instancia de GPU se considera una GPU física independiente.

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

Monitorizar nodos de tiempo compartido de GPU o MPS de NVIDIA

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

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

  • Ciclo de actividad (node/accelerator/duty_cycle): porcentaje del tiempo del último periodo de muestreo (10 segundos) durante el cual el nodo de GPU ha estado procesando activamente. El intervalo va del 1% al 100%.
  • Uso de memoria (node/accelerator/memory_used): cantidad de memoria del acelerador asignada en bytes a cada nodo de GPU.
  • Capacidad de memoria (node/accelerator/memory_total): memoria total del acelerador en bytes de cada nodo de GPU.

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

Siguientes pasos