Contribuisci a migliorare questa pagina
Per contribuire a questa guida per l’utente, seleziona il link Edit this page on GitHub che si trova nel riquadro destro di ogni pagina.
Esecuzione dei corsi di machine learning su Amazon EKS con Elastic Fabric Adapter
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 MPI (Message Passing Interface) e Machine Learning (ML) e che utilizzano NVIDIA Collective Communications Library (NCCL) possono dimensionare fino a migliaia di CPU o GPU. Di conseguenza, si ottengono le prestazioni delle applicazioni dei cluster HPC on-premise 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
Tipi di istanze con EFA
Il plugin del dispositivo Kubernetes EFA AWS 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 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 GPU NVidia, chip Inferentia AWS
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 nella Guida per l’utente di Amazon EC2.
Interfacce EFA e solo EFA
Un Elastic Fabric Adapter (EFA) è un’interfaccia di rete che combina le funzionalità di un Adattatore elastico di rete (ENA) e un’interfaccia OS-bypass, basata sul protocollo datagramma affidabile scalabile AWS (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 eksctl con nodi dotati di GPU NVidia e interfacce EFA. Non è possibile utilizzare eksctl per creare nodi e gruppi di nodi che utilizzano interfacce solo EFA.
Prerequisiti
-
Un cluster Amazon EKS esistente. Qualora non fosse disponibile un cluster esistente, potrai crearne uno utilizzando Nozioni di base su Amazon EKS. 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
eksctlper creare il gruppo di nodi,eksctlpuò anche creare un cluster per tuo conto. -
La versione
2.12.3o successiva oppure la versione1.27.160o successiva dell’interfaccia a riga di comando AWS (AWS CLI) installata e configurata sul dispositivo o AWS CloudShell. Per verificare la versione attuale, usaaws --version | cut -d / -f2 | cut -d ' ' -f1. I programmi di gestione dei pacchetti, comeyum,apt-geto Homebrew per macOS, spesso sono aggiornati a versioni precedenti dell’AWS CLI. Per installare la versione più recente, consulta Installazione e Configurazione rapida con aws configure nella Guida per l’utente dell’interfaccia a riga di comando AWS. La versione della AWS CLI installata in AWS CloudShell potrebbe anche essere precedente di diverse versioni rispetto alla più recente. Per aggiornarla, consulta Installing AWS CLI to your home directory nella Guida per l’utente di AWS CloudShell. -
Lo strumento a riga di comando
kubectlè installato sul dispositivo o su AWS CloudShell. La versione può essere la stessa o immediatamente precedente o successiva alla versione Kubernetes del cluster. Ad esempio, se la versione del cluster è1.29, puoi usarekubectlversione1.28,1.29o1.30. Per installare o aggiornarekubectl, consulta Impostazione di kubectl e eksctl: -
Prima di avviare i nodi worker che supportano più di un Elastic Fabric Adapter, come ad esempio
p4dop5, è necessario aver installato la versione1.7.10o 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 IP ai pod con CNI di Amazon VPC. -
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
Creazione di un gruppo di nodi
La procedura seguente consente di creare un gruppo di nodi con un gruppo di nodi supportato da p4d.24xlarge con interfacce EFA e GPUDirect RDMA, e di eseguire un test di esempio NVIDIA Collective Communications Library (NCCL) per prestazioni NCCL multi-nodo utilizzando più EFA. L'esempio può essere utilizzato come modello per l'addestramento del deep learning distribuito su Amazon EKS utilizzando più EFA.
-
Determina quali tipi di istanza Amazon EC2 che supportano EFA sono disponibili nella regione AWS in cui desideri implementare i nodi. Sostituisci
codice regionecon la regione AWS in cui desideri implementare il gruppo di nodi.aws ec2 describe-instance-types --region region-code \ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output textQuando implementi i nodi, il tipo di istanza da implementare deve essere disponibile nella regione AWS in cui si trova il cluster.
-
Determina in quali zone di disponibilità è disponibile il tipo di istanza che desideri implementare. In questo tutorial, è utilizzato il tipo di istanza
p5.48xlargee deve essere restituito nell’output per la regione AWS specificata nel passaggio precedente. Quando implementi i nodi in un cluster di produzione, sostituiscip5.48xlargecon 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 textDi seguito viene riportato un output di esempio:
us-west-2a us-west-2c us-west-2bPrendi 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.
-
Crea un gruppo di nodi utilizzando
eksctl. È necessario che la versione0.214.0o quelle successive dello strumento a riga di comandoeksctlsia installata sul dispositivo o su CloudShell AWS. Per l'installazione o l'aggiornamento dieksctl, consulta la sezione Installationnella documentazione di eksctl.-
Copia i contenuti seguenti in un file denominato
efa-cluster.yaml. Sostituire ivalori di esempiocon i propri valori. È possibile sostituirep5.48xlargecon un’istanza diversa; assicurarsi però che i valori peravailabilityZonescorrispondano 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.yamlSe 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.yamlNota
Poiché il tipo di istanza utilizzato in questo esempio ha delle GPU,
eksctlinstalla automaticamente il plugin del dispositivo NVIDIA Kubernetes su ogni istanza per tuo conto durante l’utilizzo di Amazon Linux 2. Ciò non è necessario per Bottlerocket, poiché il plugin del dispositivo NVIDIA è integrato nella variante NVIDIA EKS di Bottlerocket. QuandoefaEnabledè impostato sutruenella configurazione del gruppo di nodi,eksctldistribuirà automaticamente anche il plugin del dispositivo EFA sui nodi.
-
Utilizzo di Bottlerocket con EFA
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 * 2 Mi = 6000 Mi di Huge Pages.
Verifica l’installazione del plugin del dispositivo EFA
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:
-
Controlla lo stato di DaemOnSet:
kubectl get daemonsets -n kube-systemOutput 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 plugin per dispositivi EFA DaemOnSet è in esecuzione su due nodi. Entrambi sono PRONTO e DISPONIBILE.
-
Quindi, verifica i pod creati da DaemOnSet:
kubectl get pods -n kube-system -l name=aws-efa-k8s-device-pluginOutput 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 6m16sI pod dei plugin del dispositivo EFA sono nello stato In esecuzione, a conferma che il plugin è stato distribuito correttamente ed è operativo.
-
Verifica la registrazione delle risorse:
Puoi confermare che la risorsa
vpc.amazonaws.com/efaè registrata con il kubelet descrivendo i nodi:kubectl describe nodesse la risorsa EFA è registrata correttamente, la vedrai elencata nelle risorse di capacità e assegnabilità del nodo. Per esempio:
Capacity: ... vpc.amazonaws.com/efa: 4 Allocatable: ... vpc.amazonaws.com/efa: 4questo output conferma che il nodo riconosce la risorsa EFA, rendendola disponibile per i pod che la richiedono.
(Facoltativo) Test delle prestazioni dell’EFA
Consigliamo di testare la configurazione EFA. È possibile utilizzare i test NCCLaws-samples/awsome-distributed-training su GitHub. I test NCCL
-
Implementa l’operatore MPI Kubeflow:
Per i test NCCL è possibile applicare l'operatore Kubeflow MPI. L'operatore MPI semplifica l'esecuzione della formazione distribuita AllReduce-style su Kubernetes. Per ulteriori informazioni, consultare Operatore MPI
su GitHub. -
Esecuzione del test delle prestazioni NCCL multi-nodo per verificare GPUDirectrRDMA/EFA:
Per verificare le prestazioni NCCL con GPUDirectRDMA su EFA, esegui il test delle prestazioni NCCL standard. Per ulteriori informazioni consultare il repository Test NCCL
su GitHub. Completa i seguenti passaggi per eseguire un test delle prestazioni NCCL a due nodi. Nel processo di test NCCL esemplificativo, ciascun worker richiede otto GPU, 5210Mi di
hugepages-2Mi, quattro EFA e 8000 Mi di memoria, il che significa che ciascun worker consuma tutte le risorse di un’istanzap5.48xlarge.-
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 - 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 i test NCCL MPIJob:
Invia
MPIJobapplicando il manifesto. Ciò creerà due istanze Amazon EC2p5.48xlarge.kubectl apply -f nccl-tests.yamlDi seguito viene riportato un output di esempio:
mpijob.kubeflow.org/nccl-tests created -
Verifica che il processo abbia avviato i pod:
Visualizza i pod in esecuzione.
kubectl get podsDi 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’operatore MPI crea un pod di avvio e 2 pod worker (uno su ciascun nodo).
-
Verifica che il processo funzioni correttamente con i log:
Visualizza il log per il pod
nccl-tests-launcher. Sostituiscinbql9con 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.