Verteilte Datenverarbeitung mit SageMaker bewährten Methoden - Amazon SageMaker

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.

Verteilte Datenverarbeitung mit SageMaker bewährten Methoden

Auf dieser Seite mit bewährten Methoden werden verschiedene Varianten der verteilten Datenverarbeitung für Aufgaben im Bereich Machine Learning (ML) im Allgemeinen vorgestellt. Der Begriff verteiltes Rechnen auf dieser Seite umfasst verteiltes Training für Aufgaben des maschinellen Lernens und paralleles Rechnen für Datenverarbeitung, Datengenerierung, Feature-Engineering und Reinforcement-Learning. Auf dieser Seite behandeln wir die häufigsten Herausforderungen bei verteiltem Computing und die verfügbaren Optionen in SageMaker Training und SageMaker Verarbeitung. Weiteres Lesematerial zum Thema verteiltes Rechnen finden Sie unter Was ist verteiltes Rechnen?.

Sie können ML-Aufgaben so konfigurieren, dass sie verteilt auf mehrere Knoten (Instances), Beschleuniger (NVIDIA GPUs , AWS Trainium-Chips) und vCPU-Kerne ausgeführt werden. Durch die Ausführung verteilter Berechnungen können Sie eine Vielzahl von Zielen erreichen, z. B. schnellere Rechenoperationen, die Verarbeitung großer Datensätze oder das Training großer ML-Modelle.

In der folgenden Liste werden häufig auftretende Herausforderungen behandelt, mit denen Sie konfrontiert werden können, wenn Sie einen ML-Trainingsjob in großem Umfang durchführen.

  • Sie müssen Entscheidungen darüber treffen, wie Sie die Berechnungen je nach ML-Aufgaben, Softwarebibliotheken, die Sie verwenden möchten, und Rechenressourcen verteilen.

  • Nicht alle ML-Aufgaben sind einfach zu verteilen. Außerdem unterstützen nicht alle ML-Bibliotheken verteilte Berechnungen.

  • Verteilte Berechnungen führen möglicherweise nicht immer zu einer linearen Steigerung der Recheneffizienz. Insbesondere müssen Sie herausfinden, ob Daten-I/O und Kommunikation zwischen den GPUs zu Engpässen führen oder Mehraufwand verursachen.

  • Verteilte Berechnungen können numerische Prozesse stören und die Modellgenauigkeit verändern. Insbesondere beim Training mit datenparallelen neuronalen Netzwerken müssen Sie, wenn Sie die globale Batchgröße ändern und gleichzeitig auf einen größeren Rechencluster skalieren, auch die Lernrate entsprechend anpassen.

SageMaker bietet verteilte Trainingslösungen, um solche Herausforderungen für verschiedene Anwendungsfälle zu bewältigen. Wählen Sie eine der folgenden Optionen, die am besten zu Ihrem Anwendungsfall passt.

Option 1: Verwenden Sie einen integrierten Algorithmus, der SageMaker verteiltes Training unterstützt

SageMaker bietet integrierte Algorithmen, die Sie sofort über die SageMaker Konsole oder das SageMaker Python-SDK verwenden können. Mithilfe der integrierten Algorithmen müssen Sie keine Zeit für die Code-Anpassung, das Verständnis der Wissenschaft hinter den Modellen oder die Ausführung von Docker auf bereitgestellten Amazon EC2 EC2-Instances aufwenden.

Eine Teilmenge der integrierten SageMaker Algorithmen unterstützt verteiltes Training. Informationen darüber, ob der Algorithmus Ihrer Wahl verteiltes Training unterstützt, finden Sie in der Spalte Parallelisierbar in der Tabelle Allgemeine Informationen zu integrierten Algorithmen. Einige der Algorithmen unterstützen verteiltes Training mit mehreren Instanzen, während die übrigen parallelisierbaren Algorithmen die Parallelisierung über mehrere GPUs in einer einzigen Instanz unterstützen, wie in der Spalte Parallelisierbar angegeben.

Option 2: Führen Sie einen benutzerdefinierten ML-Code in der SageMaker verwalteten Trainings- oder Verarbeitungsumgebung aus

SageMaker -Aufträge können verteilte Trainingsumgebungen für bestimmte Anwendungsfälle und Frameworks instanziieren. Diese Umgebung fungiert als ready-to-use Whiteboard, auf dem Sie Ihren eigenen ML-Code mitbringen und ausführen können.

Wenn Ihr ML-Code ein Deep-Learning-Framework verwendet

Sie können verteilte Schulungsaufträge mit den Deep Learning Containers (DLC) für SageMaker Training starten, die Sie entweder über die dedizierten Python-Module im SageMaker Python SDK oder über die SageMaker APIs mit orchestrieren könnenAWS CLIAWS SDK for Python (Boto3). SageMaker stellt Schulungscontainer für Machine Learning-Frameworks bereit, einschließlich PyTorch, TensorFlow, Hugging Face Transformers und Apache MXNet. Sie haben zwei Möglichkeiten, Deep-Learning-Code für verteiltes Training zu schreiben.

  • Die SageMaker verteilten Trainingsbibliotheken

    Die SageMaker verteilten Trainingsbibliotheken schlagen AWS-verwalteten Code für die Parallelität neuronaler Netzwerkdaten und die Modellparallelität vor. SageMaker Verteilte Schulung verfügen auch über Launcher-Clients, die in das SageMaker Python-SDK integriert sind, und Sie müssen keinen parallelen Startcode erstellen. Weitere Informationen finden Sie in SageMakerder Datenparallelitätsbibliothek von und SageMakerin der Modellparallelitätsbibliothek von .

  • Verteilte Open-Source-Schulungsbibliotheken

    Open-Source-Frameworks haben ihre eigenen Verteilungsmechanismen wie DistributedDataParallelism (DDP) in PyTorch oder tf.distribute Module in TensorFlow. Sie können diese verteilten Trainings-Frameworks in den von verwalteten Framework SageMaker-Containern ausführen. Der Beispielcode für das Training von MaskRCNN in SageMaker zeigt beispielsweise, wie sowohl PyTorch DDP im SageMaker PyTorch Framework-Container als auch Horovod im SageMaker TensorFlow Framework-Container verwendet wird.

SageMaker ML-Container sind ebenfalls mit vorinstalliertem MPI ausgestattet, sodass Sie Ihr Einstiegspunktskript mit mpi4py parallelisieren können. Die Verwendung der integrierten MPI-Trainingscontainer ist eine hervorragende Option, wenn Sie einen verteilten Trainingsstarter eines Drittanbieters starten oder parallelen Ad-hoc-Code in der SageMaker verwalteten Trainingsumgebung schreiben.

Hinweise für das Training datenparalleler neuronaler Netzwerke auf GPUs

  • Skalieren Sie gegebenenfalls auf Parallelität mit mehreren GPUs und mehreren Computern

    Wir führen häufig Trainingsjobs für neuronale Netzwerke auf Instanzen mit mehreren CPUs oder mehreren GPUs durch. Jede GPU-basierte Instanz enthält normalerweise mehrere GPU-Geräte. Folglich kann verteiltes GPU-Computing entweder innerhalb einer einzelnen GPU-Instanz mit mehreren GPUs (Einzelknoten-Multi-GPU-Training) oder über mehrere GPU-Instanzen mit jeweils mehreren GPU-Kernen (Multi-GPU-Training mit mehreren Knoten) erfolgen. Einzelinstanztraining ist einfacher, Code zu schreiben und zu debuggen, und der knoteninterne GPU-zu-GPU-Durchsatz ist in der Regel schneller als der GPU-zu-GPU-Durchsatz zwischen Knoten. Daher empfiehlt es sich, die Datenparallelität zunächst vertikal zu skalieren (verwenden Sie eine GPU-Instanz mit mehreren GPUs) und bei Bedarf auf mehrere GPU-Instanzen zu erweitern. Dies gilt möglicherweise nicht für Fälle, in denen das CPU-Budget hoch ist (z. B. eine enorme Workload für die Datenvorverarbeitung) und wenn das CPU-GPU-Verhältnis einer Multi-GPU-Instanz zu niedrig ist. In allen Fällen müssen Sie mit verschiedenen Kombinationen von Instanztypen experimentieren, die auf Ihren eigenen ML-Schulungsanforderungen und Ihres Workloads basieren.

  • Überwachen Sie die Qualität der Konvergenz

    Beim Training eines neuronalen Netzwerks mit Datenparallelität führt eine Erhöhung der Anzahl der GPUs bei gleichbleibender Mini-Batch-Größe pro GPU zu einer Erhöhung der Größe des globalen Mini-Batches für den Mini-Batch-Prozess mit stochastischem Gradientenabstieg (MSGD). Es ist bekannt, dass sich die Größe der Mini-Batches für MSGD auf das Abstiegsgeräusch und die Konvergenz auswirkt. Für eine korrekte Skalierung unter Beibehaltung der Genauigkeit müssen Sie andere Hyperparameter wie die Lernrate anpassen [Goyal et al. (2017).

  • Überwachen von E/A-MerkMALEN

    Wenn Sie die Anzahl der GPUs erhöhen, sollte auch der Durchsatz für den Lese- und Schreibspeicher steigen. Stellen Sie sicher, dass Ihre Datenquelle und Pipeline nicht zu Engpässen führen.

  • Ändern Sie Ihr Trainingsskript nach Bedarf

    Trainingsskripte, die für das Training mit einer GPU geschrieben wurden, müssen für das Training mit mehreren Knoten und mehreren GPUs geändert werden. In den meisten Datenparallelitätsbibliotheken ist eine Änderung des Skripts erforderlich, um Folgendes zu erreichen.

    • Weisen Sie jeder GPU Stapel von Trainingsdaten zu.

    • Verwenden Sie einen Optimierer, der Gradientenberechnungen und Parameteraktualisierungen über mehrere GPUs hinweg durchführen kann.

    • Weisen Sie einem bestimmten Host und einer bestimmten GPU die Verantwortung für das Checkpointing zu.

Wenn Ihr ML-Code tabellarische Datenverarbeitung beinhaltet

PySpark ist ein Python-Frontend von Apache Spark, einem Open-Source-Framework für verteiltes Computing. PySpark wurde weit verbreitet für die verteilte tabellarische Datenverarbeitung für umfangreiche Produktions-Workloads. Wenn Sie tabellarischen Datenverarbeitungscode ausführen möchten, sollten Sie die Verwendung der SageMaker PySpark Verarbeitungscontainer und die Ausführung paralleler Aufträge in Betracht ziehen. Sie können Datenverarbeitungsaufträge auch parallel ausführen, indem Sie SageMaker Trainings- und SageMaker Verarbeitungs-APIs in Amazon SageMaker Studio Classic verwenden, das in Amazon EMR und integriert istAWS Glue.

Option 3: Schreiben Sie Ihren eigenen benutzerdefinierten verteilten Trainingscode

Wenn Sie einen Trainings- oder Verarbeitungsauftrag an senden SageMaker, starten SageMaker Trainings- und SageMaker Verarbeitungs-APIs Amazon EC2-Computing-Instances. Sie können die Trainings- und Verarbeitungsumgebung in den Instances anpassen, indem Sie Ihren eigenen Docker-Container ausführen oder zusätzliche Bibliotheken in den AWS verwalteten Containern installieren. Weitere Informationen zu Docker mit SageMaker Training finden Sie unter Anpassen Ihres eigenen Docker-Containers für die Arbeit mit SageMaker und Erstellen eines Containers mit Ihren eigenen Algorithmen und Modellen. Weitere Informationen zu Docker mit SageMaker -Verarbeitung finden Sie unter Verwenden Ihres eigenen Verarbeitungscodes.

Jede SageMaker Trainingsauftragsumgebung enthält eine Konfigurationsdatei unter und jede SageMaker /opt/ml/input/config/resourceconfig.jsonVerarbeitungsauftragsumgebung enthält eine ähnliche Konfigurationsdatei unter /opt/ml/config/resourceconfig.json. Ihr Code kann diese Datei lesen, um die Kommunikation zwischen den Knoten und hostnames zu finden und herzustellen. Weitere Informationen, einschließlich des Schemas der JSON-Datei, finden Sie unter Konfiguration für verteilte Schulungen und So konfiguriert Amazon SageMaker Processing Ihren Verarbeitungscontainer. Sie können auch verteilte Datenverarbeitungsbibliotheken von Drittanbietern wie Ray oder DeepSpeed in installieren und verwenden SageMaker.

Sie können auch SageMaker Training und SageMaker Verarbeitung verwenden, um benutzerdefinierte verteilte Berechnungen auszuführen, die keine Kommunikation zwischen Mitarbeitern erfordern. In der Computerliteratur werden diese Aufgaben oft als peinlich parallel oder ohne gemeinsame Nutzung beschrieben. Beispiele hierfür sind die parallel Verarbeitung von Datendateien, das parallel Training von Modellen in verschiedenen Konfigurationen oder das Ausführen von Batch-Inferenzen für eine Sammlung von Datensätzen. Mit Amazon können Sie solche Anwendungsfälle ohne gemeinsame Nutzung trivial parallelisieren SageMaker. Wenn Sie einen SageMaker Trainings- oder SageMaker Verarbeitungsauftrag auf einem Cluster mit mehreren Knoten starten, repliziert und startet SageMaker standardmäßig Ihren Trainingscode (in Python oder Docker) auf allen Knoten. Aufgaben, die eine zufällige Verteilung der Eingabedaten auf solche mehrere Knoten erfordern, können erleichtert werden, indem S3DataDistributionType=ShardedByS3Key in der Dateneingabekonfiguration der SageMaker TrainingInput API festgelegt wird.

Option 4: Starten Sie mehrere Jobs parallel oder nacheinander

Sie können einen ML-Datenverarbeitungs-Workflow auch in kleinere parallele oder sequenzielle Datenverarbeitungsaufgaben verteilen, die jeweils durch einen eigenen SageMaker Schulungs- oder SageMaker Verarbeitungsauftrag dargestellt werden. Das Aufteilen einer Aufgabe in mehrere Jobs kann in den folgenden Situationen oder Aufgaben von Vorteil sein:

  • Wenn Sie über spezifische Datenkanäle und Metadateneinträge (wie Hyperparameter, Modellkonfiguration oder Instanztypen) für jede Unteraufgabe verfügen.

  • Wenn Sie Wiederholungsschritte auf Unteraufgabenebene implementieren.

  • Wenn Sie die Konfiguration der Unteraufgaben im Laufe der Workload variieren, z. B. beim Training für steigende Batchgrößen.

  • Wenn Sie eine ML-Aufgabe ausführen müssen, die länger dauert als die maximal zulässige Trainingszeit für einen einzelnen Trainingsjob (maximal 28 Tage).

  • Wenn für verschiedene Schritte eines Rechen-Workflows unterschiedliche Instanztypen erforderlich sind.

Verwenden Sie für den spezifischen Fall der Hyperparametersuche die SageMaker automatische Modelloptimierung. SageMaker Die automatische Modelloptimierung ist ein Serverless-Parametersuchorchestrator, der mehrere Trainingsaufträge in Ihrem Namen startet, entsprechend einer Suchlogik, die zufällig, Bayesisch oder sein kann HyperBand.

Um mehrere Trainingsaufträge zu orchestrieren, können Sie auch Tools zur Workflow-Orchestrierung in Betracht ziehen, z. B. SageMaker Pipelines ,AWS Step Functions und Apache Airflow, die von Amazon Managed Workflows for Apache Airflow (MWAA) und SageMaker Workflows unterstützt werden.