

 **Contribuisci a migliorare questa pagina** 

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Per contribuire a questa guida per l'utente, scegli il GitHub link **Modifica questa pagina** nel riquadro destro di ogni pagina.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Esecuzione dei corsi di machine learning su Amazon EKS con Elastic Fabric Adapter
<a name="node-efa"></a>

In questo argomento viene descritto come integrare Elastic Fabric Adapter (EFA) con i pod implementati nel cluster Amazon EKS. Elastic Fabric Adapter (EFA) è un'interfaccia di rete per le istanze Amazon EC2 che consente di eseguire applicazioni che richiedono livelli elevati di comunicazioni internodale su larga scala in AWS. La sua interfaccia hardware di bypass del sistema operativo personalizzata migliora le prestazioni delle comunicazioni tra istanze, che è fondamentale per dimensionare queste applicazioni. Con EFA, le applicazioni High Performance Computing (HPC) che utilizzano le applicazioni Message Passing Interface (MPI) e Machine Learning (ML) che utilizzano NVIDIA Collective Communications Library (NCCL) possono scalare fino a migliaia di o. CPUs GPUs Di conseguenza, si ottengono le prestazioni applicative dei cluster HPC locali con l'elasticità e la flessibilità on-demand del cloud. AWS L'integrazione di EFA con le applicazioni in esecuzione su cluster Amazon EKS può ridurre il tempo necessario per completare carichi di lavoro di formazione distribuiti su larga scala senza dover aggiungere ulteriori istanze al cluster. Per ulteriori informazioni su EFA, consulta [Elastic Fabric Adapter](https://aws.amazon.com/hpc/efa/).

## Tipi di istanze con EFA
<a name="efa-instances"></a>

L'* AWS EFA Kubernetes Device Plugin* supporta tutti i tipi di istanze Amazon EC2 con EFA. Per visualizzare un elenco di tutti i tipi di istanze con EFA, consulta [Tipi di istanze supportati](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html#efa-instance-types) nella *Guida per l’utente di Amazon EC2*. Tuttavia, per eseguire rapidamente le applicazioni ML, consigliamo che un'istanza disponga di chip di accelerazione hardware come GPUs NVidia [AWS ,](https://aws.amazon.com/machine-learning/inferentia/) Inferentia [AWS o](https://aws.amazon.com/machine-learning/trainium/) chip Trainium, oltre all'EFA. Per visualizzare un elenco di tipi di istanze con chip di accelerazione hardware ed EFA, consulta [Calcolo accelerato](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html#efa-instance-types) nella *Guida per l’utente di Amazon EC2*.

Nel confrontare i tipi di istanza e scegliere tra di essi, considera il numero di schede di rete EFA disponibili per quel tipo di istanza, nonché il numero di schede di accelerazione, la quantità di CPU e la quantità di memoria. È possibile assegnare fino a un EFA per scheda di rete. Un EFA conta come un’interfaccia di rete. Per vedere quanti EFA sono disponibili per ciascun tipo di istanza che dispone di EFA, consulta l’elenco delle [Schede di rete](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#network-cards) nella *Guida per l’utente di Amazon EC2*.

## Interfacce EFA e solo EFA
<a name="efa-only-interfaces"></a>

Un *Elastic Fabric Adapter (EFA) è un'*interfaccia di rete che combina le funzionalità di un Elastic Network Adapter (ENA) e un'interfaccia OS-Bypass, basata sul protocollo AWS Scalable Reliable Datagram (SRD). Le funzionalità EFA consentono alle applicazioni di comunicare direttamente con l’hardware per un trasporto a bassa latenza. È possibile scegliere di accedere solo alle funzionalità EFA utilizzando interfacce *solo EFA*, limitando la comunicazione alle interfacce all’interno della stessa zona di disponibilità.

Per creare nodi che possono avere interfacce solo EFA, devi utilizzare un modello di lancio EC2 personalizzato e impostare `InterfaceType` su `efa-only`. Nel tuo modello di lancio personalizzato, non puoi impostare la scheda di rete `0` su un’interfaccia solo EFA, poiché si tratta della scheda di rete e dell’interfaccia di rete principali dell’istanza EC2. È necessario disporre della versione CNI di VPC `1.18.5` o successiva per le interfacce solo EFA. Se utilizzi Amazon Linux 2, la versione ami deve essere `v20240928` o successiva per le interfacce solo EFA.

La procedura seguente guida alla creazione di un cluster EKS con nodi `eksctl` dotati di interfacce NVidia GPUs ed EFA. Non è possibile utilizzare `eksctl` per creare nodi e gruppi di nodi che utilizzano interfacce solo EFA.

## Prerequisiti
<a name="efa-prereqs"></a>
+ Un cluster Amazon EKS esistente. Qualora non fosse disponibile un cluster esistente, potrai crearne uno utilizzando [Nozioni di base su Amazon EKS](getting-started.md). Il cluster deve essere implementato in un VPC con almeno una sottorete privata con indirizzi IP disponibili sufficienti in cui implementare i nodi. La sottorete privata deve disporre di un accesso Internet in uscita fornito da un dispositivo esterno, ad esempio un gateway NAT.

  Se prevedi di utilizzare `eksctl` per creare il gruppo di nodi, `eksctl` può anche creare un cluster per tuo conto.
+ Versione `2.12.3` o successiva o versione `1.27.160` o successiva dell'interfaccia a riga di AWS comando (AWS CLI) installata e configurata sul dispositivo o. AWS CloudShell Per verificare la versione attuale, usa `aws --version | cut -d / -f2 | cut -d ' ' -f1`. I gestori di pacchetti come `yum` Homebrew per macOS sono spesso diverse versioni dell'ultima versione della CLI AWS . `apt-get` Per installare la versione più recente, consulta [Installazione](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) e [configurazione rapida con aws configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) nella Guida per l'utente dell'*interfaccia a riga di AWS comando*. La versione AWS CLI installata in AWS CloudShell potrebbe anche contenere diverse versioni precedenti alla versione più recente. Per aggiornarlo, consulta [Installazione della AWS CLI nella tua home directory nella Guida per](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software) l'* AWS CloudShell utente*.
+ Lo strumento a riga di comando `kubectl` è installato sul dispositivo o AWS CloudShell. La versione può essere uguale oppure immediatamente precedente o successiva alla versione di Kubernetes del cluster. Ad esempio, se la versione del cluster è `1.29`, puoi usare `kubectl` versione `1.28`, `1.29` o `1.30`. Per installare o aggiornare `kubectl`, consulta [Impostazione di `kubectl` e `eksctl`](install-kubectl.md):
+ Prima di avviare i nodi worker che supportano più di un Elastic Fabric Adapter, come ad esempio `p4d` o `p5`, è necessario aver installato la versione `1.7.10` o successiva del plugin CNI di Amazon VPC per Kubernetes. Per ulteriori informazioni sull’aggiornamento della versione del plugin CNI di Amazon VPC per Kubernetes, consulta [Assegna IPs ai pod con Amazon VPC CNI](managing-vpc-cni.md).
+ Per le istanze p6-b200, è necessario utilizzare la versione del plugin del dispositivo EFA v0.5.6 o successiva.

**Importante**  
Un'importante considerazione necessaria per l'adozione di EFA con Kubernetes è la configurazione e la gestione di Huge Pages come risorsa nel cluster. Per ulteriori informazioni, consultare [Gestione di Huge Pages](https://kubernetes.io/docs/tasks/manage-hugepages/scheduling-hugepages/) nella documentazione Kubernetes. Le istanze Amazon EC2 con il driver EFA installato assegnano in via anticipata 5.128 Huge Pages da 2 MiB, che possono essere richieste come risorse da utilizzare nelle specifiche del processo.

## Creazione di un gruppo di nodi
<a name="efa-create-nodegroup"></a>

La procedura seguente consente di creare un gruppo di nodi con un gruppo di nodi `p4d.24xlarge` supportato con interfacce EFA e GPUDirect RDMA ed eseguire un esempio di test della NVIDIA Collective Communications Library (NCCL) per l'utilizzo di NCCL a più nodi. EFAs L'esempio può essere utilizzato come modello per la formazione distribuita di deep learning su Amazon EKS utilizzando EFAs.

1. Determina quali tipi di istanze Amazon EC2 che supportano EFA sono disponibili nella AWS regione in cui desideri distribuire i nodi. Sostituiscilo *region-code* con la AWS regione in cui desideri distribuire il gruppo di nodi.

   ```
   aws ec2 describe-instance-types --region region-code \
       --filters Name=network-info.efa-supported,Values=true \
       --query "InstanceTypes[*].[InstanceType]" --output text
   ```

   Quando distribuisci i nodi, il tipo di istanza che desideri distribuire deve essere disponibile nella AWS regione in cui si trova il cluster.

1. Determina in quali zone di disponibilità è disponibile il tipo di istanza che desideri implementare. In questo tutorial, viene utilizzato il tipo di `p5.48xlarge` istanza che deve essere restituito nell'output per la AWS regione specificata nel passaggio precedente. Quando distribuisci i nodi in un cluster di produzione, sostituiscili *p5.48xlarge* con qualsiasi tipo di istanza restituito nel passaggio precedente.

   ```
   aws ec2 describe-instance-type-offerings --region region-code \
       --location-type availability-zone --filters Name=instance-type,Values=p4d.24xlarge,p5.48xlarge \
       --query 'InstanceTypeOfferings[*].Location' --output text
   ```

   Di seguito viene riportato un output di esempio.

   ```
   us-west-2a    us-west-2c    us-west-2b
   ```

   Prendi nota delle zone di disponibilità restituite per l'uso nelle fasi successive. Quando implementi i nodi in un cluster, il tuo VPC deve disporre di sottoreti con indirizzi IP disponibili in una delle zone di disponibilità restituite nell'output.

1. Crea un gruppo di nodi utilizzando `eksctl`. È necessaria la versione `0.215.0` o una versione successiva dello strumento da riga di `eksctl` comando installata sul dispositivo o AWS CloudShell. Per l'installazione o l'aggiornamento di `eksctl`, consulta la sezione [Installation](https://eksctl.io/installation) nella documentazione di `eksctl`.

   1. Copiare i contenuti seguenti in un file denominato *efa-cluster.yaml*. Sostituire i valori di esempio con i propri valori. Puoi sostituire `p5.48xlarge` con un'istanza diversa, ma in questo caso assicurati che i valori per `availabilityZones` corrispondano a zone di disponibilità restituite per il tipo di istanza nel passaggio 1.

      ```
      apiVersion: eksctl.io/v1alpha5
      kind: ClusterConfig
      
      metadata:
        name: my-efa-cluster
        region: region-code
        version: "1.XX"
      
      iam:
        withOIDC: true
      
      availabilityZones: ["us-west-2a", "us-west-2c"]
      
      managedNodeGroups:
        - name: my-efa-ng
          instanceType: p5.48xlarge
          minSize: 1
          desiredCapacity: 2
          maxSize: 3
          availabilityZones: ["us-west-2a"]
          volumeSize: 300
          privateNetworking: true
          efaEnabled: true
      ```

   1. Crea un gruppo di nodi gestito in un cluster esistente.

      ```
      eksctl create nodegroup -f efa-cluster.yaml
      ```

      Se non disponi di un cluster esistente, puoi eseguire il comando seguente per creare un cluster e il gruppo di nodi.

      ```
      eksctl create cluster -f efa-cluster.yaml
      ```
**Nota**  
Poiché il tipo di istanza utilizzato in questo esempio installa `eksctl` automaticamente il plug-in del dispositivo NVIDIA Kubernetes su ogni istanza per te quando usi Amazon Linux 2. GPUs Ciò non è necessario per Bottlerocket, poiché il plugin del dispositivo NVIDIA è integrato nella variante NVIDIA EKS di Bottlerocket. Quando `efaEnabled` è impostato su `true` nella configurazione del gruppo di nodi, `eksctl` distribuirà automaticamente anche il plugin del dispositivo EFA sui nodi.

### Utilizzo di Bottlerocket con EFA
<a name="efa-bottlerocket"></a>

La versione AMI di Bottlerocket 1.28.0 e successive includono il supporto ufficiale per EFA. Per utilizzare Bottlerocket per nodi abilitati a EFA, specifica `amiFamily: Bottlerocket` nella configurazione. Se è necessario utilizzare un ID AMI personalizzato, è necessario utilizzare `nodeGroups` standard anziché `managedNodeGroups`.

Ecco un esempio di configurazione:

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-efa-bottlerocket-cluster
  region: region-code
  version: "1.XX"

iam:
  withOIDC: true

availabilityZones: ["us-west-2a", "us-west-2c"]

managedNodeGroups:
  - name: my-efa-bottlerocket-ng
    instanceType: p5.48xlarge
    minSize: 1
    desiredCapacity: 2
    maxSize: 3
    availabilityZones: ["us-west-2a"]
    volumeSize: 300
    privateNetworking: true
    efaEnabled: true
    amiFamily: Bottlerocket
    bottlerocket:
      enableAdminContainer: true
      settings:
        kernel:
          sysctl:
            "vm.nr_hugepages": "3000"  # Configures 3000 * 2Mi = 6000Mi hugepages
```

L’impostazione sysctl `vm.nr_hugepages` riportata sopra configura il numero di Huge Pages di 2 Mi. In questo esempio, 3000 significa 3000 \$1 2 Mi = 6000 Mi di Huge Pages.

### Verifica l’installazione del plugin del dispositivo EFA
<a name="verify-efa-device-plugin"></a>

Quando crei un gruppo di nodi con `efaEnabled: true`, `eksctl` distribuisce automaticamente il plugin per dispositivi EFA Kubernetes per te. Puoi verificare che il plugin del dispositivo sia installato e funzioni correttamente:

1. Controlla lo stato: DaemonSet 

   ```
   kubectl get daemonsets -n kube-system
   ```

   Output di esempio:

   ```
   NAME                                  DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   aws-efa-k8s-device-plugin-daemonset   2         2         2       2            2           <none>          6m16s
   ...
   ```

   Qui, il plug-in del dispositivo EFA DaemonSet è in esecuzione su due nodi. Entrambi sono PRONTO e DISPONIBILE.

1. Successivamente, verifica i pod creati da: DaemonSet

   ```
   kubectl get pods -n kube-system -l name=aws-efa-k8s-device-plugin
   ```

   Output di esempio:

   ```
   NAME                                        READY   STATUS    RESTARTS   AGE
   aws-efa-k8s-device-plugin-daemonset-d68bs   1/1     Running   0          6m16s
   aws-efa-k8s-device-plugin-daemonset-w4l8t   1/1     Running   0          6m16s
   ```

   I pod dei plugin del dispositivo EFA sono nello stato In esecuzione, a conferma che il plugin è stato distribuito correttamente ed è operativo.

1. Verifica la registrazione delle risorse:

   Puoi confermare che la risorsa `vpc.amazonaws.com/efa` è registrata con il kubelet descrivendo i nodi:

   ```
   kubectl describe nodes
   ```

   se la risorsa EFA è registrata correttamente, la vedrai elencata nelle risorse di capacità e assegnabilità del nodo. Esempio:

   ```
   Capacity:
     ...
     vpc.amazonaws.com/efa:  4
   Allocatable:
     ...
     vpc.amazonaws.com/efa:  4
   ```

   questo output conferma che il nodo riconosce la risorsa EFA, rendendola disponibile per i pod che la richiedono.

## (Facoltativo) Test delle prestazioni dell’EFA
<a name="efa-application"></a>

Consigliamo di testare la configurazione EFA. È possibile utilizzare i [test NCCL presenti nel repository](https://github.com/aws-samples/awsome-distributed-training/tree/main/micro-benchmarks/nccl-tests) su. `aws-samples/awsome-distributed-training` GitHub [I test NCCL](https://github.com/NVIDIA/nccl-tests) valutano le prestazioni della rete utilizzando la libreria NVIDIA per comunicazioni collettive. La procedura seguente prevede l’invio dei test NCCL su Amazon EKS.

1. Implementa l’operatore MPI Kubeflow:

   Per i test NCCL è possibile applicare l'operatore Kubeflow MPI. L'operatore MPI semplifica l'esecuzione della formazione distribuita in stile Allreduce su Kubernetes. Per ulteriori informazioni, vedere [MPI](https://github.com/kubeflow/mpi-operator) Operator on. GitHub

1. Esegui il test delle prestazioni NCCL multinodo per verificare RDMA/EFA: GPUDirect

   Per verificare le prestazioni NCCL con GPUDirect RDMA su EFA, esegui il test delle prestazioni NCCL standard. [Per ulteriori informazioni, consulta il repository ufficiale di NCCL-Tests su.](https://github.com/NVIDIA/nccl-tests.git) GitHub

   Completa i seguenti passaggi per eseguire un test delle prestazioni NCCL a due nodi. Nell'esempio del processo di test NCCL, ogni lavoratore richiede otto, 5210 Mi di GPUs, quattro EFAs e 8000 Mi di memoria`hugepages-2Mi`, il che significa effettivamente che ogni lavoratore consuma tutte le risorse di un'istanza. `p5.48xlarge`

   1. Crea il manifesto: MPIJob 

      Copia quanto riportato di seguito in un file denominato `nccl-tests.yaml`.

      ```
      apiVersion: kubeflow.org/v2beta1
      kind: MPIJob
      metadata:
        name: nccl-tests
      spec:
        runPolicy:
          cleanPodPolicy: Running
          backoffLimit: 20
        slotsPerWorker: 8
        mpiReplicaSpecs:
          Launcher:
            replicas: 1
            template:
               spec:
                restartPolicy: OnFailure
                containers:
                - image: public.ecr.aws/hpc-cloud/nccl-tests:latest
                  imagePullPolicy: IfNotPresent
                  name: test-nccl-launcher
                  env:
                   - name: PATH
                     value: $PATH:/opt/amazon/efa/bin:/usr/bin
                  command:
                  - /opt/amazon/openmpi/bin/mpirun
                  - --allow-run-as-root
                  - --tag-output
                  - -np
                  - "16"
                  - -N
                  - "8"
                  - --bind-to
                  - none
                  - -x
                  - PATH
                  - -x
                  - LD_LIBRARY_PATH
                  - -x
                  - NCCL_DEBUG=INFO
                  - -x
                  - NCCL_BUFFSIZE=8388608
                  - -x
                  - NCCL_P2P_NET_CHUNKSIZE=524288
                  - -x
                  - NCCL_TUNER_PLUGIN=/opt/amazon/ofi-nccl/lib/x86_64-linux-gnu/libnccl-ofi-tuner.so
                  - --mca
                  - pml
                  - ^cm,ucx
                  - --mca
                  - btl
                  - tcp,self
                  - --mca
                  - btl_tcp_if_exclude
                  - lo,docker0,veth_def_agent
                  - /opt/nccl-tests/build/all_reduce_perf
                  - -b
                  - "8"
                  - -e
                  - "16G"
                  - -f
                  - "2"
                  - -g
                  - "1"
                  - -c
                  - "1"
                  - -n
                  - "100"
          Worker:
            replicas: 2
            template:
              spec:
                nodeSelector:
                  node.kubernetes.io/instance-type: "p5.48xlarge"
                containers:
                - image: public.ecr.aws/hpc-cloud/nccl-tests:latest
                  imagePullPolicy: IfNotPresent
                  name: nccl-tests-worker
                  volumeMounts:
                  - name: shmem
                    mountPath: /dev/shm
                  resources:
                    limits:
                      nvidia.com/gpu: 8
                      hugepages-2Mi: 5120Mi
                      vpc.amazonaws.com/efa: 32
                      memory: 32000Mi
                    requests:
                      nvidia.com/gpu: 8
                      hugepages-2Mi: 5120Mi
                      vpc.amazonaws.com/efa: 32
                      memory: 32000Mi
                volumes:
                - name: shmem
                  hostPath:
                    path: /dev/shm
      ```

   1. Applica i test NCCL: MPIJob

      Invia `MPIJob` applicando il manifesto. Ciò creerà due istanze Amazon EC2 `p5.48xlarge`.

      ```
      kubectl apply -f nccl-tests.yaml
      ```

      Di seguito viene riportato un output di esempio.

      ```
      mpijob.kubeflow.org/nccl-tests created
      ```

   1. Verifica che il processo abbia avviato i pod:

      Visualizza i pod in esecuzione.

      ```
      kubectl get pods
      ```

      Di seguito viene riportato un output di esempio.

      ```
      NAME                             READY   STATUS     RESTARTS   AGE
      nccl-tests-launcher-nbql9    0/1     Init:0/1   0          2m49s
      nccl-tests-worker-0          1/1     Running    0          2m49s
      nccl-tests-worker-1          1/1     Running    0          2m49s
      ```

      L’operatore MPI crea un pod di avvio e 2 pod worker (uno su ciascun nodo).

   1. Verifica che il processo funzioni correttamente con i log:

      Visualizza il log per il pod `nccl-tests-launcher`. Sostituisci *nbql9* con il valore dell'output.

      ```
      kubectl logs -f nccl-tests-launcher-nbql9
      ```

Se il test è stato completato con successo, puoi implementare le applicazioni che utilizzano la libreria NVIDIA per comunicazioni collettive.