Aiutaci a migliorare questa pagina
Vuoi contribuire a questa guida per l'utente? Scorri fino alla fine di questa pagina e seleziona Modifica questa pagina su GitHub. I tuoi contributi contribuiranno a rendere la nostra guida utente migliore per tutti.
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à.
Esegui corsi di formazione sull'apprendimento automatico su Amazon EKS con Elastic Fabric Adapter
Questo argomento descrive come integrare Elastic Fabric Adapter (EFA) con Pods distribuito nel tuo EKS cluster Amazon. Elastic Fabric Adapter (EFA) è un'interfaccia di rete per EC2 istanze Amazon che consente di eseguire applicazioni che richiedono alti livelli di comunicazioni tra nodi su larga scala. AWS La sua interfaccia hardware di bypass del sistema operativo personalizzata migliora le prestazioni delle comunicazioni tra istanze, che è fondamentale per dimensionare queste applicazioni. ConEFA, 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 CPUs oGPUs. Di conseguenza, si ottengono le prestazioni applicative dei HPC cluster locali con l'elasticità e la flessibilità on-demand del cloud. AWS L'integrazione EFA con le applicazioni in esecuzione su EKS cluster Amazon 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 Elastic Fabric EFA Adapter.
Tipi di istanze con EFA
Il AWS EFAKubernetes Device Plugin supporta tutti i tipi di EC2 istanze Amazon che dispongono di. EFA Per visualizzare un elenco di tutti i tipi di istanze disponibiliEFA, consulta la sezione Tipi di istanze supportati nella Amazon EC2 User Guide. Tuttavia, per eseguire rapidamente le applicazioni ML, consigliamo che un'istanza disponga di chip di accelerazione hardware come nVidia GPUs, AWS Inferentia
Nel confrontare i tipi di istanza per scegliere tra di essi, considera il numero di schede di EFA rete disponibili per quel tipo di istanza, nonché il numero di schede di accelerazione, la quantità e la quantità di CPU memoria. È possibile assegnarne fino a una EFA per scheda di rete. E EFA conta come interfaccia di rete. Per vedere quante EFA sono disponibili per ogni tipo di istanzaEFA, consulta l'elenco delle schede di rete nella Amazon EC2 User Guide.
Prerequisiti
-
Un EKS cluster Amazon esistente. Se non disponi di un cluster esistente, consulta una delle guide Inizia a usare Amazon EKS per crearne uno. Il cluster deve essere distribuito in un ambiente VPC che disponga di almeno una sottorete privata con un numero sufficiente di indirizzi IP disponibili in cui distribuire i nodi. La sottorete privata deve disporre dell'accesso a 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 versione1.27.160
o successiva di AWS Command Line Interface (AWS CLI) installato e configurato sul dispositivo o. AWS CloudShell Per verificare la versione attuale, usa
. Package manager comeaws --version | cut -d / -f2 | cut -d ' ' -f1
yum
apt-get
, o Homebrew for macOS sono spesso presenti diverse versioni precedenti alla versione più recente di AWS CLI. Per installare la versione più recente, vedere Installazione, aggiornamento e disinstallazione di AWS CLI e Configurazione rapida con aws configure nella Guida per l'utente di AWS Command Line Interface . La AWS CLI versione installata in AWS CloudShell potrebbe anche contenere diverse versioni precedenti alla versione più recente. Per aggiornarla, consulta Installazione nella home directory nella Guida AWS CLI per l'AWS CloudShell utente. -
Lo strumento a riga di comando
kubectl
è installato sul dispositivo o AWS CloudShell. La versione può essere uguale o superiore a una versione secondaria precedente o successiva alla Kubernetes versione del cluster. Ad esempio, se la versione del cluster è1.30
, puoi usarekubectl
versione1.29
,1.30
o1.31
. Per installare o aggiornarekubectl
, consulta Configurazione kubectl e eksctl: -
Devi avere il Amazon VPC CNI plugin for Kubernetes versione
1.7.10
o successiva installata prima del lancio dei nodi di lavoro che supportano più Elastic Fabric Adapter, come o.p4d
p5
Per ulteriori informazioni sull'aggiornamento del Amazon VPC CNI plugin for Kubernetes versione, vediAssegna IPs a Pods con Amazon VPC CNI.
Importante
Una considerazione importante richiesta per l'adozione con EFA Kubernetes è la configurazione e la gestione Huge Pages come risorsa nel cluster. Per ulteriori informazioni, consulta Gestire pagine enormi
Creazione di un gruppo di nodi
La procedura seguente ti aiuta a creare un gruppo di nodi con un gruppo di nodi p4d.24xlarge
supportato con EFA interfacce e GPUDirect RDMA a eseguire un esempio di test di NVIDIA Collective Communications Library () NCCL per le prestazioni multinodo. NCCL EFAs L'esempio può essere utilizzato come modello per la formazione distribuita di deep learning su Amazon EKS utilizzandoEFAs.
-
Determina quali tipi di EC2 istanze Amazon supportati EFA sono disponibili nei nodi in cui desideri distribuire. Regione AWS Sostituiscilo
con Regione AWS quello in cui desideri distribuire il tuo gruppo di nodi.region-code
aws ec2 describe-instance-types --region
region-code
\ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output textQuando si distribuiscono i nodi, il tipo di istanza che si desidera distribuire deve essere disponibile nel cluster in Regione AWS cui si trova.
-
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 Regione AWS che deve essere restituito nell'output per quanto specificato nel passaggio precedente. Quando distribuisci i nodi in un cluster di produzione, sostituiscili
con qualsiasi tipo di istanza restituito nel passaggio precedente.p5.48xlarge
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 textDi 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 si distribuiscono nodi in un cluster, è VPC necessario che nell'output vengano restituite sottoreti con indirizzi IP disponibili in una delle zone di disponibilità.
-
Crea un gruppo di nodi utilizzando.
eksctl
Prerequisito
La versione
0.191.0
o quelle successive dello strumento a riga di comandoeksctl
deve essere installata sul dispositivo o nella AWS CloudShell. Per l'installazione o l'aggiornamento dieksctl
, consulta la sezione Installationnella documentazione di eksctl
.-
Copia i contenuti seguenti in un file denominato
. Sostituisci iefa-cluster.yaml
con i valori in tuo possesso. Puoi sostituireexample values
con un'istanza diversa, ma in questo caso assicurati che i valori perp5.48xlarge
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 -
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 lo haGPUs, installa
eksctl
automaticamente il plug-in del dispositivo NVIDIA Kubernetes su ogni istanza per te.
-
-
Implementa il plug-in del dispositivo Kubernetes. EFA
Il plug-in del dispositivo EFA Kubernetes rileva e pubblicizza le interfacce come risorse allocabili a Kubernetes. EFA Un'applicazione può utilizzare il tipo
vpc.amazonaws.com/efa
di risorsa esteso in un Pod richiedi specifiche proprio come CPU e memoria. Per ulteriori informazioni, consulta Consumo di risorse estesenel Kubernetes documentazione. Una volta richiesto, il plugin assegna e monta automaticamente un'EFAinterfaccia al Pod. L'utilizzo del plug-in del dispositivo semplifica la EFA configurazione e non richiede un Pod per funzionare in modalità privilegiata. helm repo add eks https://aws.github.io/eks-charts helm install aws-efa-k8s-device-plugin --namespace kube-system eks/aws-efa-k8s-device-plugin
(Facoltativo) Verifica le prestazioni del EFA
Ti consigliamo di testare la EFA configurazione. È possibile utilizzare i NCCLtestaws-samples/awsome-distributed-training
repository su GitHub. NCCLI test
-
Implementa l'operatore Kubeflow MPI
Per i NCCL test puoi applicare Kubeflow Operator. MPI The MPI Operator semplifica l'esecuzione di corsi di formazione distribuiti in stile AllReduce su Kubernetes. Per ulteriori informazioni, consulta Operator on MPI
GitHub. -
Esegui il test NCCL delle prestazioni a più nodi per verificare GPUDirectRDMA/EFA
Per verificare NCCL le prestazioni con GPUDirectRDMA terminatoEFA, esegui il test NCCL delle prestazioni standard. Per ulteriori informazioni, consulta il repository ufficiale NCCL-Tests
su GitHub. Completa i seguenti passaggi per eseguire due nodi NCCL Performance Test. Nell'esempio NCCL test job, ogni lavoratore richiede ottoGPUs, 5210 Mi
hugepages-2Mi
, quattro e 8000 Mi di memoriaEFAs, il che significa che in pratica ogni lavoratore consuma tutte le risorse di un'istanza.p5.48xlarge
-
Crea il MPIJob manifest
Copia quanto segue 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 - name: LD_LIBRARY_PATH value: /opt/amazon/openmpi/lib:/opt/nccl/build/lib:/opt/amazon/efa/lib:/opt/aws-ofi-nccl/install/lib:/usr/local/nvidia/lib:$LD_LIBRARY_PATH - name: NCCL_DEBUG value: INFO - name: NCCL_BUFFSIZE value: '8388608' - name: NCCL_P2P_NET_CHUNKSIZE value: '524288' - name: NCCL_TUNER_PLUGIN value: /opt/aws-ofi-nccl/install/lib/libnccl-ofi-tuner.so 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 - -x - NCCL_P2P_NET_CHUNKSIZE - -x - NCCL_TUNER_PLUGIN - --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
-
Applica il NCCL-tests MPIJob
Invia il file
MPIJob
applicando il manifesto. In questo modo verranno create due EC2 istanzep5.48xlarge
Amazon.kubectl apply -f nccl-tests.yaml
Di seguito viene riportato un output di esempio:
mpijob.kubeflow.org/nccl-tests created
-
Verifica che il processo sia iniziato (pod)
Visualizza la tua corsa Pods.
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 2m49sL'MPIoperatore crea un lanciatore Pod e 2 operai Pods (uno per nodo).
-
Verificare che il processo venga eseguito correttamente con i registri
Visualizzate il registro per
nccl-tests-launcher
Pod. Sostituisci
con il valore del tuo output.nbql9
kubectl logs -f nccl-tests-launcher-
nbql9
-
Se il test è stato completato con successo, è possibile distribuire le applicazioni che utilizzano il Nvidia Collective Communication Library.