cGPU permite que varios pods compartan una sola GPU física en clústeres ACK Pro. Esto se logra al aislar tanto la memoria como la potencia de cómputo de la GPU a nivel de software, lo que permite que múltiples cargas de trabajo compartan de forma segura una misma GPU bajo límites estrictos de memoria y procesamiento.
Requisitos previos
Antes de empezar, asegúrese de cumplir con lo siguiente:
Un clúster ACK Pro que ejecute Kubernetes 1.20 o posterior. Para obtener más información, consulte Create an ACK managed cluster.
-
Una versión de kube-scheduler compatible con la versión de su clúster. Para consultar la lista completa de funciones admitidas por cada versión de kube-scheduler, revise kube-scheduler.
ACK cluster version
Scheduler version
1.30 o posterior
Se admiten todas las versiones del programador.
1.28
1.28.1-aliyun-5.6-998282b9 o posterior
1.26
v1.26.3-aliyun-4.1-a520c096 o posterior
1.24
1.24.3-ack-2.0 o posterior
1.22
1.22.15-ack-2.0 o posterior
1.20
1.20.4-ack-8.0 o posterior
El complemento para compartir GPU instalado con una versión de gráfico de Helm superior a la 1.2.0. Para más detalles, consulte Manage the GPU sharing component.
cGPU 1.0.5 o posterior instalado. Para más información, consulte Update the cGPU version on a node.
Límites
No se admite la mezcla de tipos de trabajos en el mismo nodo. El uso compartido de GPU admite dos tipos de tareas: aquellas que solo solicitan memoria de GPU y aquellas que requieren tanto memoria como potencia de cómputo.
Los valores de potencia de cómputo deben ser múltiplos de 5, con un mínimo de 5. La escala va de 0 a 100, donde 100 representa el 100 % de la potencia de cómputo de una GPU. Por ejemplo, un valor de 20 indica que el pod utiliza el 20 % de dicha capacidad. Si el valor especificado no es múltiplo de 5, no se podrá enviar el trabajo.
La asignación de potencia de cómputo no se admite mediante el etiquetado directo de nodos. Para habilitar el aislamiento de potencia de cómputo en nodos acelerados por GPU existentes, primero debe eliminarlos del clúster y luego agregarlos a un node pool que admita dicho aislamiento. Ejecutar
kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_memdirectamente sobre los nodos actuales no funciona.-
Disponibilidad limitada por región. La asignación de potencia de cómputo solo está disponible en las siguientes regiones. Asegúrese de que la región de su clúster coincida con alguna de ellas:
Region
Region ID
China (Beijing)
cn-beijing
China (Shanghai)
cn-shanghai
China (Hangzhou)
cn-hangzhou
China (Zhangjiakou)
cn-zhangjiakou
China (Shenzhen)
cn-shenzhen
China (Chengdu)
cn-chengdu
China (Heyuan)
cn-heyuan
China (Hong Kong)
cn-hongkong
Indonesia (Jakarta)
ap-southeast-5
Singapore
ap-southeast-1
Thailand (Bangkok)
ap-southeast-7
US (Virginia)
us-east-1
US (Silicon Valley)
us-west-1
Japan (Tokyo)
ap-northeast-1
China East 2 Finance
cn-shanghai-finance-1
-
Los clústeres creados antes del 1 de marzo de 2022 requieren una actualización manual del programador. Los clústeres creados a partir de esa fecha utilizan automáticamente la versión del programador que admite la asignación de potencia de cómputo. Para los clústeres anteriores, siga estos pasos:
Submit a ticket para solicitar acceso a la vista previa privada de la programación de GPU compartida.
-
Si el complemento instalado para compartir GPU solo admite el uso compartido de memoria (versión de gráfico de Helm 1.2.0 o anterior), desinstálelo:
Inicie sesión en la ACK console. En el panel de navegación izquierdo, haga clic en Clusters.
Haga clic en el nombre del clúster. En el panel de navegación izquierdo, elija Applications > Helm.
En la página Helm, busque ack-ai-installer y haga clic en Delete dentro de la columna Actions. En el cuadro de diálogo Delete, haga clic en OK.
Instale la versión más reciente del complemento para compartir GPU. Para más información, consulte Manage the GPU sharing component.
Paso 1: Crear un node pool con asignación de potencia de cómputo
Inicie sesión en la ACK console. En el panel de navegación izquierdo, haga clic en Clusters.
Haga clic en el nombre del clúster. En el panel de navegación izquierdo, elija Nodes > Node Pools.
En la página Node Pools, haga clic en Create Node Pool.
-
Configure el node pool con los siguientes parámetros. Para el resto de las opciones, consulte Create and manage a node pool. En la sección Node Labels, agregue estas dos etiquetas:
Parameter
Description
Node Pool Name
Nombre del node pool. Este tema utiliza
gpu-corecomo ejemplo.Expected Nodes
Número inicial de nodos. Establezca este valor en
0si no desea crear nodos de inmediato.Node Labels
Etiquetas que se añadirán a los nodos. Configure las dos etiquetas siguientes. Para más información, consulte Labels for enabling GPU scheduling policies.
Key
Value
Purpose
ack.node.gpu.schedulecore_memHabilita tanto el aislamiento de memoria como el de potencia de cómputo de la GPU en el nodo.
ack.node.gpu.placementbinpackUtiliza el algoritmo binpack para consolidar los pods en la menor cantidad de GPUs posible, maximizando así su utilización.
Paso 2: Comprobar que los nodos del node pool tienen habilitada la asignación de potencia de cómputo
Ejecute el siguiente comando para verificar si la asignación de potencia de cómputo está habilitada en un nodo:
kubectl get nodes <NODE_NAME> -o yaml
Busque el campo aliyun.com/gpu-core.percentage en las secciones allocatable y capacity de la salida. Su presencia confirma que la asignación de potencia de cómputo se encuentra activa.
Salida esperada para un nodo con 4 GPUs (cada una con 15 GiB de memoria):
# Irrelevant fields are omitted.
status:
allocatable:
# 4 GPUs x 100% = 400 total computing power units
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
# 4 GPUs x 15 GiB = 60 GiB total GPU memory
aliyun.com/gpu-mem: "60"
capacity:
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
aliyun.com/gpu-mem: "60"
Paso 3: Desplegar una carga de trabajo con límites de potencia de cómputo
Sin la asignación de potencia de cómputo, un pod puede utilizar el 100 % de la capacidad de procesamiento de una GPU y todos sus 15 GiB de memoria. Al habilitar esta función, usted establece límites explícitos para ambos recursos.
El siguiente ejemplo despliega un trabajo que solicita 2 GiB de memoria de GPU y el 30 % de su potencia de cómputo.
-
Cree un archivo llamado
cuda-sample.yamlcon el siguiente contenido:apiVersion: batch/v1 kind: Job metadata: name: cuda-sample spec: parallelism: 1 template: metadata: labels: app: cuda-sample spec: containers: - name: cuda-sample image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 2 # GPU memory in GiB aliyun.com/gpu-core.percentage: 30 # Percentage of GPU computing power; must be a multiple of 5 workingDir: /root restartPolicy: NeverParámetros clave de recursos:
Parameter
Value
Description
aliyun.com/gpu-mem2Memoria de GPU en GiB. El pod puede usar hasta 2 GiB.
aliyun.com/gpu-core.percentage30Porcentaje de potencia de cómputo de la GPU. Debe ser múltiplo de 5; 30 equivale al 30 %.
-
Despliegue el trabajo:
kubectl apply -f /tmp/cuda-sample.yamlLa imagen es grande, por lo que la descarga inicial puede tardar varios minutos.
-
Compruebe que el trabajo se esté ejecutando:
kubectl get po -l app=cuda-sampleSalida esperada:
NAME READY STATUS RESTARTS AGE cuda-sample-m**** 1/1 Running 0 15sEl estado
Runningen la columnaSTATUSconfirma que el pod está activo. -
Revise la memoria de GPU y la potencia de cómputo que utiliza el pod:
kubectl exec -ti cuda-sample-m**** -- nvidia-smiSalida esperada:
Fri May 23 07:23:13 2025 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.161.07 Driver Version: 535.161.07 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 Tesla T4 On | 00000000:00:08.0 Off | 0 | | N/A 50C P0 36W / 70W | 2038MiB / 2048MiB | 30% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| +---------------------------------------------------------------------------------------+La salida confirma que se aplica el aislamiento:
Memoria de GPU: El pod tiene un límite de 2,048 MiB (aproximadamente 2 GiB), en lugar de los 15 GiB completos disponibles antes de habilitar la función. El uso actual es de 2,038 MiB.
Potencia de cómputo: El pod está limitado al 30 % (
GPU-Util: 30%), en lugar del 100 %.
nvidia-smireporta la utilización de potencia de cómputo por GPU, no por pod. Si n pods solicitan cada uno un 30 % y n no es mayor que 3, todos los pods se programarán en la misma GPU y la salida mostrará una utilización de n x 30 %. -
Revise los registros del pod para observar el comportamiento de limitación:
kubectl logs cuda-sample-m**** -fSalida esperada:
Generating training model Initializing graph Running warm up Done warm up Time Step Img/sec total_loss 2025-05-23 07:17 1 images/sec: 16.9 +/- 0.0 (jitter = 0.0) 7.670 2025-05-23 07:17 10 images/sec: 17.0 +/- 0.2 (jitter = 0.5) 7.947 2025-05-23 07:17 20 images/sec: 17.1 +/- 0.1 (jitter = 0.4) 8.113 2025-05-23 07:17 30 images/sec: 17.1 +/- 0.1 (jitter = 0.6) 7.214 2025-05-23 07:18 40 images/sec: 17.1 +/- 0.1 (jitter = 0.7) 7.878 2025-05-23 07:18 50 images/sec: 17.2 +/- 0.1 (jitter = 0.7) 8.056 2025-05-23 07:18 60 images/sec: 17.2 +/- 0.1 (jitter = 0.7) 7.990 2025-05-23 07:18 70 images/sec: 17.2 +/- 0.1 (jitter = 0.7) 7.892 2025-05-23 07:18 80 images/sec: 17.2 +/- 0.1 (jitter = 0.7) 7.133 2025-05-23 07:18 90 images/sec: 17.2 +/- 0.1 (jitter = 0.6) 7.789Las entradas del registro aparecen a una tasa menor que en un pod sin restricciones de potencia de cómputo. Esto confirma que el límite del 30 % está vigente (limitado aproximadamente al 30 % de la capacidad de la GPU).
-
(Opcional) Elimine el trabajo después de la verificación:
kubectl delete job cuda-sample