Verteiltes Training für PyTorch konfigurieren

In diesem Dokument wird erläutert, wie Sie einen verteilten PyTorch-Trainingsjob erstellen. Wenn Sie einen verteilten Trainingsjob erstellen, führt AI Platform Training Ihren Code auf einem Cluster von VM-Instanzen (auch Knoten genannt) mit Umgebungsvariablen aus, die verteiltes PyTorch unterstützen. Ausbildung. Damit können Sie den Trainingsjob skalieren, um große Datenmengen zu verarbeiten.

In diesem Leitfaden wird davon ausgegangen, dass Sie vorkonfigurierte PyTorch-Container für das Training verwenden, wie unter Erste Schritte mit PyTorch beschrieben. Für die Anpassung des PyTorch-Code für verteiltes Training sind nur geringfügige Änderungen erforderlich.

Struktur des Trainingsclusters angeben

Konfigurieren Sie für verteiltes PyTorch-Training den Job, um einen Master-Worker-Knoten und einen oder mehrere Worker-Knoten zu verwenden. Diese Rollen verhalten sich wie folgt:

  • Master-Worker: Die VM mit Rang 0. Dieser Knoten richtet Verbindungen zwischen den Knoten im Cluster ein.
  • Worker: Die verbleibenden Knoten im Cluster. Jeder Knoten hat einen Teil des Trainings, wie durch den Trainingsanwendungscode angegeben.

Informationen zum Angeben von Master-Worker-Knoten und Worker-Knoten für Ihren Trainingscluster finden Sie unter Maschinentypen oder Skalierungsstufen angeben.

Container-Images angeben

Geben Sie beim Erstellen eines Trainingsjobs das Image eines Docker-Containers für den Master-Worker im Feld trainingInput.masterConfig.imageUri an und geben Sie das Image eines Docker-Containers für jeden Worker im Feld trainingInput.workerConfig.imageUri an. Liste der vordefinierten PyTorch-Container

Wenn Sie den Trainingsjob mit dem Befehl gcloud ai-platform jobs submit training erstellen, können Sie diese Felder mit den Flags --master-image-uri und --worker-image-uri angeben.

Wenn Sie jedoch das Feld trainingInput.workerConfig.imageUri nicht angeben, wird dessen Wert standardmäßig auf trainingInput.masterConfig.imageUri festgelegt. Oft ist es sinnvoll, auf jedem Knoten denselben vorkonfigurierten PyTorch-Container zu verwenden.

Trainingscode aktualisieren

Fügen Sie der Trainingsanwendung den folgenden Code hinzu, um den Trainingscluster zu initialisieren:

import torch

torch.distributed.init_process_group(
    backend='BACKEND',
    init_method='env://'
)

Ersetzen Sie BACKEND durch eines der unterstützten verteilten Trainings-Back-Ends, die im folgenden Abschnitt beschrieben werden. Das Schlüsselwortargument init_method='env://' weist PyTorch an, Umgebungsvariablen zur Initialisierung der Kommunikation im Cluster zu verwenden. Weitere Informationen erhalten Sie im Abschnitt Umgebungsvariablen dieser Anleitung.

Aktualisieren Sie außerdem den Trainingscode für die Verwendung der Klasse torch.nn.parallel.DistributedDataParallel. Wenn Sie in Ihrem Code beispielsweise ein PyTorch-Modul namens model erstellt haben, fügen Sie die folgende Zeile hinzu:

model = torch.nn.parallel.DistributedDataParallel(model)

Weitere Informationen zur Konfiguration des verteilten Trainings finden Sie in der PyTorch-Dokumentation zu verteiltem Training.

Verteilte Trainings-Back-Ends

AI Platform Training unterstützt die folgenden Back-Ends für verteiltes PyTorch-Training:

  • gloo: empfohlen für CPU-Trainingsjobs
  • nccl: empfohlen für GPU-Trainingsjobs

Lesen Sie mehr über die Unterschiede zwischen Back-Ends.

Umgebungsvariablen

Wenn Sie einen verteilten PyTorch-Trainingsjob erstellen, legt AI Platform Training auf jedem Knoten die folgenden Umgebungsvariablen fest:

  • WORLD_SIZE: Die Anzahl der Knoten im Cluster. Diese Variable hat auf jedem Knoten den gleichen Wert.
  • RANK: Eine eindeutige Kennung für jeden Knoten. Für den Master-Worker ist er auf 0 gesetzt. Für jeden Worker wird ein anderer Wert als 1 von WORLD_SIZE - 1 angegeben.
  • MASTER_ADDR: Der Hostname des Master-Worker-Knotens. Diese Variable hat auf jedem Knoten den gleichen Wert.
  • MASTER_PORT: Der Port, mit dem der Master-Worker-Knoten kommuniziert. Diese Variable hat auf jedem Knoten den gleichen Wert.

PyTorch verwendet diese Umgebungsvariablen, um den Cluster zu initialisieren.

Nächste Schritte