Trainieren Sie mit einem heterogenen Cluster - 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.

Trainieren Sie mit einem heterogenen Cluster

Mit dem heterogenen Cluster-Feature SageMaker Training können Sie einen Trainingsauftrag mit mehreren Arten von ML-Instances ausführen, um eine bessere Ressourcenskalierung und -auslastung für verschiedene ML-Trainingsaufgaben und -zwecke zu erzielen. Wenn bei Ihrem Trainingsauftrag auf einem Cluster mit GPU-Instances beispielsweise eine geringe GPU-Auslastung und CPU-Engpässe aufgrund von CPU-intensiven Aufgaben auftreten, kann die Verwendung eines heterogenen Clusters dazu beitragen, CPU-intensive Aufgaben auszulagern, indem kostengünstigere CPU-Instanzgruppen hinzugefügt, solche Engpässe behoben und eine bessere GPU-Auslastung erreicht werden.

Anmerkung

Diese Funktion ist im SageMaker Python SDK v2.98.0 und höher verfügbar.

Anmerkung

Diese Funktion ist über die SageMaker PyTorch TensorFlow Framework-Schätzerklassen und verfügbar. Unterstützte Frameworks sind PyTorch v1.10 oder höher und TensorFlow v2.6 oder höher.

Wie konfiguriert man einen heterogenen Cluster

Dieser Abschnitt enthält Anweisungen zum Ausführen eines Trainingsauftrags mit einem heterogenen Cluster, der aus mehreren Instance-Typen besteht.

Verwenden des SageMaker Python SDK

Folgen Sie den Anweisungen zum Konfigurieren von Instance-Gruppen für einen heterogenen Cluster mit dem SageMaker Python-SDK.

  1. Verwenden Sie die sagemaker.instance_group.InstanceGroup Klasse, um Instanzgruppen eines heterogenen Clusters für einen Trainingsauftrages zu konfigurieren. Sie können für jede Instance-Gruppe einen benutzerdefinierten Namen, den Instance-Typ und die Anzahl der Instances für jede Instance-Gruppe angeben. Weitere Informationen finden Sie unter sagemaker.instance_group inInstanceGroup der SageMaker Python-SDK-Dokumentation.

    Anmerkung

    Weitere Informationen zu verfügbaren Instance-Typen und zur maximalen Anzahl von Instance-Gruppen, die Sie in einem heterogenen Cluster konfigurieren können, finden Sie in der InstanceGroup -API-Referenz.

    Das folgende Codebeispiel zeigt, wie Sie zwei Instance-Gruppen einrichten, die aus zwei ml.c5.18xlarge reinen CPU-Instanzen mit Namen instance_group_1 und einer benannten ml.p3dn.24xlarge GPU-Instanz bestehen instance_group_2, wie im folgenden Diagramm dargestellt.

    The preceding diagram shows a conceptual example of how pre-training processes, such as data preprocessing, can be assigned to the CPU instance group and stream the preprocessed data to the GPU instance group.
    from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "instance_group_1", "ml.c5.18xlarge", 2 ) instance_group_2 = InstanceGroup( "instance_group_2", "ml.p3dn.24xlarge", 1 )
  2. Richten Sie mithilfe der Instance-Gruppenobjekte Trainingseingabekanäle ein und weisen Sie den Kanälen über das Argument der Klasse sagemaker.inputsTrainingInput Instanceinstance_group_names-Gruppen zu. Das instance_group_names Argument akzeptiert eine Liste von Strings mit Instance-Gruppennamen.

    Das folgende Beispiel zeigt, wie zwei Trainingseingangskanäle eingerichtet und die im Beispiel des vorherigen Schritts erstellten Instance-Gruppen zugewiesen werden. Sie können auch Amazon S3-Bucket-Pfade für das s3_data Argument angeben, damit die Instance-Gruppen Daten für Ihre Verwendungszwecke verarbeiten.

    from sagemaker.inputs import TrainingInput training_input_channel_1 = TrainingInput( s3_data_type='S3Prefix', # Available Options: S3Prefix | ManifestFile | AugmentedManifestFile s3_data='s3://your-training-data-storage/folder1', distribution='FullyReplicated', # Available Options: FullyReplicated | ShardedByS3Key input_mode='File', # Available Options: File | Pipe | FastFile instance_groups=["instance_group_1"] ) training_input_channel_2 = TrainingInput( s3_data_type='S3Prefix', s3_data='s3://your-training-data-storage/folder2', distribution='FullyReplicated', input_mode='File', instance_groups=["instance_group_2"] )

    Weitere Informationen zu den Argumenten von TrainingInput, finden Sie unter den folgenden Links.

  3. Konfigurieren Sie einen SageMaker Schätzer mit dem Argument instance_groups , wie im folgenden Codebeispiel gezeigt. Das instance_groups Argument akzeptiert eine Liste von InstanceGroup Objekten.

    PyTorch
    from sagemaker.pytorch import PyTorch estimator = PyTorch( ... entry_point='my-training-script.py', framework_version='x.y.z', # 1.10.0 or later py_version='pyxy', job_name='my-training-job-with-heterogeneous-cluster', instance_groups=[instance_group_1, instance_group_2] )
    TensorFlow
    from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... entry_point='my-training-script.py', framework_version='x.y.z', # 2.6.0 or later py_version='pyxy', job_name='my-training-job-with-heterogeneous-cluster', instance_groups=[instance_group_1, instance_group_2] )
    Anmerkung

    Das instance_count Argumentpaar instance_type und und das instance_groups Argument der SageMaker Schätzerklasse schließen sich gegenseitig aus. Verwenden Sie für ein homogenes Clustertschulung das Argumentpaar instance_type undinstance_count. Verwenden Sie instance_groups für heterogenes Clusterschulung.

    Anmerkung

    Eine vollständige Liste der verfügbaren Framework-Container, Framework-Versionen und Python-Versionen finden Sie unter SageMaker Framework-Container im AWS Deep Learning Container- GitHub Repository.

  4. Konfigurieren Sie die estimator.fit Methode mit den Schulungseingabekanälen, die mit den Instance-Gruppen konfiguriert sind, und starten Sie den Schulungsaufträge.

    estimator.fit( inputs={ 'training': training_input_channel_1, 'dummy-input-channel': training_input_channel_2 } )

Verwenden der Low-Level SageMaker-APIs

Wenn Sie die AWS Command Line Interface oder verwenden AWS SDK for Python (Boto3) und Low-Level- SageMaker APIs zum Senden einer Trainingsauftragsanforderung mit einem heterogenen Cluster verwenden möchten, lesen Sie die folgenden API-Referenzen.

Verteilte Schulung mit einem heterogenen Cluster

Über das distribution Argument der SageMaker Schätzerklasse können Sie eine bestimmte Instance-Gruppe zuweisen, um verteiltes Training durchzuführen. Nehmen wir beispielsweise an, dass Sie über die folgenden zwei Instance-Gruppe verfügen und für eine davon ein Multi-GPU-Schulung durchführen möchten.

from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup("instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup("instance_group_2", "ml.p3dn.24xlarge", 2)

Sie können die verteilte Schulungskonfiguration für eine der Instance-Gruppen festlegen. Die folgenden Codebeispiele zeigen beispielsweise, wie training_group_2 mit zwei ml.p3dn.24xlarge Instanzen der verteilten Trainingskonfiguration zugewiesen wird.

Anmerkung

Derzeit kann nur eine Instance-Gruppe eines heterogenen Clusters für die Verteilungskonfiguration angegeben werden.

Mit MPI

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "mpi": { "enabled": True, "processes_per_host": 8 }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "mpi": { "enabled": True, "processes_per_host": 8 }, "instance_groups": [instance_group_2] } )

Mit der SageMaker Datenparallelbibliothek

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "dataparallel": { "enabled": True } }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "dataparallel": { "enabled": True } }, "instance_groups": [instance_group_2] } )
Anmerkung

Wenn Sie die SageMaker datenparallele Bibliothek verwenden, stellen Sie sicher, dass die Instance-Gruppe aus den von der Bibliothek unterstützten Instance-Typen besteht.

Weitere Informationen zur SageMaker Datenparallelbibliothek finden Sie unter SageMaker Datenparalleltraining.

Mit der SageMaker Modellparallelbibliothek

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # SageMaker model parallel parameters } } }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # SageMaker model parallel parameters } } }, "instance_groups": [instance_group_2] } )

Weitere Informationen zur SageMaker Modellparallelbibliothek finden Sie unter SageMaker Modellparalleltraining.

Ändern Sie Ihr Schulungsskript, um Instance-Gruppen zuzuweisen

Mit der heterogenen Clusterkonfiguration in den vorherigen Abschnitten haben Sie die SageMaker Trainingsumgebung und die Instances für Ihren Trainingsauftrag vorbereitet. Um die Instance-Gruppen weiter bestimmten Schulung- und Datenverarbeitungsaufgaben zuzuweisen, müssen Sie im nächsten Schritt Ihr Schulungsskript ändern. Standardmäßig erstellt der Schulungsauftrag einfach Schulungsskriptreplikate für alle Knoten, unabhängig von der Größe der Instance, was zu Leistungsverlusten führen kann.

Wenn Sie beispielsweise CPU-Instances und GPU-Instances in einem heterogenen Cluster mischen und dabei ein tiefes neuronales Netzwerktrainingsskript an das Argument des SageMaker Schätzers übergeben, wird das entry_point entry_pointSkript auf jede Instance repliziert. Das bedeutet, dass CPU-Instances ohne korrekte Aufgabenzuweisungen auch das gesamte Skript ausführen und den Schulungsauftrag starten, der für verteilte Schulung auf GPU-Instances konzipiert ist. Daher müssen Sie Änderungen an bestimmten Verarbeitungsfunktionen vornehmen, die Sie auslagern und auf den CPU-Instances ausführen möchten. Sie können die SageMaker Umgebungsvariablen verwenden, um die Informationen des heterogenen Clusters abzurufen und bestimmte Prozesse entsprechend ausführen zu lassen.

Abfragen von Instance-Gruppeninformationen während der Initialisierungsphase eines SageMaker Trainingsauftrags

Wenn Ihr Trainingsauftrag beginnt, liest Ihr Trainingsskript Informationen zur SageMaker Trainingsumgebung, die eine heterogene Clusterkonfiguration beinhalten. Die Konfiguration enthält Informationen wie die aktuellen Instance-Gruppe, die aktuellen Hosts in jeder Gruppe und die Gruppe, in der sich der aktuelle Host befindet.

Sie können Instance-Gruppeninformationen wie folgt abrufen.

(Empfohlen) Lesen von Instance-Gruppeninformationen mit dem SageMaker Trainings-Toolkit

Verwenden Sie das Python-Umgebungsmodul, das die SageMaker Trainings-Toolkit-Bibliothek bereitstellt. Die Toolkit-Bibliothek ist in den SageMaker Framework-Containern für TensorFlow und vorinstalliert PyTorch, sodass Sie keinen zusätzlichen Installationsschritt benötigen, wenn Sie die vorgefertigten Container verwenden. Dies ist die empfohlene Methode, um die SageMaker Umgebungsvariablen mit weniger Codeänderungen in Ihrem Trainingsskript abzurufen.

from sagemaker_training import environment env = environment.Environment()

Umgebungsvariablen im Zusammenhang mit allgemeinem SageMaker Training und heterogenen Clustern:

  • env.is_hetero — Gibt ein boolesches Ergebnis zurück, unabhängig davon, ob ein heterogener Cluster konfiguriert ist oder nicht.

  • env.current_host — Gibt den aktuellen Host zurück.

  • env.current_instance_type — Gibt den Instance-Typ des aktuellen Hosts zurück.

  • env.current_instance_group — Gibt den Namen der aktuellen Instance-Gruppe zurück.

  • env.current_instance_group_hosts — Gibt eine Liste der Hosts in der aktuellen Instance-Gruppe zurück.

  • env.instance_groups — Gibt eine Liste von Instance-Gruppennamen zurück, die für die Schulung verwendet werden.

  • env.instance_groups_dict — Gibt die gesamte heterogene Clusterkonfiguration des Schulungsauftrages zurück.

  • env.distribution_instance_groups – Gibt eine Liste der Instance-Gruppen zurück, die dem distribution Parameter der SageMaker Schätzerklasse zugewiesen sind.

  • env.distribution_hosts – Gibt eine Liste der Hosts zurück, die zu den Instance-Gruppen gehören, die dem distribution Parameter der SageMaker Schätzerklasse zugewiesen sind.

Betrachten Sie zum Beispiel das folgende Beispiel für einen heterogenen Cluster, der aus zwei Instance-Gruppen besteht.

from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup( "instance_group_2", "ml.p3dn.24xlarge", 2)

Die Ausgabe des env.instance_groups_dict heterogenen Beispielclusters sollte folgendermaßen oder ähnlich aussehen.

{ "instance_group_1": { "hosts": [ "algo-2" ], "instance_group_name": "instance_group_1", "instance_type": "ml.c5.18xlarge" }, "instance_group_2": { "hosts": [ "algo-3", "algo-1" ], "instance_group_name": "instance_group_2", "instance_type": "ml.p3dn.24xlarge" } }

(Optional) Lesen von Instace-Gruppeninformationen aus der JSON-Datei mit der Ressourcenkonfiguration

Wenn Sie die Umgebungsvariablen lieber im JSON-Format abrufen möchten, können Sie die JSON-Datei für die Ressourcenkonfiguration direkt verwenden. Die JSON-Datei in einer SageMaker Trainings-Instance befindet sich /opt/ml/input/config/resourceconfig.json standardmäßig unter .

file_path = '/opt/ml/input/config/resourceconfig.json' config = read_file_as_json(file_path) print(json.dumps(config, indent=4, sort_keys=True))

Überlegungen

Beachten Sie die folgenden Elemente, wenn Sie die Funktion für heterogene Cluster verwenden.

  • Alle Instance-Gruppen verwenden dasselbe Docker-Image und dasselbe Schulungsskript. Daher sollte Ihr Schulungsskript so geändert werden, dass erkannt wird, zu welcher Instance-Gruppe es gehört, und die Ausführung entsprechend aufgeteilt werden.

  • Das heterogene Cluster-Feature wird im SageMaker lokalen Modus nicht unterstützt.

  • Die Amazon- CloudWatch Protokollstreams eines heterogenen Cluster-Trainingsauftrags sind nicht nach Instance-Gruppen gruppiert. Sie müssen anhand der Protokolle herausfinden, welche Knoten zu welcher Gruppe gehören.

  • Das heterogene Cluster-Feature ist über die SageMaker PyTorch TensorFlow Framework-Schätzerklassen und verfügbar. Unterstützte Frameworks sind PyTorch v1.10 oder höher und TensorFlow v2.6 oder höher. Eine vollständige Liste der verfügbaren Framework-Container, Framework-Versionen und Python-Versionen finden Sie unter SageMaker Framework-Container im AWS Deep Learning Container- GitHub Repository.

  • Eine verteilte Schulungsstrategie kann nur auf eine Instance-Gruppe angewendet werden.

Beispiele, Blogs und Fallstudien

Der folgende Blog behandelt Fallstudien zur Verwendung des SageMaker heterogenen Clustertrainings.