Compartir a través de


Uso de GPU de Windows para cargas de trabajo de proceso intensivo en Azure Kubernetes Service (AKS) (versión preliminar)

Por lo general, las unidades de procesamiento gráfico (GPU) se usan para cargas de trabajo de cálculo intensivo, como cargas de trabajo de visualización y gráficos. AKS admite grupos de nodos de Windows habilitados para GPU y Linux para ejecutar cargas de trabajo de Kubernetes con un uso intensivo de proceso.

Este artículo le ayuda a aprovisionar nodos de Windows con GPU programables en clústeres de AKS nuevos y existentes (versión preliminar).

Máquinas virtuales (VM) compatibles con GPU

Para ver las máquinas virtuales habilitadas para GPU compatibles, consulte Tamaños de máquinas virtuales optimizadas para GPU en Azure. Para grupos de nodos de AKS, se recomienda un tamaño mínimo de Standard_NC6s_v3. La serie NVv4 (basada en GPU de AMD) no es compatible con AKS.

Nota:

Las máquinas virtuales habilitadas para GPU contienen hardware especializado que está sujeto a una mayor disponibilidad de precios y región. Para obtener más información, consulte la herramienta de precios y la disponibilidad de regiones.

Limitaciones

  • No se admite la actualización de un grupo de nodos de Windows existente para agregar GPU.
  • No se admite en la versión 1.28 y posteriores de Kubernetes.

Antes de empezar

  • Este artículo supone que ya tiene un clúster de AKS. Si no dispone de un clúster, cree uno mediante Azure CLI, Azure PowerShell o el Azure Portal.
  • Necesita la versión 1.0.0b2 de la CLI de Azure o posterior instalada y configurada para usar el --skip-gpu-driver-installcampo con el comando az aks nodepool add. Ejecute az --version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

Obtención de las credenciales del clúster

  • Obtenga las credenciales del clúster de AKS mediante el comando az aks get-credentials. Con el siguiente comando de ejemplo se obtienen las credenciales del clúster myAKSCluster en el grupo de recursos myResourceGroup:

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Uso de GPU de Windows con instalación automática de controladores

El uso de GPU de NVIDIA implica la instalación de varios componentes de software NVIDIA, como el complemento deDispositivo DirectX para Kubernetes, la instalación del controlador de GPU, etc. Al crear un grupo de nodos de Windows con una máquina virtual compatible con GPU, estos componentes y los controladores NVIDIA CUDA o GRID adecuados se instalan. En el caso de los tamaños de máquina virtual de la serie NC y ND, se instala el controlador CUDA. En el caso de los tamaños de máquina virtual de la serie NV, se instala el controlador GRID.

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Instalación de la extensión de la CLI de Azure aks-preview

  • Registre o actualice la extensión aks-preview mediante el comando az extension add o az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Registro de la marca de característica WindowsGPUPreview

  1. Registre la marca de características de WindowsGPUPreview mediante el comando az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    

    Tarda unos minutos en que el estado muestre Registrado.

  2. Comprobar el estado del registro mediante el comando az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    
  3. Cuando aparezca el estado Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Creación de un grupo de nodos habilitado para GPU de Windows (versión preliminar)

Para crear un grupo de nodos habilitado para GPU de Windows, debe usar un tamaño de máquina virtual compatible con GPU y especificar el os-type como Windows. El predeterminado de Windows os-sku es Windows2022, pero se admiten todas las opciones de os-sku Windows.

  1. Cree un grupo de nodos habilitados para GPU de Windows mediante el comandoaz aks nodepool add.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type Windows \
        --kubernetes-version 1.29.0 \
        --node-vm-size Standard_NC6s_v3
    
  2. Compruebe que las GPU son programables.

  3. Una vez que confirme que las GPU son programables, puede ejecutar la carga de trabajo de GPU.

Uso de GPU de Windows con instalación manual del controlador

Al crear un grupo de nodos de Windows con tamaños de máquina virtual de la serie N (GPU de NVIDIA) en AKS, el controlador de GPU y el complemento de dispositivo DirectX de Kubernetes se instalan automáticamente. Para omitir esta instalación automática, siga estos pasos:

  1. Omitir la instalación del controlador de GPU (versión preliminar) mediante --skip-gpu-driver-install.
  2. Instalación manual del complemento de dispositivo DirectX de Kubernetes.

Omisión de la instalación del controlador de GPU (versión preliminar)

AKS tiene habilitada, de forma predeterminada, la instalación automática del controlador de GPU. En algunos casos, como instalar sus propios controladores, es posible que desee omitir la instalación del controlador de GPU.

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

  1. Registre o actualice la extensión aks-preview mediante el comando az extension add o az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Cree un grupo de nodos mediante el comando az aks nodepool add con la marca --skip-gpu-driver-install para omitir la instalación automática del controlador de GPU.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022 \
        --skip-gpu-driver-install
    

Nota:

Si el --node-vm-size que está usando aún no está incorporado en AKS, no puede usar GPU y --skip-gpu-driver-install no funciona.

Instalación manual del complemento de dispositivo DirectX de Kubernetes

Puede implementar un DaemonSet para el complemento de dispositivo DirectX de Kubernetes, que ejecuta un pod en cada nodo para proporcionar los controladores necesarios para las GPU.

  • Agregue un grupo de nodos a su clúster mediante el comando az aks nodepool add.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022
    

Creación de un espacio de nombres e implementación del complemento de dispositivo DirectX de Kubernetes

  1. Cree un espacio de nombres mediante el comando kubectl create namespace.

    kubectl create namespace gpu-resources
    
  2. Cree un archivo denominado k8s-directx-device-plugin.yaml y pegue el siguiente manifiesto YAML proporcionado como parte del complemento de dispositivo NVIDIA para el proyecto de Kubernetes:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: gpu-resources
    spec:
      selector:
        matchLabels:
          name: nvidia-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          # Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
          # reserves resources for critical add-on pods so that they can be rescheduled after
          # a failure.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]
            volumeMounts:
              - name: device-plugin
                mountPath: /var/lib/kubelet/device-plugins
          volumes:
            - name: device-plugin
              hostPath:
                path: /var/lib/kubelet/device-plugins
    
  3. Cree el DaemonSet y confirme que el plugin de dispositivos NVIDIA se ha creado correctamente mediante el comando kubectl apply.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Ahora que instaló correctamente el complemento de dispositivo NVIDIA, puede comprobar que las GPU son programables.

Confirmación de que las GPU son programables

Después de crear el clúster, confirme que las GPUs son programables en Kubernetes.

  1. Enumere los nodos de su clúster mediante el comando kubectl get nodes.

    kubectl get nodes
    

    El resultado debería ser similar al ejemplo siguiente:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Confirme que las GPU son programables mediante el comando kubectl describe node.

    kubectl describe node aks-gpunp-28993262-0
    

    En la sección Capacidad, la GPU debe aparecer como microsoft.com/directx: 1. El resultado debería ser similar al siguiente ejemplo reducido:

    Capacity:
    [...]
     microsoft.com.directx/gpu:                 1
    [...]
    

Uso de información de contenedores para supervisar el uso de GPU

Container Insights con AKS supervisa las siguientes métricas de uso de la GPU:

Nombre de métrica Dimensión de métrica (etiquetas) Descripción
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Porcentaje de tiempo del período de muestra anterior (60 segundos) durante el cual la GPU estuvo ocupada o realizando un procesamiento activo para un contenedor. El ciclo de servicio es un número comprendido entre 1 y 100.
containerGpuLimits container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Cada contenedor puede especificar límites para una o varias GPU. No es posible solicitar ni limitar una fracción de una GPU.
containerGpuRequests container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Cada contenedor puede solicitar una o varias GPU. No es posible solicitar ni limitar una fracción de una GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Cantidad de memoria de GPU en bytes disponible para su uso en un contenedor específico.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Cantidad de memoria de GPU en bytes que usa un contenedor específico.
nodeGpuAllocatable container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Número de GPU en un nodo que Kubernetes puede usar.
nodeGpuCapacity container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Número total de GPU en un nodo.

Limpieza de recursos

  • Elimine los objetos Kubernetes asociados que creó en este artículo mediante el comando kubectl delete job.

    kubectl delete jobs windows-gpu-workload
    

Pasos siguientes