

 **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. El controlador de DRA de NVIDIA permite la asignación flexible de la GPU y el uso compartido de la GPU entre contenedores. El complemento para dispositivos NVIDIA sigue siendo compatible.

## 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  | 
|  Karpenter y modo automático de EKS  |  No admitido  |  Compatible  | 
|  AMI optimizadas para EKS  |  AL2023  |  AL2023, 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  | 

## 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).

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

### Requisitos previos
<a name="_prerequisites"></a>
+ Un clúster de Amazon EKS que ejecuta la versión 1.34 de Kubernetes o una posterior.
+ 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.

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/NVIDIA/k8s-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
   ```

### Solicitud de las GPU NVIDIA en un pod
<a name="_request_nvidia_gpus_in_a_pod"></a>

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:

```
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
   ```
**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_2"></a>

Para solicitar GPU NVIDIA mediante el complemento para dispositivos, especifique el recurso `nvidia.com/gpu` en los límites 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
  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                                                             |
+-----------------------------------------------------------------------------------------+
```