La programación compartida de GPU utiliza NVIDIA MPS (Multi-Process Service) como módulo subyacente de aislamiento de GPU, lo que permite que varios pods compartan una misma GPU con aislamiento de memoria. Este tema describe cómo habilitar MPS e integrarlo con el componente de programación compartida de GPU en clústeres de ACK.
Contexto
MPI (Message Passing Interface) paraleliza los núcleos de CPU en distintas tareas de cómputo, pero los procesos MPI acelerados por CUDA suelen subutilizar la GPU. NVIDIA MPS (Multi-Process Service) permite que varias aplicaciones CUDA compartan una sola GPU, lo que mejora la utilización y el throughput en escenarios multiusuario o con muchas tareas pequeñas.
MPS emplea una arquitectura cliente-servidor con compatibilidad binaria, por lo que no requiere cambios importantes en las aplicaciones CUDA existentes. Consta de tres componentes:
Proceso daemon de control: gestiona el ciclo de vida del servidor MPS y las conexiones de los clientes.
Runtime del cliente: integrado en la biblioteca del controlador de CUDA. Gestiona la comunicación entre las aplicaciones y el servidor MPS, lo que permite compartir la GPU sin modificar significativamente el código.
Proceso del servidor: programa las solicitudes de múltiples clientes en una sola GPU para permitir la concurrencia.
Notas de uso
Los clientes MPS (aplicaciones de GPU que usan MPS) deben mantenerse conectados al daemon de control de MPS. Si el daemon se reinicia, los clientes finalizan con errores.
-
El daemon de control de MPS se ejecuta como un contenedor desplegado mediante un DaemonSet (un pod por nodo con GPU):
No elimine ni reinicie el pod del daemon de control de MPS, ya que las aplicaciones de GPU en ese nodo dejarán de estar disponibles. Compruebe el estado del pod con
kubectl get po -l app.aliyun.com/name=mps-control-daemon -A.El contenedor del daemon de control de MPS requiere permisos
privileged,hostIPCyhostPID, lo cual implica riesgos de seguridad. Evalúe cuidadosamente esta solución antes de utilizarla.El pod del daemon de control de MPS usa
priorityClassName: system-node-criticalpara evitar su finalización cuando los recursos del nodo son escasos. Durante el despliegue, puede desalojar pods de menor prioridad si los recursos son insuficientes. Asegúrese de que los nodos cuenten con suficiente CPU y memoria antes de realizar el despliegue.
-
Para los nodos con GPU administrados en clústeres de Container Service for Kubernetes (ACK), tenga en cuenta los siguientes puntos al solicitar y utilizar recursos de GPU para sus aplicaciones.
No ejecute aplicaciones que demanden mucha GPU directamente en los nodos.
No utilice herramientas como
Docker,Podmanonerdctlpara crear contenedores y solicitar recursos de GPU para ellos. Por ejemplo, no ejecute el comandodocker run --gpus allodocker run -e NVIDIA_VISIBLE_DEVICES=allpara ejecutar aplicaciones que demanden mucha GPU.No agregue la variable de entorno
NVIDIA_VISIBLE_DEVICES=alloNVIDIA_VISIBLE_DEVICES=<GPU ID>en la secciónenvdel archivo YAML del pod. No use la variable de entornoNVIDIA_VISIBLE_DEVICESpara solicitar recursos de GPU para los pods ni para ejecutar aplicaciones que demanden mucha GPU.No establezca
NVIDIA_VISIBLE_DEVICES=allni ejecute aplicaciones que demanden mucha GPU al compilar imágenes de contenedor si la variable de entornoNVIDIA_VISIBLE_DEVICESno está especificada en el archivo YAML del pod.No agregue
privileged: trueen la secciónsecurityContextdel archivo YAML del pod para ejecutar aplicaciones que demanden mucha GPU.
-
El uso de los métodos anteriores para solicitar recursos de GPU puede conllevar los siguientes riesgos potenciales:
Si utiliza alguno de los métodos anteriores para solicitar recursos de GPU en un nodo sin especificar los detalles en el registro de recursos de dispositivos del programador, la asignación real de recursos de GPU podría diferir de la registrada. En este escenario, el programador podría seguir asignando ciertos pods que solicitan recursos de GPU a dicho nodo. Como resultado, sus aplicaciones podrían competir por los recursos de la misma GPU; por ejemplo, al solicitar recursos de una GPU compartida, algunas aplicaciones podrían fallar al iniciarse debido a la insuficiencia de recursos de GPU.
El uso de los métodos anteriores también puede causar otros problemas desconocidos, como los problemas reportados por la comunidad de NVIDIA.
Requisitos previos
Un ACK managed cluster Pro edition que ejecute la versión 1.20 o posterior. Si su versión es anterior, upgrade your cluster.
Procedimiento
Paso 1: Instalar el componente daemon de control de MPS
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en .
En el Marketplace, busque ack-mps-control y haga clic en él.
En la página de ack-mps-control, haga clic en Deploy. Seleccione el Cluster objetivo y haga clic en Next.
-
En la página Create, seleccione la Chart Version y haga clic en OK.
ImportanteDesinstalar o actualizar ack-mps-control provoca que las aplicaciones de GPU en ejecución en el nodo finalicen con errores. Realice esta operación fuera del horario de mayor actividad.
La estrategia de actualización es
OnDelete: los pods no se reinician automáticamente. Después de la actualización, elimine manualmente los pods antiguos del DaemonSet ack-mps-control. Consulte How do I upgrade the MPS Control Daemon component?
Paso 2: Instalar el componente de GPU compartida
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en .
En la página Cloud-native AI Suite, haga clic en Deploy.
En la página Deploy Now de Cloud-native AI Suite, seleccione Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).
-
En la página Cloud-native AI Suite, haga clic en Deploy Cloud-native AI Suite.
Después de la instalación, localice ack-ai-installer en la lista de componentes de la página Cloud-native AI Suite.
Paso 3: Habilitar la programación compartida de GPU y el aislamiento de memoria de GPU
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en .
En la página Node Pools, haga clic en Create Node Pool.
-
En la página Create Node Pool, configure los ajustes del node pool y haga clic en Confirm.
Consulte Create and manage node pools para ver otras configuraciones.
Configuración
Descripción
Desired number of nodes
Número inicial de nodos en el node pool.
NotaDespués de crear el node pool, agréguele nodos con GPU. Al hacerlo, asegúrese de especificar un servidor en la nube con GPU como tipo de instancia. Para obtener más información, consulte Add existing nodes to a node pool o Create and manage a node pool.
Node labels
Haga clic en
para Node Label, establezca Key en ack.node.gpu.scheduley Value enmps.Importante-
Etiquete cada nodo con GPU con
ack.node.gpu.schedule=mpspara desplegar el pod del daemon de control de MPS. Si el componente de programación compartida de GPU está instalado, esta etiqueta también habilita la programación compartida de GPU y el aislamiento de MPS en el nodo. Después de agregar la etiqueta de GPU compartida, no utilice el comando
kubectl label nodespara cambiar la etiqueta de programación de GPU ni use la función de gestión de etiquetas en la página Nodes para modificar la etiqueta del nodo. Esto puede causar problemas potenciales. Para obtener más información, consulte Enable scheduling. El método recomendado se describe en Enable scheduling.
-
Paso 4: Desplegar una aplicación de ejemplo
-
Cree una aplicación de ejemplo con el siguiente archivo YAML.
apiVersion: batch/v1 kind: Job metadata: name: mps-sample spec: parallelism: 1 template: metadata: labels: app: mps-sample spec: hostIPC: true # Required. Otherwise, the pod fails to start. hostPID: true # Optional. Added here only to help you see the effect of MPS. nodeSelector: kubernetes.io/hostname: <NODE_NAME> # Replace <NODE_NAME> with the hostname of a GPU node that has the label ack.node.gpu.schedule=mps. For example: cn-shanghai.192.0.2.109. containers: - name: mps-sample image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: aliyun.com/gpu-mem: 7 # Request 7 GiB of GPU memory for this pod. workingDir: /root restartPolicy: NeverImportanteLos pods de aplicaciones de GPU en nodos con MPS habilitado deben establecer
hostIPC: true; de lo contrario, no podrán iniciarse. -
Una vez que el pod alcance el estado Running, compruebe si MPS está activo:
kubectl exec -ti mps-sample-xxxxx -- nvidia-smiSalida esperada:
Tue May 27 05:32:12 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 ****-****-**** On | 00000000:00:09.0 Off | 0 | | N/A 33C P0 55W / 300W | 345MiB / 16384MiB | 0% E. Process | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | 0 N/A N/A 14732 C nvidia-cuda-mps-server 30MiB | | 0 N/A N/A 110312 M+C python 312MiB | +---------------------------------------------------------------------------------------+La salida de
nvidia-smimuestra el procesomps-server(PID 14732) y un proceso de Python (PID 110312) ejecutándose bajo MPS, lo que confirma que MPS está activo.
Preguntas frecuentes
¿Cómo actualizo el componente daemon de control de MPS?
La actualización a ack-mps-control v0.2.0 requiere ack-ai-installer >= 1.13.1. Siga este orden:
En la página Cloud-native AI Suite, actualice la versión de Helm de ack-ai-installer.
-
En , seleccione el namespace
kube-systemy actualice ack-mps-control.La estrategia de actualización es
OnDelete: los pods no se reinician automáticamente. Después de la actualización, elimine manualmente los pods antiguos del DaemonSet ack-mps-control. -
Para cada nodo, realice Drain, márquelo como Unschedulable y elimine el pod de ack-mps-control.
Marque el nodo como Unschedulable y haga clic en Drain.
Elimine el pod de ack-mps-control en ese nodo.
Confirme que el nuevo pod se ejecute correctamente.
-
Elimine el pod de ack-ai-installer.
Después de actualizar ack-mps-control y confirmar que los pods se han actualizado, elimine el pod de ack-ai-installer. Se reconstruirá automáticamente.
-
Marque el nodo como programable.
Después de confirmar que tanto los pods de ack-mps-control como los de ack-ai-installer se ejecutan correctamente en el nodo, márquelo como programable.