Alibaba Cloud Container Compute Service (ACS) admite el uso de GPU compartida en nodos GPU-HPN. Esta función permite ejecutar varios pods en un solo dispositivo GPU. En lugar de dedicar una GPU completa a cada carga de trabajo, los pods solicitan fracciones de recursos de GPU, como un porcentaje de la potencia de cómputo y de la memoria. El uso de GPU compartida también admite solicitudes y límites de recursos flexibles para cubrir diversos requisitos de aislamiento y uso compartido.
El uso de GPU compartida está disponible únicamente en clústeres de ACS. Esta función se encuentra en versión preliminar pública en las regiones Ulanqab y Shanghai Finance Cloud. Para utilizarla en otras regiones, envíe un ticket.
Límites
Tenga en cuenta las siguientes restricciones:
El uso de GPU compartida proporciona una asignación detallada de recursos dentro de una sola GPU. No admite solicitudes agregadas entre varias GPU; por ejemplo, solicitar 0.5 de la potencia de cómputo de dos GPU distintas al mismo tiempo.
El módulo de GPU compartida gestiona la versión del controlador para todos los pods que utilizan esta función. No es posible especificar una versión de controlador para un pod individual.
Cada pod puede tener como máximo un contenedor que utilice recursos de GPU compartida (generalmente el contenedor principal). Los contenedores sidecar solo pueden solicitar CPU y memoria.
Un contenedor no puede solicitar simultáneamente recursos de GPU exclusivos (
nvidia.com/gpu) y recursos de GPU compartida (alibabacloud.com/gpu-core.percentage,alibabacloud.com/gpu-memory.percentage).
Funcionamiento
Los pods no acceden directamente a un dispositivo GPU. En su lugar, interactúan con él mediante el módulo de GPU compartida, el cual consta de dos componentes:
Módulo proxy: se integra de forma predeterminada en el pod. Intercepta las llamadas a la API relacionadas con el dispositivo GPU y las reenvía al módulo de gestión de recursos.
Módulo de gestión de recursos: ejecuta las instrucciones de GPU en el dispositivo físico y aplica los límites de recursos según la descripción de recursos del pod.
Cuando se habilita el uso de GPU compartida, el módulo de gestión de recursos reserva automáticamente cierta cantidad de CPU y memoria en el nodo. Para conocer los detalles sobre las cantidades reservadas, consulte Node configuration.
Estados de los pods y QoS
De manera similar a la gestión de procesos del sistema operativo, el módulo de GPU compartida asigna a cada pod uno de tres estados:
Hibernación: el pod no demanda recursos de GPU (estado inicial cuando se inicia un pod).
Listo: el pod espera a que se le asignen recursos de GPU.
Running: el pod utiliza activamente recursos de GPU.
Cuando varios pods compiten por recursos de GPU al mismo tiempo, el módulo de GPU compartida utiliza políticas de calidad de servicio (QoS), como colas y apropiación previa, para gestionar la asignación.
Política de colas (solo modelo share-pool)
Los pods en estado listo se colocan en una cola bajo el esquema First In, First Out (FIFO). El pod que entró primero al estado listo recibe los recursos antes. Si los recursos son insuficientes, se activa la política de apropiación previa.
Política de apropiación previa (solo modelo share-pool)
Cuando un pod en la cola de listos no obtiene recursos, el módulo de GPU compartida intenta apropiar previamente un pod en ejecución con base en los siguientes criterios:
|
Policy |
Description |
|
Filtro |
Un pod en ejecución es candidato a la apropiación previa solo si ha ocupado recursos de GPU de forma continua durante más tiempo que |
|
Puntuación |
Entre los pods candidatos, se apropian primero aquellos que han mantenido los recursos de GPU por más tiempo. |
Si ningún pod en ejecución cumple la condición de filtro, el pod en la cola continúa esperando.
Elija un modelo de uso compartido
ACS admite dos modelos de uso compartido. La diferencia principal radica en si al pod se le asigna un dispositivo GPU fijo o si puede usar cualquier GPU disponible en el nodo:
Utilice share-pool cuando las cargas de trabajo presenten picos o sean intermitentes (como las sesiones de Notebook). Los pods comparten recursos de un pool común de GPU, mientras que los mecanismos de QoS (colas y apropiación previa) gestionan la contención.
Utilice static cuando las cargas de trabajo requieran acceso garantizado e ininterrumpido a la GPU, sin colas. Cada pod queda fijado a un dispositivo GPU específico.
|
Model |
GPU assignment |
|
Queuing |
Preemption |
Best for |
|
share-pool |
Cualquier GPU con recursos inactivos en el nodo |
|
FIFO |
Configurable |
Desarrollo en Notebook, cargas de trabajo multiusuario fuera de horario pico |
|
static |
Dispositivo GPU fijo, no cambia durante la ejecución |
|
No compatible |
No compatible |
Aplicaciones de IA a pequeña escala que requieren acceso garantizado a la GPU sin colas |
Para el modelo static, establezca siempre requests == limits tanto para la potencia de cómputo como para la memoria de la GPU. Si requests < limits, se produce contención de recursos entre los pods que comparten la misma GPU, lo cual puede provocar que los pods finalicen por un error de falta de memoria (OOM).
Ejemplo: uso compartido de recursos fuera de horario pico en escenarios de Notebook
En el desarrollo con Notebook, las cargas de trabajo normalmente no mantienen recursos de GPU de forma continua. Con el modelo share-pool, los pods usan recursos de GPU solo cuando los necesitan, y el mecanismo de QoS gestiona el acceso cuando varios pods solicitan recursos al mismo tiempo.
Considere cuatro pods en un nodo con dos GPU:
Pods A y B:
requests=0.5,limits=0.5Pods C y D:
requests=0.5,limits=1
Con base en requests, los cuatro pods caben en el nodo.
Tiempo T1: los pods A y C se están ejecutando. Los pods B y D están en la cola de listos. El módulo de GPU compartida intenta asignar recursos al pod D (el primero en la cola). La GPU 0 tiene 0.5 de GPU inactiva, lo cual satisface requests=0.5 del pod D. Sin embargo, limits=1 del pod D provocaría contención de recursos con el pod A en la misma GPU, por lo que el pod D permanece en la cola.
Tiempo T2 – Fase 1: el pod C termina y entra en hibernación. La GPU 1 queda libre y sus recursos se asignan al pod D.
Tiempo T2 – Fase 2: se asignan recursos al pod B en la GPU 0. El pod B tiene limits=0.5, por lo que puede compartir la GPU 0 con el pod A sin generar contención de recursos.
Habilite el uso de GPU compartida en un nodo
A continuación se muestra cómo habilitar el modelo share-pool, desplegar un pod con recursos fraccionados de GPU, comprobar la configuración y, de forma opcional, deshabilitar la función.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un clúster de ACS con nodos GPU-HPN.
kubectlconfigurado para conectarse al clúster.Elimine todos los pods del nodo de destino que soliciten recursos de GPU exclusivos. No es necesario eliminar los pods que solo usen CPU y memoria.
Paso 1: Etiquete el nodo GPU-HPN
Enumere los nodos GPU-HPN del clúster:
kubectl get node -l alibabacloud.com/node-type=reserved
Salida esperada:
NAME STATUS ROLES AGE VERSION
cn-wulanchabu-c.cr-xxx Ready agent 59d v1.28.3-aliyun
Agregue la etiqueta alibabacloud.com/gpu-share-policy=share-pool para habilitar el uso de GPU compartida:
kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=share-pool
Paso 2: Compruebe el estado del nodo
Después de aplicar la etiqueta, compruebe que la función esté activa en el nodo:
kubectl get node cn-wulanchabu-c.cr-xxx -o yaml
Salida esperada (fragmento):
# The actual output may vary.
apiVersion: v1
kind: Node
spec:
# ...
status:
allocatable:
# GPU shared resource description
alibabacloud.com/gpu-core.percentage: "1600"
alibabacloud.com/gpu-memory.percentage: "1600"
# CPU, memory, and storage reserved for the GPU sharing module
cpu: "144"
memory: 1640Gi
nvidia.com/gpu: "16"
ephemeral-storage: 4608Gi
capacity:
# GPU shared resource description
alibabacloud.com/gpu-core.percentage: "1600"
alibabacloud.com/gpu-memory.percentage: "1600"
cpu: "176"
memory: 1800Gi
nvidia.com/gpu: "16"
ephemeral-storage: 6Ti
conditions:
# Indicates whether the GPU share policy configuration is valid
- lastHeartbeatTime: "2025-01-07T04:13:04Z"
lastTransitionTime: "2025-01-07T04:13:04Z"
message: gpu share policy is valid.
reason: Valied
status: "True"
type: GPUSharePolicyValid
# Indicates the GPU share policy in effect on this node
- lastHeartbeatTime: "2025-01-07T04:13:04Z"
lastTransitionTime: "2025-01-07T04:13:04Z"
message: gpu share policy is share-pool.
reason: share-pool
status: "True"
type: GPUSharePolicy
Compruebe los siguientes elementos en la salida para confirmar que la función está activa:
allocatableycapacityincluyenalibabacloud.com/gpu-core.percentageyalibabacloud.com/gpu-memory.percentage.La condición
GPUSharePolicyValidtienestatus: "True".La condición
GPUSharePolicytienereason: share-pool.
Si los recursos del nodo no se actualizan como se describe, la configuración presentó errores. Revise los campos reason y message de la condición GPUSharePolicyValid para obtener más detalles. Consulte Condiciones del nodo para conocer los valores de motivo.
Paso 3: Despliegue un pod con recursos de GPU compartida
Cree un archivo llamado gpu-share-demo.yaml. Establezca el modelo de GPU compartida en share-pool para que coincida con la configuración del nodo:
apiVersion: v1
kind: Pod
metadata:
labels:
alibabacloud.com/compute-class: "gpu-hpn"
# Set the GPU sharing model to share-pool, matching the node configuration
alibabacloud.com/gpu-share-policy: "share-pool"
name: gpu-share-demo
namespace: default
spec:
containers:
- name: demo
image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
args:
- '1000h'
command:
- sleep
resources:
limits:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 100 # Upper limit of computing power usage
alibabacloud.com/gpu-memory.percentage: 100 # Upper limit of GPU memory usage; exceeding this causes a CUDA OOM error
requests:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 10 # Controls how many pods can be scheduled on the node
alibabacloud.com/gpu-memory.percentage: 10 # Controls how many pods can be scheduled on the node
Despliegue el pod:
kubectl apply -f gpu-share-demo.yaml
Paso 4: Compruebe el uso de recursos de GPU
Inicie sesión en el contenedor para comprobar el uso de recursos de GPU:
kubectl exec -it gpu-share-demo -- /bin/bash
Dentro del contenedor, ejecute nvidia-smi para consultar la asignación y el uso de recursos de GPU. El comando aplicable depende del tipo de tarjeta GPU; nvidia-smi corresponde a dispositivos GPU de NVIDIA. Para otros tipos de tarjetas, envíe un ticket para recibir asistencia.
En los pods con modelo share-pool, el campo BusID en la salida de nvidia-smi muestra Pending cuando el pod no utiliza activamente recursos de GPU. Este comportamiento es normal y no representa un error.
Paso 5 (opcional): Deshabilite el uso de GPU compartida en el nodo
Antes de deshabilitar el uso de GPU compartida, elimine todos los pods del nodo que utilicen recursos de GPU compartida. No es necesario eliminar los pods que solo usen CPU y memoria.
-
Elimine el pod:
kubectl delete pod gpu-share-demo -
Establezca la política de GPU compartida en
none:kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=none -
Compruebe el estado del nodo:
allocatableycapacityya no incluyenalibabacloud.com/gpu-core.percentagenialibabacloud.com/gpu-memory.percentage.La condición
GPUSharePolicytienestatus: "False"yreason: none.Los valores de CPU y memoria en
allocatablese restauran a sus valores originales.
kubectl get node cn-wulanchabu-c.cr-xxx -o yamlSalida esperada (fragmento):
apiVersion: v1 kind: Node spec: # ... status: allocatable: # Reserved CPU and memory are restored after the feature is disabled cpu: "176" memory: 1800Gi nvidia.com/gpu: "16" ephemeral-storage: 4608Gi capacity: cpu: "176" memory: 1800Gi nvidia.com/gpu: "16" ephemeral-storage: 6Ti conditions: - lastHeartbeatTime: "2025-01-07T04:13:04Z" lastTransitionTime: "2025-01-07T04:13:04Z" message: gpu share policy config is valid. reason: Valid status: "True" type: GPUSharePolicyValid - lastHeartbeatTime: "2025-01-07T04:13:04Z" lastTransitionTime: "2025-01-07T04:13:04Z" message: gpu share policy is none. reason: none status: "False" type: GPUSharePolicy
Configuración del nodo
Etiqueta de habilitación
Establezca la etiqueta alibabacloud.com/gpu-share-policy en un nodo para habilitar o deshabilitar el uso de GPU compartida.
apiVersion: v1
kind: Node
metadata:
labels:
alibabacloud.com/gpu-share-policy: share-pool # or: static, none
|
Value |
Description |
|
|
Deshabilita el uso de GPU compartida en el nodo. |
|
|
Trata todas las GPU del nodo como un pool compartido. Los pods no quedan fijados a un dispositivo GPU específico. |
|
|
Modo de segmentación de GPU. A cada pod se le asigna un dispositivo GPU fijo que no cambia durante la ejecución. El programador prioriza colocar los pods en la misma GPU para minimizar la fragmentación. |
Si existen pods que usan GPU exclusivas en el nodo, elimínelos antes de habilitar la política de uso compartido.
Si existen pods que usan recursos de GPU compartida en el nodo, elimínelos antes de modificar o deshabilitar la política de uso compartido.
No es necesario eliminar los pods que solo usen CPU y memoria.
Configuración de QoS
Configure los parámetros de calidad de servicio (QoS) para el uso de GPU compartida mediante la anotación de nodo alibabacloud.com/gpu-share-qos-config. Estos parámetros aplican únicamente al modelo share-pool.
apiVersion: v1
kind: Node
metadata:
annotations:
alibabacloud.com/gpu-share-qos-config: '{"preemptEnabled": true, "podMaxDurationMinutes": 120, "reservedEphemeralStorage": "1.5Ti"}'
|
Parameter |
Type |
Default |
Description |
|
|
Booleano |
|
Indica si se habilita la apropiación previa. |
|
|
Entero |
|
Un pod solo puede ser objeto de apropiación previa después de haber ocupado una GPU de forma continua durante más tiempo que este valor. Debe ser mayor que 0. Unidad: minutos. |
|
|
resource.Quantity |
|
Almacenamiento temporal local reservado por nodo. Debe ser mayor o igual que 0. Utiliza el formato de cantidad de Kubernetes, como |
Campos de recursos compartidos
Cuando se habilita el uso de GPU compartida, se agregan los siguientes campos a allocatable y capacity del nodo. Se eliminan cuando se deshabilita la función.
|
Field |
Description |
Calculation |
|
|
Potencia de cómputo de la GPU expresada como porcentaje. |
|
|
|
Memoria de la GPU expresada como porcentaje. |
|
|
|
Núcleos de CPU reservados para el módulo de GPU compartida, deducidos de |
|
|
|
Memoria reservada para el módulo de GPU compartida. |
|
|
|
Espacio en disco reservado por nodo. |
1.5 TB por nodo |
Condiciones del nodo
El campo conditions del nodo reporta dos tipos de condiciones de GPU compartida.
GPUSharePolicyValid: indica si la configuración de GPU compartida es válida:
|
Field |
Values |
Description |
|
|
|
|
|
|
|
|
|
|
— |
Mensaje legible para humanos. |
|
|
UTC |
Hora de la última actualización de la condición. |
GPUSharePolicy: la política de GPU compartida activa actualmente:
|
Field |
Values |
Description |
|
|
|
|
|
|
|
La política vigente actualmente. |
|
|
— |
Mensaje legible para humanos. |
|
|
UTC |
Hora de la última actualización de la condición. |
Configuración del pod
Para usar GPU compartida, configure las siguientes etiquetas y solicitudes de recursos en el pod.
apiVersion: v1
kind: Pod
metadata:
labels:
alibabacloud.com/compute-class: "gpu-hpn" # Only gpu-hpn is supported
alibabacloud.com/gpu-share-policy: "share-pool" # Must match the node's sharing model
name: gpu-share-demo
namespace: default
spec:
containers:
- name: demo
image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
args:
- '1000h'
command:
- sleep
resources:
limits:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 100
alibabacloud.com/gpu-memory.percentage: 100
requests:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 10
alibabacloud.com/gpu-memory.percentage: 10
Clase de cómputo
|
Label |
Value |
Description |
|
|
|
Solo se admite la clase de cómputo |
Política de GPU compartida
|
Label |
Type |
Valid values |
Description |
|
|
Cadena |
|
Especifica el modelo de GPU compartida para el pod. Solo se consideran para programación los nodos que usan el mismo modelo. |
Solicitudes de recursos
Especifique los recursos de GPU compartida en el campo resources del contenedor mediante porcentajes de la potencia de cómputo y la memoria de una sola GPU.
|
Field |
Resource |
Type |
Valid values |
Description |
|
|
|
Entero |
share-pool: [10, 100]; static: [10, 100) |
Porcentaje de la potencia de cómputo de una sola GPU que se solicita. Mínimo: 10 %. Controla cuántos pods se pueden programar en un nodo. |
|
|
|
Entero |
share-pool: [10, 100]; static: [10, 100) |
Porcentaje de la memoria de una sola GPU que se solicita. Mínimo: 10 %. |
|
|
|
Entero |
— |
Límite máximo de uso de potencia de cómputo durante la ejecución. |
|
|
|
Entero |
— |
Límite máximo de uso de memoria de GPU durante la ejecución. Superarlo provoca un error de OOM de CUDA. |
Debe especificar tanto alibabacloud.com/gpu-core.percentage como alibabacloud.com/gpu-memory.percentage en requests y en limits.
La cantidad de pods que se pueden programar en un nodo también está limitada por la CPU, la memoria y el número máximo de pods del nodo.
Preguntas frecuentes
¿Qué ocurre con un pod que espera en la cola de listos?
El pod registra periódicamente su estado de espera:
You have been waiting for ${1} seconds. Approximate position: ${2}
${1} es el número de segundos que el pod ha estado esperando. ${2} es su posición actual en la cola de listos.
¿Qué métricas de monitoreo están disponibles para los pods con GPU compartida?
Las siguientes métricas están disponibles para los pods con modelo share-pool:
|
Metric |
Description |
Example |
|
|
Estado del pod en modo de GPU compartida. Valores: |
|
|
|
Posición del pod en la cola de listos, comenzando desde 1. Solo aparece cuando |
|
¿En qué difieren las métricas de utilización de GPU para los pods con GPU compartida?
Las métricas de utilización de GPU para los pods con GPU compartida son similares a las de los pods con GPU exclusiva, con las siguientes diferencias:
Monitoreo de pods de ACS: la utilización de la potencia de cómputo de la GPU y el uso de memoria de la GPU son valores absolutos basados en toda la tarjeta GPU, igual que en los escenarios de GPU exclusiva.
Vista dentro del contenedor (por ejemplo,
nvidia-smi): el uso de memoria de la GPU es un valor absoluto, pero la utilización de la potencia de cómputo es un valor relativo cuyo denominador es ellimitdel pod.Identificadores de dispositivo: el identificador de dispositivo en las métricas corresponde al identificador real en el nodo y no siempre comienza en 0.
Modelo share-pool: el número de dispositivo en las métricas puede cambiar porque el pod puede usar distintos dispositivos GPU del pool con el paso del tiempo.
¿Cómo evito conflictos de programación cuando el uso de GPU compartida está habilitado solo en algunos nodos?
El programador predeterminado de ACS hace coincidir automáticamente los tipos de pod y de nodo para evitar conflictos.
Con un programador personalizado, un pod de GPU exclusiva podría programarse en un nodo con GPU compartida, ya que el nodo expone tanto nvidia.com/gpu como recursos de GPU compartida en su capacity. Utilice uno de estos enfoques:
Plugin del programador: escriba un plugin que lea las etiquetas y los campos Condition de los nodos de ACS para filtrar los nodos cuya política de GPU compartida no coincida. Consulte Scheduling Framework.
Etiquetas o taints: agregue una etiqueta o un taint a los nodos con GPU compartida y luego configure políticas de afinidad o tolerancia en sus pods.
¿Qué información está disponible cuando se realiza una apropiación previa sobre un pod con GPU compartida?
En los pods con modelo share-pool, la apropiación previa genera tanto un Event como una Condition en el pod.
Eventos:
# This pod's GPU resources were preempted by <new-pod-name>
Warning GPUSharePreempted 5m15s gpushare GPU is preempted by <new-pod-name>.
# This pod preempted GPU resources from <old-pod-name>
Warning GPUSharePreempt 3m47s gpushare GPU is preempted from <old-pod-name>.
Condición:
- type: Interruption.GPUShareReclaim # Condition type for GPU sharing preemption events
status: "True" # True: a preemption or preemption-by action occurred
reason: GPUSharePreempt # GPUSharePreempt: this pod preempted another pod; GPUSharePreempted: this pod was preempted
message: GPU is preempted from <old-pod-name>.
lastTransitionTime: "2025-04-22T08:12:09Z"
lastProbeTime: "2025-04-22T08:12:09Z"
¿Cómo maximizo la densidad de pods en un escenario de Notebook?
En los pods con GPU compartida, los requests de CPU y memoria también pueden establecerse por debajo de los limits para aumentar la densidad de pods en un nodo. Cuando la suma total de limits de los pods de un nodo supera los recursos allocatable del nodo, los pods compiten por CPU y memoria.
CPU: la competencia se refleja como CPU Steal Time en las métricas del pod.
Memoria: la competencia puede desencadenar un error de falta de memoria (OOM) a nivel de nodo, lo que provoca que algunos pods finalicen.
Planifique las prioridades y las especificaciones de recursos de los pods según las características de cada aplicación. Para consultar los datos de utilización de recursos a nivel de nodo, consulte ACS GPU-HPN node-level monitoring metrics.