Ausführung von Machine-Learning-Trainings in Amazon EKS mit Elastic Fabric Adapter - Amazon EKS

Unterstützung für die Verbesserung dieser Seite beitragen

Um zu diesem Benutzerhandbuch beizutragen, klicken Sie auf den Link Diese Seite auf GitHub bearbeiten, der sich im rechten Bereich jeder Seite befindet.

Ausführung von Machine-Learning-Trainings in Amazon EKS 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 Fabric Adapter (EFA) ist eine Netzwerkschnittstelle für Amazon-EC2-Instances, mit der Sie Anwendungen ausführen können, die eine hohe Kommunikation zwischen den Knoten erfordern in einer Größenordunung von AWS Die speziell für die Umgehung von Betriebssystemen entwickelte Hardware-Schnittstelle verbessert die Leistung der Instance-ü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 On-Premises-HPC-Clustern mit der On-Demand-Elastizität und -Flexibilität der AWS-Cloud. 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 Schulungs-Workloads 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.

Instance-Typen mit EFA

Das AWS-EFA-Kubernetes-Geräte-Plugin unterstützt alle Amazon-EC2-Instance-Typen, die über EFA verfügen. Eine Liste aller Instance-Typen, die EFA unterstützen, finden Sie unter Unterstützte Instance-Typen im Amazon-EC2-Benutzerhandbuch. Um ML-Anwendungen schnell ausführen zu können, empfehlen wir jedoch, dass eine Instance zusätzlich zu EFA über Hardware-Beschleunigungs-Chips wie nVidia-GPUs, AWS Inferentia-Chips oder AWS Trainium-Chips verfügt. Eine Liste der Instance-Typen, die über Hardware-Beschleunigungs-Chips und EFA verfügen, finden Sie unter Beschleunigtes Computing im Amazon-EC2-Benutzerhandbuch.

Wenn Sie Instance-Typen vergleichen, um zwischen ihnen zu wählen, berücksichtigen Sie die Anzahl der für diesen Instance-Typ verfügbaren EFA-Netzwerkkarten sowie die Anzahl der Beschleunigerkarten, die CPU-Leistung und die Speichergröße. Sie können bis zu einem EFA pro Netzwerkkarte zuweisen. Ein EFA zählt als Netzwerkschnittstelle. Um zu erfahren, wie viele EFA für jeden Instance-Typ mit EFA verfügbar sind, konsultieren Sie die Liste der Netzwerkkarten im Amazon-EC2-Benutzerhandbuch.

EFA- und reine EFA-Schnittstellen

Ein Elastic Fabric Adapter (EFA) ist eine Netzwerkschnittstelle, welche die Funktionen eines Elastic Network Adapters (ENA) und einer OS-Bypass-Schnittstelle kombiniert und auf dem AWS Scalable Reliable Datagram (SRD)-Protokoll basiert. Die EFA-Funktionen ermöglichen Anwendungen die direkte Kommunikation mit der Hardware für eine latenzarme Übertragung. Sie können über reine EFA-Schnittstellen auf die EFA-Funktionen zugreifen und so die Kommunikation auf Schnittstellen innerhalb derselben Availability Zone beschränken.

Um Knoten mit reinen EFA-Schnittstellen zu erstellen, müssen Sie eine benutzerdefinierte EC2-Startvorlage verwenden und InterfaceType auf efa-only einstellen. In Ihrer benutzerdefinierten Startvorlage können Sie die Netzwerkkarte 0 nicht als reine EFA-Schnittstelle festlegen, da es sich dabei um die primäre Netzwerkkarte und Netzwerkschnittstelle der EC2-Instance handelt. Für reine EFA-Schnittstellen benötigen Sie VPC-CNI-Version 1.18.5 oder höher. Wenn Sie Amazon Linux 2 verwenden, muss die AMI-Version für reine EFA-Schnittstellen v20240928 oder höher sein.

Die folgende Vorgehensweise führt Sie durch die Erstellung eines EKS-Clusters mit eksctl mit Knoten, die über nVidia-GPUs und EFA-Schnittstellen verfügen. Sie können eksctl nicht zum Erstellen von Knoten und Knotengruppen verwenden, die nur EFA-Schnittstellen verwenden.

Voraussetzungen

  • Ein vorhandener Amazon-EKS-Cluster. Wenn Sie keinen vorhandenen Cluster haben, erstellen Sie einen mit Erste Schritte mit Amazon EKS. 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 zu verwenden, um Ihre Knotengruppe zu erstellen, kann eksctl auch einen Cluster für Sie erstellen.

  • Version 2.12.3 oder höher oder die Version 1.27.160 oder höher der AWS-Befehlszeilenschnittstelle (AWS-CLI), die auf Ihrem Gerät oder in AWS CloudShell installiert und konfiguriert sein muss. Um Ihre aktuelle Version zu überprüfen, verwenden Sie aws --version | cut -d / -f2 | cut -d ' ' -f1. Paket-Manager wie yum, apt-get oder Homebrew für macOS sind oft mehrere Versionen hinter der neuesten Version der AWS-CLI. Um die neueste Version zu installieren, lesen Sie Installation und Schnellkonfiguration mit aws configure im Benutzerhandbuch zur AWS-Befehlszeilenschnittstelle. Die in AWS CloudShell installierte AWS-CLI-Version kann auch mehrere Versionen hinter der neuesten Version liegen. Informationen zum Aktualisieren finden Sie unter Installieren der AWS CLI in Ihrem Stammverzeichnis im AWS-CloudShell-Benutzerhandbuch.

  • Das kubectl-Befehlszeilen-Tool ist auf Ihrem Gerät oder in AWS CloudShell installiert. Die Version kann mit der Kubernetes-Version Ihres Clusters identisch sein oder bis zu einer Nebenversion älter oder neuer sein. Wenn Ihre Clusterversion beispielsweise 1.29 ist, können Sie kubectl-Version 1.28, 1.29, oder 1.30 damit verwenden. Informationen zum Installieren oder Aktualisieren von kubectl finden Sie unter kubectl und eksctl einrichten.

  • Sie müssen das Amazon-VPC-CNI-Plugin für die Kubernetes-Version 1.7.10 oder höher installiert haben, bevor Sie Worker-Knoten starten, die mehrere Elastic Fabric Adapter, wie etwa p4d oder p5 unterstützen. Weitere Informationen zum Aktualisieren Ihres Amazon-VPC-CNI-Plugins für die Kubernetes-Version finden Sie unter Zuweisung von IPs zu Pods mit Amazon VPC CNI.

  • Für p6-b200-Instances müssen Sie das EFA-Geräte-Plugin-Version v0.5.6 oder höher verwenden.

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 dazu finden Sie unter Manage Huge Pages 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.

Knotengruppen erstellen

Das folgende Verfahren hilft Ihnen, eine Knotengruppe mit einer p4d.24xlarge gesicherten Knotengruppe mit EFA-Schnittstellen und GPUDirect RDMA zu erstellen und einen Beispieltest der NVIDIA Collective Communications Library (NCCL) für die NCCL-Leistung mit mehreren Knoten unter Verwendung von EFAs durchzuführen Das Beispiel kann eine Vorlage für verteiltes Deep-Learning-Training auf Amazon EKS mit EFAs verwendet werden.

  1. Bestimmen Sie, welche Instance-Typen von Amazon EC2, die EFA unterstützen, in der AWS-Region verfügbar sind, in der Sie Knoten bereitstellen. Ersetzen Sie region-code durch die AWS-Region, in der Sie die Knotengruppe bereitstellen möchten.

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

    Wenn Sie Knoten bereitstellen, muss der Instance-Typ, den Sie bereitstellen möchten, im AWS-Region des Clusters verfügbar ist.

  2. Bestimmen Sie, in welchen Availability Zones der Instance-Typ bereitgestellt werden soll. In diesem Tutorial wird der p5.48xlarge-Instance-Typ verwendet und muss in der Ausgabe für das AWS-Region zurückgegeben werden, das Sie im vorherigen Schritt angegeben haben. Wenn Sie Knoten in einem Produktions-Cluster bereitstellen, ersetzen Sie p5.48xlarge durch einen beliebigen Instance-Typ, der im vorherigen Schritt zurückgegeben wurde.

    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

    Eine Beispielausgabe sieht wie folgt aus.

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

    Beachten Sie, dass Availability Zones zur Verwendung in späteren Schritten zurückgegeben wurden Wenn Sie Knoten in einem Cluster bereitstellen, muss Ihre VPC über Subnetze mit verfügbaren IP-Adressen in einer der in der Ausgabe zurückgegebenen Availability Zones verfügen.

  3. Erstellen Sie eine Knotengruppe mithilfe von eksctl. Sie benötigen Version 0.214.0 oder höher des eksctl-Befehlszeilen-Tools, das auf Ihrem Computer oder in der AWS CloudShell installiert ist. Informationen zum Installieren und Aktualisieren von eksctl finden Sie in der Dokumentation zu eksctl unter Installation.

    1. Kopieren Sie den folgenden Inhalt in eine Datei mit dem Namen efa-cluster.yaml. Ersetzen Sie die Beispielwerte durch Ihre eigenen Werte. Sie können p5.48xlarge mit einer anderen Instance ersetzen. Wenn Sie dies tun, stellen Sie sicher, dass die Werte für availabilityZones Availability Zones sind, die in Schritt 1 für den Instance-Typ zurückgegeben wurden.

      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
    2. Erstellen einer verwalteten Knotengruppe in einem bestehenden Cluster

      eksctl create nodegroup -f efa-cluster.yaml

      Wenn Sie über keinen vorhandenen 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
      Anmerkung

      Da der in diesem Beispiel verwendete Instance-Typ über GPUs verfügt, installiert eksctl bei Verwendung von Amazon Linux 2 automatisch das NVIDIA-Kubernetes-Geräte-Plugin auf jeder Instance für Sie. Dies ist für Bottlerocket nicht erforderlich, da das NVIDIA-Geräte-Plugin in die EKS-NVIDIA-Variante von Bottlerocket integriert ist. Wenn efaEnabled in der Knotengruppen-Konfiguration auf true gesetzt ist, stellt eksctl automatisch das EFA-Geräte-Plugin auf den Knoten bereit.

Verwendung von Bottlerocket mit EFA

Bottlerocket-AMI-Version 1.28.0 und höher bieten offiziellen Support für EFA. Um Bottlerocket für EFA-fähige Knoten zu verwenden, geben Sie amiFamily: Bottlerocket in Ihrer Konfiguration an. Wenn Sie eine benutzerdefinierte AMI-ID verwenden müssen, müssen Sie die Standard-nodeGroups anstelle von managedNodeGroups verwenden.

Hier ein Beispiel für eine Konfiguration:

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

Die oben genannte vm.nr_hugepages-sysctl-Einstellung konfiguriert die Anzahl der 2Mi-Hugepages. In diesem Beispiel bedeutet 3 000: 3 000 x 2Mi = 6 000Mi Hugepages.

Installation des EFA-Geräte-Plugins überprüfen

Wenn Sie eine Knotengruppe mit efaEnabled: true erstellen, stellt eksctl automatisch das EFA-Kubernetes-Geräte-Plugin für Sie bereit. Sie können überprüfen, ob das Geräte-Plugin installiert ist und ordnungsgemäß funktioniert:

  1. Überprüfen Sie den Status von DaemonSet:

    kubectl get daemonsets -n kube-system

    Beispielausgabe:

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

    Hier wird das EFA-Geräte-Plugin DaemonSet auf zwei Knoten ausgeführt. Beide sind READY und AVAILABLE.

  2. Überprüfen Sie anschließend die vom DaemonSet erstellten Pods:

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

    Beispielausgabe:

    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

    Die EFA-Geräte-Plugin-Pods befinden sich im Status „Ausgeführt“, was bestätigt, dass das Plugin erfolgreich bereitgestellt wurde und betriebsbereit ist.

  3. Überprüfen Sie die Ressourcen-Registrierung:

    Sie können überprüfen, ob die vpc.amazonaws.com/efa-Ressource beim kubelet registriert ist, indem Sie die Knoten beschreiben:

    kubectl describe nodes

    Wenn die EFA-Ressource ordnungsgemäß registriert ist, wird sie unter „Kapazität“ und „Zuweisbare Ressourcen“ des Knotens aufgeführt. Zum Beispiel:

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

    Diese Ausgabe bestätigt, dass der Knoten die EFA-Ressource erkennt und sie für Pods verfügbar macht, die sie anfordern.

(Optional) Leistung der EFA testen

Wir empfehlen Ihnen, die EFA-Einrichtung zu testen. Sie können die NCCL-Tests im aws-samples/awsome-distributed-training-Repository auf GitHub verwenden. NCCL-Tests bewerten die Leistung des Netzwerks mithilfe der Nvidia Collective Communication Library. Mit den folgenden Schritten können Sie NCCL-Tests in Amazon EKS durchführen.

  1. 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 verteiltes Training im Allreduce-Stil durchzuführen. Weitere Informationen dazu finden Sie unter MPI-Operator auf GitHub:

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

    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, 5 210Mi hugepages-2Mi, vier EFAs und 8 000Mi Speicher an, was effektiv bedeutet, dass jeder Worker alle Ressourcen einer p5.48xlarge-Instance konsumiert.

    1. Erstellung des MPIJob-Manifests:

      Kopieren Sie Folgendes in eine Datei mit dem Namen 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
    2. Anwendung der NCCL-Tests MPIJob:

      Reichen Sie das MPIJob durch Anwendung des Manifests ein. Dadurch werden zwei p5.48xlarge-Amazon-EC2-Instances erstellt.

      kubectl apply -f nccl-tests.yaml

      Eine Beispielausgabe sieht wie folgt aus.

      mpijob.kubeflow.org/nccl-tests created
    3. Überprüfen, ob der Auftrag Pods gestartet hat:

      Zeigen Sie Ihre ausgeführten Pods an.

      kubectl get pods

      Eine Beispielausgabe sieht wie folgt aus.

      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

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

    4. Überprüfen Sie anhand der Protokolle, ob der Auftrag erfolgreich ausgeführt wird:

      Zeigen Sie das Protokoll für den nccl-tests-launcher-Pod an. Ersetzen Sie nbql9 durch den Wert aus Ihrer Ausgabe.

      kubectl logs -f nccl-tests-launcher-nbql9

If the test completed successfully, you can deploy your applications that use the Nvidia Collective Communication Library.