Formazione del Machine learning utilizzando Elastic Fabric Adapter - Amazon EKS

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

Formazione del Machine learning utilizzando Elastic Fabric Adapter

In questa sezione viene descritto come integrare Elastic Fabric Adapter (EFA) con i Pods 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 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.

Il plugin EFA descritto in questo argomento supporta pienamente istanze Amazon EC2 P4d, che rappresentano l'attuale stato dell'arte nel machine learning distribuito nel cloud. Ciascun istanza p4d.24xlarge ha otto GPU NVIDIA A100 e GPUDirectRDMA a 400 Gbps su EFA. GPUDirectRDMA consente di avere una comunicazione diretta da GPU a GPU tra i nodi con bypass della CPU, aumentando la larghezza di banda di comunicazione collettiva e riducendo la latenza. L'integrazione di Amazon EKS e EFA con istanze P4d offre un metodo ottimale per sfruttare l'istanza di elaborazione Amazon EC2 dalle prestazioni più elevate per l'addestramento del machine learning distribuito.

Prerequisiti
  • Un cluster Amazon EKS esistente. Se non disponi di un cluster esistente, consulta una delle guide Guida introduttiva ad Amazon EKS per crearne uno. 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 di AWS Command Line Interface (AWS CLI) installato e configurato sul dispositivo o. AWS CloudShell Per verificare la versione attuale, usa aws --version | cut -d / -f2 | cut -d ' ' -f1. I programmi di gestione dei pacchetti, come yum, apt-get o Homebrew per macOS, spesso sono aggiornati a versioni precedenti della AWS CLI. Per installare la versione più recente, consulta le sezioni Installazione, aggiornamento e disinstallazione della AWS CLI e Configurazione rapida con aws configure nella Guida per l'utente dell'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 tua 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 oppure immediatamente precedente o successiva alla versione Kubernetes del cluster. Ad esempio, se la versione del cluster è 1.28, puoi usare kubectl versione 1.27, 1.28 o 1.29. Per installare o aggiornare kubectl, consulta Installazione o aggiornamento di kubectl:

  • Prima di avviare i nodi worker che supportano più di un Elastic Fabric Adapter, come ad esempio p4d.24xlarge, è necessario disporre della versione 1.7.10 di Amazon VPC CNI plugin for Kubernetes. Per ulteriori informazioni sull'aggiornamento della versione del Amazon VPC CNI plugin for Kubernetes, consulta Utilizzo del componente aggiuntivo Amazon VPC CNI plugin for Kubernetes di Amazon EKS.

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.

  1. Determina quali tipi di istanze Amazon EC2 che supportano EFA sono disponibili nei Regione AWS nodi in cui desideri implementare. Sostituiscilo region-code con Regione AWS quello in cui desideri distribuire il tuo 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 nel cluster in Regione AWS cui si trova il cluster.

  2. Determina in quali zone di disponibilità è disponibile il tipo di istanza che desideri implementare. In questo tutorial, viene utilizzato il tipo di p4d.24xlarge 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 p4d.24xlarge 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 \ --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.

  3. Crea un gruppo di nodi utilizzando uno dei due eksctl o il comando AWS CLI e AWS CloudFormation.

    eksctl
    Prerequisito

    La versione 0.171.0 o quelle successive dello strumento a riga di comando eksctl deve essere installata sul dispositivo o nella AWS CloudShell. Per l'installazione o l'aggiornamento di eksctl, consulta la sezione Installation nella documentazione di eksctl.

    1. Copia i contenuti seguenti in un file denominato efa-cluster.yaml. Sostituisci i example values con i valori in tuo possesso. Puoi sostituire p4d.24xlarge 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: p4d.24xlarge minSize: 1 desiredCapacity: 2 maxSize: 3 availabilityZones: ["us-west-2a"] volumeSize: 300 privateNetworking: true efaEnabled: true
    2. 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 ha delle GPU, eksctl installa automaticamente il plugin del dispositivo NVIDIA Kubernetes su ogni istanza per tuo conto.

    AWS CLI and AWS CloudFormation

    Esistono diversi requisiti per le reti EFA, tra cui la creazione di un gruppo di sicurezza specifico EFA, la creazione di un gruppo di collocamento Amazon EC2 e la creazione di un modello di avvio che specifica una o più interfacce EFA e include l'installazione dei driver EFA nell'ambito dei dati utente Amazon EC2. Per ulteriori informazioni sui requisiti EFA, consulta Nozioni di base su EFA e MPI nella Guida per l'utente di Amazon EC2 per le istanze Linux. Le seguenti fasi creano tutto ciò per tuo conto. Sostituisci i valori di esempio con i valori in tuo possesso.

    1. Imposta alcune variabili utilizzate nelle fasi successive. Sostituisci tutti i example values con i valori in tuo possesso. Sostituisci tutte le stringhe my-cluster con il nome del cluster esistente. Il valore di node_group_resources_name viene successivamente utilizzato per creare uno AWS CloudFormation stack. Il valore per node_group_name viene utilizzato in seguito per creare il gruppo di nodi nel cluster.

      cluster_name="my-cluster" cluster_region="region-code" node_group_resources_name="my-efa-nodegroup-resources" node_group_name="my-efa-nodegroup"
    2. Identificare una sottorete privata nel VPC, e verificare che si trovi e sia disponibile nella stessa zona di disponibilità in cui si desidera implementare il tipo di istanza.

      1. Recuperare la versione del cluster e memorizzarla in una variabile da utilizzare in un passaggio successivo.

        cluster_version=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.version" \ --output text)
      2. Recuperare l'ID VPC in cui si trova il cluster e memorizzarlo in una variabile per utilizzarlo in un passaggio successivo.

        vpc_id=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.resourcesVpcConfig.vpcId" \ --output text)
      3. Recuperare l'ID del gruppo di sicurezza del piano di controllo per il cluster e memorizzarlo in una variabile da utilizzare in un passaggio successivo.

        control_plane_security_group=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.resourcesVpcConfig.clusterSecurityGroupId" \ --output text)
      4. Ottenere l'elenco degli ID sottorete nel VPC che si trovano in una zona di disponibilità restituita al passaggio 1.

        aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=$vpc_id" "Name=availability-zone,Values=us-west-2a" \ --query 'Subnets[*].SubnetId' \ --output text

        Se non viene restituito alcun output, provare con una zona di disponibilità diversa nel passaggio 1. Se nessuna delle sottoreti si trova in una zona di disponibilità restituita nella fase 1, è necessario creare una sottorete in una zona di disponibilità restituita nella fase 1. Se il VPC non dispone di spazio per creare un'altra sottorete,ìpuoi aggiungere un blocco CIDR al VPC e creare sottoreti nel nuovo blocco CIDR o creare un nuovo cluster in un nuovo VPC.

      5. Controllando la tabella di routing della sottorete, verifica se la sottorete è privata.

        aws ec2 describe-route-tables \ --filter Name=association.subnet-id,Values=subnet-0d403852a65210a29 \ --query "RouteTables[].Routes[].GatewayId" \ --output text

        Di seguito viene riportato un output di esempio:

        local

        Se l'output è local igw-02adc64c1b72722e2, la sottorete è pubblica. È necessario selezionare una sottorete privata in una zona di disponibilità restituita al passaggio 1. Dopo aver identificato una sottorete privata, annotare il relativo ID da utilizzare in un passaggio successivo.

      6. Impostare una variabile con l'ID della sottorete privata del passaggio precedente per utilizzarla nei passaggi successivi.

        subnet_id=your-subnet-id
    3. Scarica il AWS CloudFormation modello.

      curl -O https://raw.githubusercontent.com/aws-samples/aws-efa-eks/main/cloudformation/efa-p4d-managed-nodegroup.yaml
    4. Copia il testo seguente sul computer. Sostituisci p4d.24xlarge con un tipo di istanza dal passaggio 1. Sostituisci subnet-0d403852a65210a29 con l'ID della sottorete privata identificata nella fase 2.b.v. Sostituisci path-to-downloaded-cfn-template con il percorso per il efa-p4d-managed-nodegroup.yaml scaricato nella fase precedente. Sostituisci your-public-key-name con il nome della chiave pubblica. Dopo aver effettuato le sostituzioni, esegui il comando modificato.

      aws cloudformation create-stack \ --stack-name ${node_group_resources_name} \ --capabilities CAPABILITY_IAM \ --template-body file://path-to-downloaded-cfn-template \ --parameters \ ParameterKey=ClusterName,ParameterValue=${cluster_name} \ ParameterKey=ClusterControlPlaneSecurityGroup,ParameterValue=${control_plane_security_group} \ ParameterKey=VpcId,ParameterValue=${vpc_id} \ ParameterKey=SubnetId,ParameterValue=${subnet_id} \ ParameterKey=NodeGroupName,ParameterValue=${node_group_name} \ ParameterKey=NodeImageIdSSMParam,ParameterValue=/aws/service/eks/optimized-ami/${cluster_version}/amazon-linux-2-gpu/recommended/image_id \ ParameterKey=KeyName,ParameterValue=your-public-key-name \ ParameterKey=NodeInstanceType,ParameterValue=p4d.24xlarge
    5. Determinare il momento in cui la pila implementata nel passaggio precedente viene implementato.

      aws cloudformation wait stack-create-complete --stack-name $node_group_resources_name

      Non c'è output dal comando precedente, ma il prompt della shell non viene restituito fino a quando non viene creara la pila.

    6. Creare il gruppo di nodi utilizzando le risorse create dalla pila AWS CloudFormation nel passaggio precedente.

      1. Recupera le informazioni dallo AWS CloudFormation stack distribuito e memorizzale in variabili.

        node_instance_role=$(aws cloudformation describe-stacks \ --stack-name $node_group_resources_name \ --query='Stacks[].Outputs[?OutputKey==`NodeInstanceRole`].OutputValue' \ --output text) launch_template=$(aws cloudformation describe-stacks \ --stack-name $node_group_resources_name \ --query='Stacks[].Outputs[?OutputKey==`LaunchTemplateID`].OutputValue' \ --output text)
      2. Creare un gruppo di nodi gestiti che utilizzi il modello di avvio e il ruolo IAM del nodo creati nel passaggio precedente.

        aws eks create-nodegroup \ --cluster-name $cluster_name \ --nodegroup-name $node_group_name \ --node-role $node_instance_role \ --subnets $subnet_id \ --launch-template id=$launch_template,version=1
      3. Confermare che i nodi siano stati creati.

        aws eks describe-nodegroup \ --cluster-name ${cluster_name} \ --nodegroup-name ${node_group_name} | jq -r .nodegroup.status

        Non continuare finché lo stato restituito dal comando precedente non è ACTIVE. Possono essere necessari diversi minuti prima che i nodi siano pronti.

    7. Se si sceglie un tipo di istanza GPU, è necessario implementare ilPlugin per dispositivi NVIDIA perKubernetes. Sostituisci vX.X.X con la versione di s-device-pluginNvidia/K8 desiderata prima di eseguire il seguente comando.

      kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/nvidia-device-plugin.yml
  4. Implementa il plugin per dispositivi EFA Kubernetes.

    Il plugin per dispositivi EFA Kubernetes rileva e pubblicizza le interfacce EFA come risorse allocabili a Kubernetes. Un'applicazione può consumare il tipo di risorsa estesa vpc.amazonaws.com/efa in una specifica di richiesta Pod proprio come CPU e memoria. Per ulteriori informazioni, consulta Manage Huge Pages (Utilizzo di risorse estese) nella documentazione di Kubernetes. Una volta effettuata la richiesta, il plugin assegna e monta in automatico un'interfaccia EFA sul Pod. L'utilizzo del plugin per dispositivi semplifica la configurazione EFA e non richiede l'esecuzione di un Pod in modalità privilegiata.

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/aws-efa-eks/main/manifest/efa-k8s-device-plugin.yml

(Facoltativo) Implementazione di un'applicazione compatibile con EFA di esempio

Implementare 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, consulta Operatore MPI su GitHub.

kubectl apply -f https://raw.githubusercontent.com/kubeflow/mpi-operator/master/deploy/v2beta1/mpi-operator.yaml
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, consulta il repository Test NCCL ufficiale su GitHub. È possibile utilizzare il Dockerfile di esempio fornito con questo test già creato per NVIDIA CUDA 11.2 e per l'ultima versione di EFA.

In alternativa, puoi scaricare un' AWS Dockerimmagine disponibile da un repository Amazon ECR.

Importante

Un importante aspetto da considerare per l'adozione di EFA con Kubernetes è la configurazione e la gestione di Huge Pages come risorsa nel cluster. Per ulteriori informazioni, consulta Manage Huge Pages (Gestione di Huge Pages) nella documentazione di Kubernetes. Le istanze Amazon EC2 con il driver EFA installato allocano in via anticipata 5.128 Huge Pages da 2M, che possono essere richieste come risorse da utilizzare nelle specifiche del processo.

Completa i seguenti passaggi per eseguire un test delle prestazioni NCCL a due nodi. Nel processo di test NCCL di esempio, ogni worker richiede otto GPU, 5210Mi di HugePages-2Mi, quattro EFA e 8000Mi di memoria, il che significa che ogni worker consuma tutte le risorse di un'istanza p4d.24xlarge.

  1. Crea il processo di test NCCL.

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/aws-efa-eks/main/examples/simple/nccl-efa-tests.yaml

    Di seguito viene riportato un output di esempio:

    nccl-tests-efa mpijob.kubeflow.org/ creato

  2. Visualizza i Pods in esecuzione.

    kubectl get pods

    Di seguito viene riportato un output di esempio:

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

    L'operatore MPI crea un Pod di avvio e 2 Pods worker (uno su ciascun nodo).

  3. Visualizza il log per il Pod efa-launcher. Sostituisci wzr8j con il valore dell'output.

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

Per altri esempi, consulta il repository Esempi di EFA per Amazon EKS su GitHub.