View a markdown version of this page

Uso del controlador de DRA o el complemento para dispositivos de NVIDIA en Amazon EKS - Amazon EKS

Ayude a mejorar esta página

Para contribuir a esta guía del usuario, elija el enlace Edit this page on GitHub que se encuentra en el panel derecho de cada página.

Uso del controlador de DRA o el complemento para dispositivos de NVIDIA en Amazon EKS

Amazon EKS admite dos mecanismos para administrar los dispositivos de GPU NVIDIA en los clústeres de EKS: el controlador de DRA de NVIDIA para las GPU y el complemento para dispositivos de Kubernetes de NVIDIA.

Recomendamos utilizar el controlador de DRA de NVIDIA para las nuevas implementaciones con las versiones 1.34 y posteriores de Kubernetes cuando se utilice el aprovisionamiento de capacidad estática en Karpenter, grupos de nodos administrados de EKS o nodos autoadministrados. El controlador de DRA de NVIDIA no es compatible actualmente con el modo automático de EKS. Utilice el complemento para dispositivos de NVIDIA con el modo automático de EKS o con Karpenter cuando utilice el aprovisionamiento de capacidad dinámico. El complemento de dispositivo NVIDIA también es compatible con los grupos de nodos administrados y los nodos autoadministrados de EKS.

Si utiliza características de uso compartido de GPU, como las GPU de varias instancias (MIG) o la segmentación temporal, le recomendamos que utilice una configuración estática con el controlador de DRA o que utilice el complemento para dispositivos de NVIDIA. MIG dinámica y la segmentación temporal se encuentran en estado alfa en el controlador de DRA de NVIDIA. Consulte las versiones del controlador de DRA de NVIDIA en GitHub para ver las actualizaciones más recientes.

El controlador de DRA de NVIDIA frente al complemento para dispositivos de NVIDIA

Característica Controlador de DRA de NVIDIA Complemento para dispositivos de NVIDIA

Versión mínima de Kubernetes

1.34

Todas las versiones de Kubernetes compatible con EKS

Computación de EKS

Karpenter (solo capacidad estática), grupos de nodos administrados, nodos autoadministrados

Modo automático de EKS, Karpenter, grupos de nodos administrados, nodos autoadministrados

AMI optimizadas para EKS

AL2023 (NVIDIA), Bottlerocket

AL2023 (NVIDIA), Bottlerocket

Anuncio de dispositivo

Numerosos atributos a través de objetos ResourceSlice, como el modelo de GPU, la memoria, la versión del controlador y la topología

Recuento de enteros de recursos ampliados de nvidia.com/gpu

Uso compartido de GPU

(Alpha) MIG dinámica, MPS, segmentación temporal

(GA) MIG estática, MPS, segmentación temporal

ComputeDomains

Administra el NVLink de varios nodos (MNNVL) mediante recursos ComputeDomain para una comunicación segura con la GPU de varios nodos

No admitido

Selección basada en atributos

Filtra las GPU por modelo, memoria u otros atributos mediante expresiones CEL

No admitido

Asignación de EFA con reconocimiento de topología

Reconocimiento de la topología nativa de DRA

Reconocimiento automático de la topología (solo AMI AL2023 optimizadas para EKS)

Instalación del controlador de DRA de NVIDIA

El controlador de DRA de NVIDIA para las GPU administra dos tipos de recursos: las GPU y los ComputeDomains. Ejecuta dos complementos kubelet de DRA: gpu-kubelet-plugin y compute-domain-kubelet-plugin. Cada uno se puede habilitar o deshabilitar por separado durante la instalación. Esta guía se centra en la asignación de GPU. Para usar ComputeDomains, consulte Uso de UltraServers P6e-GB200 con Amazon EKS.

Requisitos previos

  • Un clúster de Amazon EKS que ejecuta la versión 1.34 o posterior de Kubernetes con capacidad estática aprovisionada por Karpenter, grupos de nodos administrados de EKS o grupos de nodos autoadministrados.

  • Nodos con tipos de instancias de GPU de NVIDIA (como instancias P o G).

  • Nodos con componentes de nivel de host instalados para las GPU NVIDIA. Si utiliza las AMI de NVIDIA de AL2023 o Bottlerocket optimizadas para EKS, vienen preinstalados el controlador de NVIDIA de nivel de host, el controlador de modo de usuario de CUDA y el kit de herramientas de contenedor.

  • Si tiene Helm instalado en su entorno de línea de comandos, consulte las instrucciones de configuración de Helm para obtener más información.

  • kubectl configurado para comunicarse con su clúster. Consulte Instalación o actualización de kubectl para obtener más información.

Procedimiento

importante

Cuando se utiliza el controlador de DRA de NVIDIA para la administración de dispositivos de GPU, no lo implemente junto con el complemento para dispositivos de NVIDIA en el mismo nodo. Si lo hace, puede provocar una sobresuscripción silenciosa de los dispositivos subyacentes a varios pods en el mismo nodo.

Deshabilitación del complemento para dispositivos de NVIDIA integrado en Bottlerocket

Las variantes de NVIDIA de Bottlerocket optimizadas para EKS incluyen el complemento para dispositivos de NVIDIA y lo habilitan de forma predeterminada. El controlador de DRA no se puede ejecutar junto con el complemento para dispositivos en el mismo nodo. Antes de usar el controlador de DRA, deshabilite el complemento para dispositivos integrado en los nodos de GPU de Bottlerocket. Establezca settings.kubelet-device-plugins.nvidia.enabled en false en los datos de usuario del nodo de Bottlerocket.

[settings.kubelet-device-plugins.nvidia] enabled = false

La configuración settings.kubelet-device-plugins.nvidia.enabled está disponible en la versión 1.63.0 y posteriores de Bottlerocket. En las versiones anteriores, el complemento para dispositivos de NVIDIA integrado no se puede deshabilitar. Para obtener más información, consulte la solicitud de extracción bottlerocket-os/bottlerocket 4856 en GitHub.

  1. Instale el controlador de DRA de NVIDIA directamente desde el registro SIG de OCI de Kubernetes. Para encontrar las versiones disponibles, consulte las versiones del controlador de DRA de NVIDIA en GitHub.

    helm install dra-driver-nvidia-gpu \ oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu \ --version 0.4.1 \ --create-namespace \ --namespace nvidia \ --set resources.computeDomains.enabled=false \ --set gpuResourcesEnabledOverride=true

    Para ver las opciones de configuración avanzadas, consulte los valores del gráfico de Helm del controlador de DRA de NVIDIA en el sitio web de SIG de Kubernetes. Para ver los valores disponibles para una versión de gráfico específica, ejecute helm show values oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu --version 0.4.1.

  2. (Opcional) Para utilizar la segmentación temporal a través del controlador de DRA, agregue la puerta de características TimeSlicingSettings al comando helm install en el paso anterior. De forma predeterminada, es una característica alfa que está deshabilitada. Para obtener más información, consulte Uso de la segmentación temporal de la GPU con el controlador de DRA de NVIDIA.

    --set featureGates.TimeSlicingSettings=true
  3. (Opcional) Para utilizar MIG dinámica a través del controlador de DRA, agregue la puerta de características DynamicMIG al comando helm install en el paso anterior. De forma predeterminada, es una característica alfa que está deshabilitada. No puede combinar la puerta de características DynamicMIG con las puertas de características PassthroughSupport, NVMLDeviceHealthCheck o MPSSupport. Para obtener más información, consulte Uso de MIG con el controlador de DRA de NVIDIA.

    --set featureGates.DynamicMIG=true
  4. Compruebe que se están ejecutando los pods del controlador de DRA.

    kubectl get pods -n nvidia
  5. Compruebe que se hayan creado los objetos DeviceClass.

    kubectl get deviceclass
    NAME AGE gpu.nvidia.com 60s
  6. Compruebe que los objetos ResourceSlice estén publicados para los nodos de la GPU.

    kubectl get resourceslice

    Para solicitar GPU NVIDIA mediante el controlador de DRA, cree un ResourceClaimTemplate que haga referencia al gpu.nvidia.com DeviceClass y haga referencia a él en la especificación del pod. En el siguiente ejemplo, se solicita una sola GPU. Consulte Asignación de dispositivos GPU/Neuron y EFA según la topología para ver los pasos para asignar las GPU NVIDIA con interfaces de EFA alineadas con la topología.

    apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: single-gpu spec: spec: devices: requests: - name: gpu exactly: deviceClassName: gpu.nvidia.com count: 1 --- apiVersion: v1 kind: Pod metadata: name: gpu-workload spec: containers: - name: gpu-demo image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal command: ["/bin/sh", "-c"] args: ["nvidia-smi && tail -f /dev/null"] resources: claims: - name: gpu resourceClaims: - name: gpu resourceClaimTemplateName: single-gpu tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule"

Instalación del complemento para dispositivos de Kubernetes de NVIDIA

El complemento para dispositivos de Kubernetes de NVIDIA anuncia las GPU NVIDIA como recursos ampliados de nvidia.com/gpu. Las GPU se solicitan en límites y solicitudes de recursos de contenedores.

Requisitos previos

  • Un clúster de Amazon EKS.

  • Nodos con tipos de instancias de GPU de NVIDIA (como instancias P o G).

  • Nodos con tipos de instancia de GPU NVIDIA con la AMI de NVIDIA de AL2023 optimizada para EKS. Las AMI de Bottlerocket optimizadas para EKS incluyen el complemento para dispositivos de NVIDIA. No es necesario instalarla por separado.

  • Nodos con componentes de nivel de host instalados para las GPU NVIDIA. Si utiliza las AMI de NVIDIA de AL2023 o Bottlerocket optimizadas para EKS, vienen preinstalados el controlador de NVIDIA de nivel de host, el controlador de modo de usuario de CUDA y el kit de herramientas de contenedor.

  • Si tiene Helm instalado en su entorno de línea de comandos, consulte las instrucciones de configuración de Helm para obtener más información.

  • kubectl configurado para comunicarse con su clúster. Consulte Instalación o actualización de kubectl para obtener más información.

Procedimiento

  1. Agregue el repositorio de gráficos de Helm, complemento para dispositivos de NVIDIA.

    helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
  2. Actualice el repositorio de Helm local.

    helm repo update
  3. Instale el complemento para dispositivos de Kubernetes de NVIDIA.

    helm install nvdp nvdp/nvidia-device-plugin \ --create-namespace \ --namespace nvidia
    Opcional: habilitación de la Detección de características de GPU (GFD)

    El complemento para dispositivos anuncia recursos extendidos de nvidia.com/gpu y programa los pods de GPU por sí solo. En la AMI de NVIDIA de AL2023 optimizada para EKS, la etiqueta de nodo nvidia.com/gpu.present=true ya está aplicada al arrancar mediante nodeadm, por lo que no se requiere la Detección de características de GPU (GFD) para la programación básica de GPU.

    Habilite la GFD con --set gfd.enabled=true si desea etiquetar el nodo con atributos detallados de la GPU, como nvidia.com/gpu.product, nvidia.com/gpu.memory, nvidia.com/gpu.count, etiquetas de perfil de MIG y versiones de CUDA o del controlador. Con estas etiquetas, puede dirigir tipos de GPU específicos con nodeSelector o afinidad de nodos (por ejemplo, programar una carga de trabajo solo en las GPU A10G o en un perfil de MIG concreto). Las configuraciones de uso compartido de GPU, como la división de tiempo y MIG, también utilizan estas etiquetas. Si no necesita la selección de nodos basada en atributos o el uso compartido de la GPU, puede omitir el indicador.

    helm install nvdp nvdp/nvidia-device-plugin \ --create-namespace \ --namespace nvidia \ --set gfd.enabled=true
    Habilitación de GDRCopy si lo usan las cargas de trabajo

    Las versiones de la 0.19.0 a la 0.19.2 de k8s-device-plugin habilitaban las características GDRCopy y MOFED de forma predeterminada. Esta habilitación predeterminada se revirtió en la versión 0.19.3 de k8s-device-plugin. Como resultado de la reversión, GDRCopy (gdrdrv) ya no se puede habilitar por contenedor con la variable de entorno NVIDIA_GDRCOPY=enabled incluida en una especificación de pod; ahora, esa variable se ignora.

    Si las cargas de trabajo utilizan GDRCopy (copia de RDMA de GPUDirect), debe habilitarlo en el complemento para dispositivos en el momento de la instalación mediante la configuración de gdrcopyEnabled=true:

    helm upgrade --install nvdp nvdp/nvidia-device-plugin \ --namespace nvidia \ --create-namespace \ --set gdrcopyEnabled=true

    (Agregue --set gfd.enabled=true si también desea etiquetas de la Detección de características de GPU, tal y como se ha descrito anteriormente).

    Si administra el complemento para dispositivos de NVIDIA a través del operador de GPU de NVIDIA en GitHub, el operador establece dinámicamente GDRCOPY_ENABLED=true cuando se carga el módulo del kernel gdrdrv en el nodo.

    Para obtener más información, consulte el problema 1692 de k8s-device-plugin de NVIDIA en GitHub.

    nota

    También puede instalar y administrar el complemento para dispositivos de Kubernetes de NVIDIA mediante el operador de GPU de NVIDIA en GitHub, que automatiza la administración de todos los componentes de software de NVIDIA necesarios para aprovisionar las GPU.

  4. Compruebe que el DaemonSet del complemento para dispositivos NVIDIA esté en ejecución.

    kubectl get ds -n nvidia nvdp-nvidia-device-plugin
    NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nvdp-nvidia-device-plugin 2 2 2 2 2 <none> 60s
  5. Compruebe que los nodos tengan GPU asignables.

    kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"

    Un ejemplo de salida sería el siguiente.

    NAME GPU ip-192-168-11-225.us-west-2.compute.internal 1 ip-192-168-24-96.us-west-2.compute.internal 1

Solicitud de las GPU NVIDIA en un pod

Para solicitar GPU NVIDIA mediante el complemento para dispositivos, especifique el recurso nvidia.com/gpu en los límites y solicitudes de recursos del contenedor.

apiVersion: v1 kind: Pod metadata: name: nvidia-smi spec: restartPolicy: OnFailure containers: - name: gpu-demo image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal command: ["/bin/sh", "-c"] args: ["nvidia-smi && tail -f /dev/null"] resources: limits: nvidia.com/gpu: 1 requests: nvidia.com/gpu: 1 tolerations: - key: "nvidia.com/gpu" operator: "Equal" value: "true" effect: "NoSchedule"

Para ejecutar esta prueba, aplique el manifiesto y consulta los registros:

kubectl apply -f nvidia-smi.yaml kubectl logs nvidia-smi

Un ejemplo de salida sería el siguiente.

+-----------------------------------------------------------------------------------------+ | NVIDIA-SMI XXX.XXX.XX Driver Version: XXX.XXX.XX CUDA Version: XX.X | |-----------------------------------------+------------------------+----------------------+ | 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 NVIDIA L4 On | 00000000:31:00.0 Off | 0 | | N/A 27C P8 11W / 72W | 0MiB / 23034MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | No running processes found | +-----------------------------------------------------------------------------------------+