Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Use MPS for shared GPU scheduling and GPU memory isolation

Última actualización: Sep 04, 2026

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, hostIPC y hostPID, 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-critical para 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, Podman o nerdctl para crear contenedores y solicitar recursos de GPU para ellos. Por ejemplo, no ejecute el comando docker run --gpus all o docker run -e NVIDIA_VISIBLE_DEVICES=all para ejecutar aplicaciones que demanden mucha GPU.

    • No agregue la variable de entorno NVIDIA_VISIBLE_DEVICES=all o NVIDIA_VISIBLE_DEVICES=<GPU ID> en la sección env del archivo YAML del pod. No use la variable de entorno NVIDIA_VISIBLE_DEVICES para solicitar recursos de GPU para los pods ni para ejecutar aplicaciones que demanden mucha GPU.

    • No establezca NVIDIA_VISIBLE_DEVICES=all ni ejecute aplicaciones que demanden mucha GPU al compilar imágenes de contenedor si la variable de entorno NVIDIA_VISIBLE_DEVICES no está especificada en el archivo YAML del pod.

    • No agregue privileged: true en la sección securityContext del 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

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Marketplace > Marketplace.

  2. En el Marketplace, busque ack-mps-control y haga clic en él.

  3. En la página de ack-mps-control, haga clic en Deploy. Seleccione el Cluster objetivo y haga clic en Next.

  4. En la página Create, seleccione la Chart Version y haga clic en OK.

    Importante
    • Desinstalar 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

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Applications > Cloud-native AI Suite.

  3. En la página Cloud-native AI Suite, haga clic en Deploy.

  4. En la página Deploy Now de Cloud-native AI Suite, seleccione Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).

  5. 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

  1. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Nodes > Node Pools.

  2. En la página Node Pools, haga clic en Create Node Pool.

  3. 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.

    Nota

    Despué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 Node Label para Node Label, establezca Key en ack.node.gpu.schedule y Value en mps.

    Importante
    • Etiquete cada nodo con GPU con ack.node.gpu.schedule=mps para 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 nodes para 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

  1. 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: Never
    Importante

    Los pods de aplicaciones de GPU en nodos con MPS habilitado deben establecer hostIPC: true; de lo contrario, no podrán iniciarse.

  2. Una vez que el pod alcance el estado Running, compruebe si MPS está activo:

    kubectl exec -ti mps-sample-xxxxx --  nvidia-smi

    Salida 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-smi muestra el proceso mps-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:

  1. En la página Cloud-native AI Suite, actualice la versión de Helm de ack-ai-installer.

  2. En Applications > Helm, seleccione el namespace kube-system y 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.
  3. Para cada nodo, realice Drain, márquelo como Unschedulable y elimine el pod de ack-mps-control.

    1. Marque el nodo como Unschedulable y haga clic en Drain.

    2. Elimine el pod de ack-mps-control en ese nodo.

    3. Confirme que el nuevo pod se ejecute correctamente.

  4. 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.
  5. 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.