Unterstützung für die Verbesserung dieser Seite beitragen
Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Um zu diesem Benutzerhandbuch beizutragen, wählen Sie den GitHub Link Diese Seite bearbeiten auf, der sich im rechten Bereich jeder Seite befindet.
Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
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 EC2 Amazon-Instances, mit der Sie Anwendungen ausführen können, die ein hohes Maß an Kommunikation zwischen Knoten erfordern, und zwar in großem Umfang. 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 das Message Passing Interface (MPI) und Machine Learning (ML) -Anwendungen verwenden, die die NVIDIA Collective Communications Library (NCCL) verwenden, auf Tausende von oder skalieren. CPUs GPUs Dadurch erhalten Sie die Anwendungsleistung von lokalen HPC-Clustern mit der On-Demand-Elastizität und Flexibilität der Cloud. AWS 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 Device Plugin unterstützt alle EC2 Amazon-Instance-Typen, die EFA haben. Eine Liste aller Instance-Typen mit EFA finden Sie unter Unterstützte Instance-Typen im EC2 Amazon-Benutzerhandbuch. Um ML-Anwendungen schnell auszuführen, empfehlen wir jedoch, dass eine Instance zusätzlich zu AWS EFA über Hardwarebeschleunigungschips wie nVidia GPUs, Inferentia-Chips
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. Wie viele EFA für jeden Instance-Typ mit EFA verfügbar sind, finden Sie in der Liste der Netzwerkkarten im EC2 Amazon-Benutzerhandbuch.
EFA- und reine EFA-Schnittstellen
Ein Elastic Fabric Adapter (EFA) ist eine Netzwerkschnittstelle, die die Funktionen eines Elastic Network Adapters (ENA) und einer OS-Bypass-Schnittstelle kombiniert und auf dem Scalable AWS 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 zu erstellen, die nur über EFA-Schnittstellen verfügen können, müssen Sie eine benutzerdefinierte EC2 Startvorlage verwenden und den Wert auf setzen. InterfaceType efa-only In Ihrer benutzerdefinierten Startvorlage können Sie die Netzwerkkarte nicht 0 auf eine reine EFA-Schnittstelle festlegen, da dies die primäre Netzwerkkarte und Netzwerkschnittstelle der Instance ist. EC2 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.
Das folgende Verfahren führt Sie zum Erstellen eines EKS-Clusters 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,
eksctlzu verwenden, um Ihre Knotengruppe zu erstellen, kanneksctlauch einen Cluster für Sie erstellen. -
Version
2.12.3oder höher oder Version1.27.160oder höher der auf Ihrem Gerät installierten und konfigurierten AWS Befehlszeilenschnittstelle (AWS CLI) oder AWS CloudShell. Um Ihre aktuelle Version zu überprüfen, verwenden Sieaws --version | cut -d / -f2 | cut -d ' ' -f1. Paketmanager wieyumapt-get, oder Homebrew für macOS liegen oft mehrere Versionen hinter der neuesten Version der AWS CLI. Informationen zur Installation der neuesten Version finden Sie unter Installation und Schnellkonfiguration mit aws configure im Benutzerhandbuch für die AWS Befehlszeilenschnittstelle. Die AWS CLI-Version, in der installiert ist, AWS CloudShell kann auch mehrere Versionen hinter der neuesten Version liegen. Informationen zur Aktualisierung finden Sie im AWS CloudShell Benutzerhandbuch unter AWS CLI in Ihrem Home-Verzeichnis installieren. -
Das
kubectl-Befehlszeilen-Tool ist auf Ihrem Gerät oder in der 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 beispielsweise1.29ist, können Siekubectl-Version1.28,1.29, oder1.30damit verwenden. Informationen zum Installieren oder Aktualisieren vonkubectlfinden Sie unter kubectl und eksctl einrichten. -
Sie müssen das Amazon-VPC-CNI-Plugin für die Kubernetes-Version
1.7.10oder höher installiert haben, bevor Sie Worker-Knoten starten, die mehrere Elastic Fabric Adapter, wie etwap4doderp5unterstützen. Weitere Informationen zum Aktualisieren Ihres Amazon-VPC-CNI-Plugins für die Kubernetes-Version finden Sie unter Pods mit dem Amazon VPC CNI zuweisen IPs . -
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
Knotengruppen erstellen
Das folgende Verfahren hilft Ihnen dabei, 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 durchzuführen. EFAs Das Beispiel kann als Vorlage für verteiltes Deep-Learning-Training auf Amazon EKS verwendet EFAs werden.
-
Ermitteln Sie, welche EC2 Amazon-Instance-Typen, die EFA unterstützen, in der AWS Region verfügbar sind, in der Sie Knoten bereitstellen möchten.
region-codeErsetzen Sie es durch die AWS Region, in der Sie Ihre Knotengruppe bereitstellen möchten.aws ec2 describe-instance-types --region region-code \ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output textWenn Sie Knoten bereitstellen, muss der Instance-Typ, den Sie bereitstellen möchten, in der AWS Region verfügbar sein, in der sich Ihr Cluster befindet.
-
Bestimmen Sie, in welchen Availability Zones der Instance-Typ bereitgestellt werden soll. In diesem Tutorial wird der
p5.48xlargeInstance-Typ verwendet und muss in der Ausgabe für die AWS Region zurückgegeben werden, die Sie im vorherigen Schritt angegeben haben. Wenn Sie Knoten in einem Produktionscluster bereitstellen,p5.48xlargeersetzen Sie ihn 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 textEine Beispielausgabe sieht wie folgt aus.
us-west-2a us-west-2c us-west-2bBeachten 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.
-
Erstellen Sie eine Knotengruppe mithilfe von
eksctl. Sie benötigen eine Version0.215.0oder eine neuere Version deseksctlBefehlszeilentools, das auf Ihrem Gerät installiert ist oder AWS CloudShell. Informationen zum Installieren und Aktualisieren voneksctlfinden Sie in der Dokumentation zueksctlunter Installation. -
Fügen Sie eine Datei namens
efa-cluster.yamlmit dem folgenden Inhalt hinzu. Ersetzen Sie die Beispielwerte durch Ihre eigenen Werte. Sie könnenp5.48xlargemit einer anderen Instance ersetzen. Wenn Sie dies tun, stellen Sie sicher, dass die Werte füravailabilityZonesAvailability 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 -
Erstellen einer verwalteten Knotengruppe in einem bestehenden Cluster
eksctl create nodegroup -f efa-cluster.yamlWenn 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.yamlAnmerkung
Da der in diesem Beispiel verwendete Instance-Typ GPUs, installiert
eksctlautomatisch das NVIDIA Kubernetes-Geräte-Plug-In auf jeder Instance für Sie, wenn Sie Amazon Linux 2 verwenden. Dies ist für Bottlerocket nicht erforderlich, da das NVIDIA-Geräte-Plugin in die EKS-NVIDIA-Variante von Bottlerocket integriert ist. WennefaEnabledin der Knotengruppen-Konfiguration auftruegesetzt ist, stellteksctlautomatisch 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:
-
Überprüfen Sie den Status DaemonSet :
kubectl get daemonsets -n kube-systemBeispielausgabe:
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 läuft das EFA-Geräte-Plugin DaemonSet auf zwei Knoten. Beide sind READY und AVAILABLE.
-
Überprüfen Sie als Nächstes die Pods, die DaemonSet erstellt wurden von:
kubectl get pods -n kube-system -l name=aws-efa-k8s-device-pluginBeispielausgabe:
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 6m16sDie EFA-Geräte-Plugin-Pods befinden sich im Status „Ausgeführt“, was bestätigt, dass das Plugin erfolgreich bereitgestellt wurde und betriebsbereit ist.
-
Ü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 nodesWenn die EFA-Ressource ordnungsgemäß registriert ist, wird sie unter „Kapazität“ und „Zuweisbare Ressourcen“ des Knotens aufgeführt. Beispiel:
Capacity: ... vpc.amazonaws.com/efa: 4 Allocatable: ... vpc.amazonaws.com/efa: 4Diese 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-Testsaws-samples/awsome-distributed-training Repository am verwenden. GitHub NCCL-Tests
-
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 finden Sie unter MPI-Operator
on. GitHub -
Führen Sie den NCCL-Leistungstest mit mehreren Knoten aus, um RDMA/EFA zu überprüfen: GPUDirect
Führen Sie den standardmäßigen NCCL-Leistungstest aus, um die NCCL-Leistung mit GPUDirect RDMA over EFA zu überprüfen. Weitere Informationen finden Sie im offiziellen NCCL-Tests-Repo unter.
GitHub Führen Sie die folgenden Schritte aus, um einen NCCL-Leistungstest mit zwei Knoten auszuführen. Im Beispiel für einen NCCL-Testjob fordert jeder Worker acht GPUs, 5210 Mi, vier und 8000 Mi Arbeitsspeicher an EFAs, was praktisch bedeutet, dass jeder Worker alle Ressourcen einer Instanz verbraucht.
hugepages-2Mip5.48xlarge-
Erstellen Sie das Manifest: MPIJob
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 -
Wenden Sie die NCCL-Tests MPIJob an:
Reichen Sie das
MPIJobdurch Anwendung des Manifests ein. Dadurch werden zweip5.48xlargeEC2 Amazon-Instances erstellt.kubectl apply -f nccl-tests.yamlEine Beispielausgabe sieht wie folgt aus.
mpijob.kubeflow.org/nccl-tests created -
Überprüfen, ob der Auftrag Pods gestartet hat:
Zeigen Sie Ihre ausgeführten Pods an.
kubectl get podsEine 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 2m49sDer MPI-Operator erstellt einen Start-Pod und zwei Worker-Pods (einen auf jedem Knoten).
-
Ü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 Sienbql9mit dem 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.