Maschinelles Lernen mit Elastic Fabric Adapter - Amazon EKS

Maschinelles Lernen mit Elastic Fabric Adapter

In diesem Thema wird beschrieben, wie Elastic Fabric Adapter (EFA) in Pods integriert werden, die in Ihrem Amazon EKS-Cluster bereitgestellt werden. Elastic Elastic Fabric Adapter (EFA) ist eine Netzwerkschnittstelle für Amazon EC2 Instances, mit der Sie Anwendungen ausführen können, die eine hohe Knotenkommunikation erfordern.AWSaus. Die speziell für die Umgehung von Betriebssystemen entwickelte Hardware-Schnittstelle verbessert die Leistung der instanzübergreifenden Kommunikation, was für die Skalierung dieser Anwendungen von entscheidender Bedeutung ist. Mit EFA können High Performance Computing (HPC) -Anwendungen, die die Message Passing Interface (MPI) und Machine Learning (ML) -Anwendungen verwenden, die NVIDIA Collective Communications Library (NCCL) verwenden, auf Tausende von CPUs oder GPUs skaliert werden. Dadurch erhalten Sie die Anwendungsleistung von lokalen HPC-Clustern mit der bedarfsgerechten Elastizität und Flexibilität derAWSWolke. Durch die Integration von EFA in Anwendungen, die auf Amazon EKS-Clustern ausgeführt werden, können Sie die Zeit für die Durchführung umfangreicher verteilter Schulungsworkloads verkürzen, ohne dass zusätzliche Instances zu Ihrem Cluster hinzugefügt werden müssen. Weitere Informationen zu EFA finden Sie unter Elastic Fabric Adapter.

Das in diesem Thema beschriebene EFA-Plugin unterstützt Amazon EC2 vollständigP4d-Instanzen, die den aktuellen Stand der Technik des verteilten maschinellen Lernens in der Cloud darstellen. EACHp4d.24xlarge-Instanz verfügt über acht NVIDIA A100-GPUs und 400 Gbit/s GPUDirectRDMA über EFA. GPUDirectRDMA ermöglicht Ihnen eine direkte GPU-zu-GPU-Kommunikation über Knoten mit CPU-Bypass, wodurch die kollektive Kommunikationsbandbreite erhöht und die Latenz gesenkt wird. Integration von Amazon EKS und EFA mitP4d-Instances bietet eine nahtlose Methode, um die Vorteile der leistungsstärksten Amazon EC2 Computing-Instance für verteiltes maschinelles Lernen zu nutzen.

Prerequisites

  • Ein vorhandener Amazon EKS-Cluster von 1.19 oder höher. Wenn Sie nicht über einen Cluster verfügen, verwenden Sie eines unsererErste Schritte mit Amazon EKS-Hilfslinien erstellen Sie eines. Ihr Cluster muss in einer VPC bereitgestellt werden, in der mindestens ein privates Subnetz mit genügend verfügbaren IP-Adressen zum Bereitstellen von Knoten vorhanden sind. Das private Subnetz muss über einen ausgehenden Internetzugang verfügen, der von einem externen Gerät, z. B. einem NAT-Gateway, bereitgestellt wird.

    Wenn Sie planen,eksctl, um Ihre Knotengruppe zu erstellen,eksctlkann auch einen 1.19-Cluster für Sie erstellen.

  • DieAWS CLIVersion 2.2.37 oder höher oder 1.20.40 oder höher installiert und konfiguriert auf Ihrem Computer oderAWS CloudShellaus. Weitere Informationen finden Sie unterInstallation, Aktualisierung und Deinstallation vonAWS CLIundSchnellkonfiguration mitaws configureimAWS Command Line Interface-Benutzerhandbuch.

  • Kubectl-Version oder höher ist auf Ihrem Computer installiert oderAWS CloudShellaus. Informationen zum Installieren oder Aktualisieren von kubectl finden Sie unter Installieren von kubectl.

  • Sie müssen die VPC CNI Version 1.7.10 installiert haben, bevor Sie Workerknoten starten, die mehrere Elastic Fabric Adapter unterstützen, z. B.p4d.24xlargeaus. Weitergehende Informationen zum Aktualisieren auf die aktuelle Version finden Sie unter Aktualisieren des selbstverwalteten Amazon-VPC-CNI-Add-ons.

Knotengruppen erstellen

Mithilfe des folgenden Verfahrens können Sie eine Knotengruppe mit einemp4d.24xlargeunterstützte Knotengruppe mit EFA-Schnittstellen und GPUDirect RDMA, und führen Sie einen Beispieltest für NVIDIA Collective Communications Library (NCCL) für Multi-Node-NCCL-Performance mit EFAs aus. Das Beispiel kann eine Vorlage für verteilte Deep-Learning-Schulungen auf Amazon EKS mit EFAs verwendet werden.

  1. Bestimmen Sie, in welchen Availability Zones Amazon EC2 Instances, die EFA unterstützen, für die Region verfügbar sind, in der sich Ihr Cluster befindet

    1. Bestimmen Sie, welche Amazon EC2 Instance-Typen, die EFA unterstützen, in der Region verfügbar sind, in der sich Ihr Cluster befindet.

      aws ec2 describe-instance-types \ --region us-west-2 \ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" \ --output text
    2. Bestimmen Sie, in welchen Availability Zones die Instanz, die Sie aus der vorherigen Ausgabe auswählen, verfügbar ist.

      aws ec2 describe-instance-type-offerings \ --location-type availability-zone \ --filters Name=instance-type,Values=p4d.24xlarge \ --region us-west-2 \ --output table

      Der Name der Availability Zone ist imLocation-Spalte der -Ausgabe, die vom vorherigen Befehl zurückgegeben wurde.

  2. Erstellen Sie eine Knotengruppe miteksctloder dieAWS CLIundAWS CloudFormationaus.

    eksctl

    Prerequisite

    Eksctl-Version 0.67.0 oder höher ist auf Ihrem Computer installiert oderAWS CloudShellaus. Informationen zum Installieren oder Aktualisieren von eksctl finden Sie unter Das eksctl-Befehlszeilen-Dienstprogramm.

    1. Fügen Sie eine Datei namens efa-cluster.yaml mit dem folgenden Inhalt hinzu. Ersetzen Sie die Beispielwerte durch eigene Werte. Sie können ersetzenp4d.24xlargemit einer anderen Instanz, aber wenn Sie dies tun, stellen Sie sicher, dass die Werte füravailabilityZonessind Availability Zones, die in Schritt 1 für den Instance-Typ zurückgegeben wurden.

      apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-efa-cluster region: us-west-2 version: "1.19" 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. Erstellen einer verwalteten Knotengruppe in einem vorhandenen Cluster

      eksctl create nodegroup -f efa-cluster.yaml

      Wenn Sie nicht über einen Cluster verfügen, können Sie den folgenden Befehl ausführen, um einen Cluster und die Knotengruppe zu erstellen.

      eksctl create cluster -f efa-cluster.yaml
    AWS CLI and AWS CloudFormation

    Es gibt mehrere Anforderungen für EFA-Netzwerke, einschließlich der Erstellung einer EFA-spezifischen Sicherheitsgruppe, der Erstellung eines Amazon EC2Platzierungsgruppe, und erstellen Sie eine Startvorlage, die eine oder mehrere EFA-Schnittstellen angibt und die EFA-Treiberinstallation als Teil der Amazon EC2 Benutzerdaten enthält. Weitere Informationen zu EFA-Anforderungen finden Sie unter.Erste Schritte mit EFA und MPI-Instances finden Sie im Amazon EC2 Benutzerhandbuch für Linux-Instances. Die folgenden Schritte erstellen all dies für Sie. Ersetzen Sie die Beispielwerte durch eigene Werte.

    1. Legen Sie einige Variablen fest, die in späteren Schritten verwendet werden. Ersetzen Sie alleexample valuesMit Ihrem eigenen. Ersetzen Sie alle my-cluster-Zeichenfolgen durch den genauen Namen Ihres Clusters. Der Wert fürnode_group_resources_namewird später verwendet, um eineAWS CloudFormationStapel. Der Wert fürnode_group_nameEs wird zu einem späteren Zeitpunkt verwendet, um die Knotengruppe in Ihrem Cluster zu erstellen.

      cluster_name="my-cluster" cluster_region="us-west-2" node_group_resources_name="my-efa-nodegroup-resources" node_group_name="my-efa-nodegroup"
    2. Identifizieren Sie ein privates Subnetz in Ihrer VPC, das sich in derselben Availability Zone befindet, in der der Instance-Typ bereitgestellt werden soll.

      1. Rufen Sie die Version des Clusters ab und speichern Sie sie in einer Variablen für die Verwendung in einem späteren Schritt.

        cluster_version=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.version" \ --output text)
      2. Rufen Sie die VPC ID ab, in der sich Ihr Cluster befindet, und speichern Sie sie in einer Variablen für die Verwendung in einem späteren Schritt.

        vpc_id=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.resourcesVpcConfig.vpcId" \ --output text)
      3. Rufen Sie die ID der Kontrollebenensicherheitsgruppe für den Cluster ab, und speichern Sie sie in einer Variablen für die Verwendung in einem späteren Schritt.

        control_plane_security_group=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.resourcesVpcConfig.clusterSecurityGroupId" \ --output text)
      4. Rufen Sie die Liste der Subnetz-IDs in Ihrer VPC ab, die sich in einer Availability Zone befinden, die in Schritt 1 zurückgegeben wird.

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

        Wenn keine Ausgabe zurückgegeben wird, versuchen Sie es mit einer anderen Availability Zone, die in Schritt 1 zurückgegeben wird. Wenn sich keines Ihrer Subnetze in einer Availability Zone befindet, die in Schritt 1 zurückgegeben wird, müssen Sie ein Subnetz in einer Availability Zone erstellen, die in Schritt 1 zurückgegeben wird. Wenn Sie in Ihrer VPC keinen Platz zum Erstellen eines anderen Subnetzes haben, müssen Sie möglicherweise einen neuen Cluster in einer neuen VPC erstellen.

      5. Um zu ermitteln, ob das Subnetz ein privates Subnetz ist, überprüfen Sie die Routing-Tabelle für das Subnetz.

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

        Ausgabe

        local

        Wenn die Ausgabelocal igw-02adc64c1b72722e2ist, ist das Subnetz ein öffentliches Subnetz. Sie müssen ein privates Subnetz in einer Availability Zone auswählen, die in Schritt 1 zurückgegeben wird. Wenn Sie ein privates Subnetz identifiziert haben, notieren Sie die ID zur Verwendung in einem späteren Schritt.

      6. Legen Sie eine Variable mit der ID des privaten Subnetzes aus dem vorherigen Schritt für die Verwendung in späteren Schritten fest.

        subnet_id=your-subnet-id
    3. Laden Sie die Vorlage für AWS CloudFormation herunter.

      curl -o efa-p4d-managed-nodegroup.yaml https://raw.githubusercontent.com/aws-samples/aws-efa-eks/main/cloudformation/efa-p4d-managed-nodegroup.yaml
    4. Kopieren Sie den folgenden Text auf Ihren Computer. Ersetzenp4d.24xlargeMit einem Instanztyp aus Schritt 1 erstellen. ErsetzenSubnetz-0d403852a65210a29durch die ID des privaten Subnetzes, das Sie in Schritt 2.b.v identifiziert haben. Ersetzen-zu-downloaded-cfn-templatemit dem Pfad zumefa-p4d-managed-nodegroup.yaml, die Sie im vorherigen Schritt heruntergeladen haben. ErsetzenIhr-öffentlich-schlüssel-namemit dem Namen Ihres öffentlichen Schlüssels. Nachdem Sie die Ersetzungen vorgenommen haben, führen Sie den geänderten Befehl aus.

      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. Bestimmen Sie, wann der Stack, den Sie im vorherigen Schritt bereitgestellt haben, bereitgestellt wird.

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

      Es gibt keine Ausgabe des vorherigen Befehls, aber Ihre Shell-Eingabeaufforderung wird erst zurückgegeben, wenn der Stapel erstellt wurde.

    6. Erstellen Sie Ihre Knotengruppe mit den Ressourcen, die von derAWS CloudFormation-Stack im vorherigen Schritt.

      1. Abrufen von Informationen aus dem bereitgestelltenAWS CloudFormationstapeln und in Variablen speichern.

        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. Erstellen Sie eine verwaltete Knotengruppe, die die Startvorlage und die Knoten-IAM-Rolle verwendet, die im vorherigen Schritt erstellt wurden.

        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. Bestätigen Sie, dass die Knoten erstellt wurden.

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

        Fahren Sie nicht fort, bis der vom vorherigen Befehl zurückgegebene Status lautetACTIVEaus. Es kann einige Minuten dauern, bis die Knoten bereit sind.

    7. Stellen Sie das EFA Kubernetes Geräte-Plugin bereit.

      Das EFA Kubernetes Geräte-Plugin erkennt und bewirbt EFA-Schnittstellen als zuweisbare Ressourcen für Kubernetes. Eine Anwendung kann den erweiterten Ressourcentypvpc.amazonaws.com/efain einer Pod-Anforderungsspezifikation genau wie CPU und Speicher. Weitere Informationen finden Sie unter Managing Compute Resources for Containers in der Kubernetes-Dokumentation. Einmal angefordert, weist das Plugin automatisch eine EFA-Schnittstelle zu und mountet es dem Pod. Die Verwendung des Geräte-Plugins vereinfacht die EFA-Setup und erfordert keinen Pod, um im privilegierten Modus ausgeführt zu werden.

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/aws-efa-eks/main/manifest/efa-k8s-device-plugin.yml
    8. Wenn Sie einen Instanztyp mit einer GPU bereitgestellt haben, stellen Sie das NVIDIA Kubernetes-Geräte-Plugin bereit.

      kubetl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml

(Optional) Bereitstellen einer EFA-kompatiblen Beispielanwendung

Bereitstellen des Kubeflow-MPI-Operators

Für die NCCL-Tests können Sie den Kubeflow MPI Operator anwenden. Der MPI Operator macht es einfach, auf Kubernetes verteilte Schulungen im Allreduce-Stil durchzuführen. Weitere Informationen finden Sie unterMPI-Operatorauf GitHub:

kubectl apply -f https://raw.githubusercontent.com/kubeflow/mpi-operator/master/deploy/v1alpha2/mpi-operator.yaml

Führen Sie den NCCL-Leistungstest mit mehreren Knoten aus, um GPUDirectRDMA/EFA zu überprüfen

Um die NCCL-Leistung mit GpuDirectRdma über EFA zu überprüfen, führen Sie den standardmäßigen NCCL-Leistungstest aus. Weitere Informationen finden Sie im offiziellen.NCCL-Tests-Repoauf GitHub. Sie können das BeispielDockerfileDas beinhaltet diesen Test, der bereits für CUDA 11.2 und die neueste EFA-Version erstellt wurde.

Alternativ können Sie eineAWSDocker-Image, das über einAmazon ECR-Repoaus.

Wichtig

Eine wichtige Überlegung, die für die Übernahme von EFA mit Kubernetes erforderlich ist, ist die Konfiguration und Verwaltung von Huge Pages als Ressource im Cluster. Weitere Informationen finden Sie unter Storage Classes in der Kubernetes-Dokumentation. Amazon EC2 Instances mit dem installierten EFA-Treiber weisen 5128 2M Huge Pages vor, die Sie als Ressourcen anfordern können, die Sie in Ihren Auftragsspezifikationen verwenden können.

Führen Sie die folgenden Schritte aus, um einen NCCL-Leistungstest mit zwei Knoten auszuführen. Im Beispiel NCCL-Testauftrag fordert jeder Worker acht GPUs, 5210Mi HugePages-2MI, vier EFAs und 8000Mi Speicher an, was effektiv bedeutet, dass jeder Worker alle Ressourcen einesp4d.24xlargesein.

  1. Erstellen Sie den NCCL-Tests-Auftrag.

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

    Ausgabe

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

  2. Sehen Sie sich Ihre laufenden Pods an.

    kubectl get pods

    Ausgabe

    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

    Der MPI-Operator erstellt einen Launcher-Pod und 2 Worker Pods (einen auf jedem Knoten).

  3. Zeigen Sie das Protokoll für dieefa-launcherpod. Ersetzenwzr8jmit dem Wert aus Ihrer Ausgabe.

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

Weitere Beispiele finden Sie im Amazon EKSEFA-Proben-Repository auf GitHub verfügbar ist.