

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

# Administración de dispositivos GPU NVIDIA en Amazon EKS
<a name="device-management-nvidia"></a>

Las GPU NVIDIA se utilizan ampliamente para el entrenamiento de machine learning, la inferencia y las cargas de trabajo informáticas de alto rendimiento. 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*.

Se recomienda utilizar el controlador de DRA de NVIDIA para las nuevas implementaciones en clústeres que ejecuten la versión 1.34 o posterior de Kubernetes con grupos de nodos administrados o grupos de nodos autoadministrados de EKS. El controlador de DRA de NVIDIA permite la asignación flexible de la GPU y el uso compartido de la GPU entre contenedores.

El controlador de DRA de NVIDIA no es compatible con el modo automático de EKS o Karpenter. Utilice el [complemento de dispositivo NVIDIA](#nvidia-device-plugin) con Karpenter y el modo automático de EKS. El complemento de dispositivo NVIDIA también es compatible con los grupos de nodos administrados y los nodos autoadministrados de EKS.

## El controlador de DRA de NVIDIA frente al complemento para dispositivos de NVIDIA
<a name="_nvidia_dra_driver_vs_nvidia_device_plugin"></a>


| Funcionalidad | 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 | Grupos de nodos administrados, nodos autoadministrados | Modo automático de EKS, Karpenter, grupos de nodos administrados, nodos autoadministrados | 
| AMI optimizadas para EKS | AL2023 (NVIDIA) | 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 | Varios contenedores del mismo pod pueden compartir una GPU a través de referencias `ResourceClaim` compartidas | No admitido. Cada GPU se asigna exclusivamente a un contenedor. | 
| 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
<a name="nvidia-dra-driver"></a>

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](ml-eks-nvidia-ultraserver.md).

### Requisitos previos
<a name="_prerequisites"></a>
+ Un clúster de Amazon EKS que ejecuta la versión 1.34 o posterior de Kubernetes o grupos de nodos administrados o grupos de nodos autoadministrados de EKS.
+ 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](helm.md) para obtener más información.
+  `kubectl` configurado para comunicarse con su clúster. Consulte [Instalación o actualización de `kubectl`](install-kubectl.md#kubectl-install-update) para obtener más información.

### Procedimiento
<a name="_procedure"></a>

**importante**  
Cuando se utiliza el controlador de DRA de NVIDIA para la administración de dispositivos de GPU, no se puede implementar junto con el complemento para dispositivos de NVIDIA en el mismo nodo. Consulte [KEP-5004](https://github.com/kubernetes/enhancements/issues/5004) de Kubernetes ascendente para ver las actualizaciones.

**importante**  
Actualmente, no se admite el uso del controlador de DRA de NVIDIA con Bottlerocket.

1. Agregue el repositorio de gráficos de Helm del controlador de DRA de NVIDIA.

   ```
   helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
   ```

1. Actualice el repositorio de Helm local.

   ```
   helm repo update
   ```

1. Obtenga la versión más reciente del controlador de DRA de NVIDIA.

   ```
   helm search repo nvidia/nvidia-dra
   ```

1. Instale el controlador de DRA de NVIDIA.

   ```
   helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
       --create-namespace \
       --namespace nvidia-dra-driver-gpu \
       --set resources.computeDomains.enabled=false \
       --set 'gpuResourcesEnabledOverride=true'
   ```

   Para ver las opciones de configuración avanzadas, consulte el [gráfico de Helm del controlador de DRA de NVIDIA](https://github.com/kubernetes-sigs/nvidia-dra-driver-gpu/blob/main/deployments/helm/nvidia-dra-driver-gpu/values.yaml).

1. Compruebe que se están ejecutando los pods del controlador de DRA.

   ```
   kubectl get pods -n nvidia-dra-driver-gpu
   ```

1. Compruebe que se hayan creado los objetos `DeviceClass`.

   ```
   kubectl get deviceclass
   ```

   ```
   NAME            AGE
   gpu.nvidia.com  60s
   ```

1. 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](device-management-efa.md#efa-dra-topology-aware) para ver los pasos para asignar las GPU NVIDIA con interfaces 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: app
       ...
       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
<a name="nvidia-device-plugin"></a>

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
<a name="_prerequisites_2"></a>
+ Un clúster de Amazon EKS.
+ 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 NVIDIA y no es necesaria una instalación independiente.
+ Si tiene Helm instalado en su entorno de línea de comandos, consulte las [instrucciones de configuración de Helm](helm.md) para obtener más información.
+  `kubectl` configurado para comunicarse con su clúster. Consulte [Instalación o actualización de `kubectl`](install-kubectl.md#kubectl-install-update) para obtener más información.

### Procedimiento
<a name="_procedure_2"></a>

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
   ```

1. Actualice el repositorio de Helm local.

   ```
   helm repo update
   ```

1. Instale el complemento para dispositivos de Kubernetes de NVIDIA.

   ```
   helm install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gfd.enabled=true
   ```
**Desactivación de MOFED en los nodos con dispositivos EFA**  
A partir de la versión 0.19.0 de `k8s-device-plugin`, el indicador `--mofed-enabled` se establece de forma predeterminada en `true`. Esto hace que el complemento de dispositivo de NVIDIA monte todos los dispositivos `/dev/infiniband/uverbs*` en contenedores que solicitan GPU (`nvidia.com/gpu`). Esto entra en conflicto con el complemento AWS de dispositivo EFA, que gestiona el montaje de los dispositivos `uverbs`. Las cargas de trabajo que solicitan menos dispositivos EFA de un nodo se ven afectadas porque el complemento de dispositivo de NVIDIA reclama todos los dispositivos `uverbs` de forma predeterminada.  
Si sus nodos tienen dispositivos EFA, desactive MOFED de forma explícita al instalar el complemento de dispositivo de NVIDIA:  

   ```
   helm upgrade --install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gfd.enabled=true \
       --set mofedEnabled=false
   ```
Si administra el complemento del dispositivo NVIDIA a través del [operador de GPU de NVIDIA](https://github.com/NVIDIA/gpu-operator), desactive MOFED mediante el campo `devicePlugin.env`:  

   ```
   helm upgrade --install gpu-operator nvidia/gpu-operator \
       --namespace gpu-operator \
       --set 'devicePlugin.env[0].name=MOFED_ENABLED' \
       --set 'devicePlugin.env[0].value=false'
   ```
Para obtener más información, consulte [Problema núm. 1692 de k8s-device-plugin de NVIDIA](https://github.com/NVIDIA/k8s-device-plugin/issues/1692).
**nota**  
También puede instalar y administrar el complemento para dispositivos de Kubernetes de NVIDIA mediante el [operador de GPU NVIDIA](https://github.com/NVIDIA/gpu-operator), que automatiza la administración de todos los componentes de software de NVIDIA necesarios para aprovisionar las GPU.

1. 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
   ```

1. 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
<a name="_request_nvidia_gpus_in_a_pod"></a>

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                                                             |
+-----------------------------------------------------------------------------------------+
```