GPUs zum Trainieren von Modellen in der Cloud verwenden

Graphics Processing Units (GPUs) können den Trainingsprozess für viele Deep Learning-Modelle erheblich beschleunigen. Trainingsmodelle für Aufgaben wie Bildklassifizierung, Videoanalyse und Natural Language Processing umfassen rechenintensive Matrixmultiplikationen und andere Vorgänge, die die massiv parallele Architektur einer GPU nutzen können.

Es kann tagelang dauern, ein Deep Learning-Modell, das intensive Berechnungsaufgaben mit großen Datasets ausführt, auf einem einzigen Prozessor zu trainieren. Falls Sie Ihr Programm jedoch darauf ausrichten, diese Aufgaben auf eine oder mehrere GPUs zu übertragen, können Sie die Trainingsdauer auf einige Stunden statt einige Tage reduzieren.

Hinweise

Mit Cloud Machine Learning Engine kann jede TensorFlow-Trainingsanwendung auf einer GPU-fähigen Maschine ausgeführt werden. Lesen Sie die Anleitung zur Verwendung von GPUs mit TensorFlow und den unten stehenden Abschnitt darüber, wie Sie GPUs Vorgänge zuweisen, um dafür zu sorgen, dass in Ihrer Anwendung verfügbare GPUs verwendet werden.

Einige Modelle profitieren nicht von der Ausführung auf GPUs. GPUs empfehlen sich für große, komplexe Modelle mit vielen mathematischen Operationen. Selbst in diesem Fall sollten Sie zuerst testen, ob die Vorteile von GPUs überwiegen, indem Sie für eine kleine Stichprobe Ihrer Daten ein Training ausführen.

GPU-fähige Maschinen anfordern

Wenn Sie GPUs in der Cloud verwenden möchten, haben Sie drei Möglichkeiten, den Trainingsjob für den Zugriff auf GPU-fähige Maschinen zu konfigurieren: Verwenden Sie die Skalierungsstufe BASIC_GPU, GPU-fähige Cloud ML Engine-Maschinentypen oder Compute Engine-Maschinentypen. Im letzteren Fall hängen Sie GPUs an.

Einfache GPU-fähige Maschinen

Wenn Sie die Verwendung von Cloud ML Engine erlernen oder mit GPU-fähigen Maschinen experimentieren, können Sie die Skalierungsstufe auf BASIC_GPU setzen, um eine einzelne Worker-Instanz mit einer einzelnen NVIDIA Tesla K80-GPU zu erhalten.

Maschinentypen mit enthaltenen GPUs

Sie können die GPU-Nutzung anpassen. Konfigurieren Sie dazu Ihren Trainingsjob mit GPU-fähigen Maschinentypen:

  • Setzen Sie die Skalierungsstufe auf CUSTOM.
  • Konfigurieren Sie jeden Worker-Typ (Master, Worker oder Parameterserver) so, dass einer der GPU-fähigen Maschinentypen verwendet wird. Richten Sie sich dabei nach der für die Aufgabe erforderlichen Anzahl von GPUs und dem benötigten Beschleunigertyp:
    • standard_gpu: Eine einzelne NVIDIA Tesla K80-GPU
    • complex_model_m_gpu: Vier NVIDIA Tesla K80-GPUs
    • complex_model_l_gpu: Acht NVIDIA Tesla K80-GPUs
    • standard_p100: Eine einzelne NVIDIA Tesla P100-GPU
    • complex_model_m_p100: Vier NVIDIA Tesla P100-GPUs
    • standard_v100: Eine einzelne NVIDIA Tesla V100-GPU
    • large_model_v100: Eine einzelne NVIDIA Tesla V100-GPU
    • complex_model_m_v100: Vier NVIDIA Tesla V100-GPUs
    • complex_model_l_v100: Acht NVIDIA Tesla V100-GPUs

Unten finden Sie ein Beispiel für das Senden eines Jobs mit GPU-fähigen Maschinentypen mit dem Befehl gcloud.

Hier finden Sie weitere Informationen für den Vergleich von Maschinentypen.

Compute Engine-Maschinentypen mit GPU-Anhängen

Wenn Sie Ihren Trainingsjob alternativ mit Compute Engine-Maschinentypen konfigurieren möchten, die standardmäßig keine GPUs enthalten, können Sie eine benutzerdefinierte Anzahl von GPUs anhängen, um den Job zu beschleunigen:

  • Setzen Sie die Skalierungsstufe auf CUSTOM.
  • Konfigurieren Sie jeden Worker-Typ (Master-, Worker- oder Parameterserver) so, dass ein gültiger Compute Engine-Maschinentyp verwendet wird.
  • Fügen Sie ein Feld acceleratorConfig mit dem gewünschten GPU-Typ in der gewünschten Anzahl zu masterConfig, workerConfig oder parameterServerConfig hinzu, je nachdem, welche virtuellen Maschinen Sie beschleunigen möchten. Sie können die folgenden GPU-Typen verwenden:
    • NVIDIA_TESLA_K80
    • NVIDIA_TESLA_P4 (Beta)
    • NVIDIA_TESLA_P100
    • NVIDIA_TESLA_V100

Beim Erstellen einer gültigen acceleratorConfig müssen Sie einige Einschränkungen berücksichtigen:

  1. Sie können in der Konfiguration nur eine bestimmte Anzahl von GPUs verwenden. Sie können beispielsweise 2 oder 4 NVIDIA Tesla K80-GPUs anhängen, aber nicht 3. In der unten stehenden Kompatibilitätstabelle finden Sie Informationen dazu, welche Anzahl für die einzelnen GPU-Typen gültig ist.

  2. Achten Sie darauf, dass jede Ihrer GPU-Konfigurationen für den Maschinentyp, an den Sie sie anhängen, ausreichend virtuelle CPUs und genügend Arbeitsspeicher bietet. Wenn Sie beispielsweise für Ihre Worker n1-standard-32 verwenden, hat jeder Worker 32 virtuelle CPUs und 120 GB Arbeitsspeicher. Da jede NVIDIA Tesla V100-GPU bis zu 8 virtuelle CPUs und 52 GB Arbeitsspeicher bereitstellen kann, müssen Sie an jeden n1-standard-32-Worker mindestens 4 GPUs anhängen, um seine Anforderungen zu erfüllen.

    Sie finden die Kompatibilitäten in der Tabelle mit den Maschinentypspezifikationen und im Vergleich der GPUs für Compute-Arbeitslasten sowie in der unten stehenden Kompatibilitätstabelle.

    In bestimmten Fällen gelten für GPU-Ressourcen für Cloud ML Engine die folgenden zusätzlichen Einschränkungen:

    • Eine Konfiguration mit 8 NVIDIA Tesla K80-GPUs bietet in allen Regionen und Zonen nur bis zu 208 GB Arbeitsspeicher.
    • Eine Konfiguration mit 4 NVIDIA Tesla P100-GPUs unterstützt in allen Regionen und Zonen nur bis zu 64 virtuelle CPUs und bis zu 208 GB Arbeitsspeicher.
  3. Sie müssen Ihren Trainingsjob an eine Region senden, die Ihre GPU-Konfiguration unterstützt. Weitere Informationen zur Regionsunterstützung finden Sie unten.

Die folgende Tabelle bietet eine Kurzübersicht darüber, wie viele der einzelnen Beschleunigertypen Sie an einen bestimmten Compute Engine-Maschinentyp anhängen können:

Gültige GPU-Anzahl für Maschinentypen
Maschinentyp NVIDIA Tesla K80 NVIDIA Tesla P4 (Beta) NVIDIA Tesla P100 NVIDIA Tesla V100
n1-standard-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-16 2, 4, 8 1, 2, 4 1, 2, 4 2, 4, 8
n1-standard-32 4, 8 2, 4 2, 4 4, 8
n1-standard-64 4 8
n1-standard-96 4 8
n1-highmem-2 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-16 2, 4, 8 1, 2, 4 1, 2, 4 2, 4, 8
n1-highmem-32 4, 8 2, 4 2, 4 4, 8
n1-highmem-64 4 8
n1-highmem-96 4 8
n1-highcpu-16 2, 4, 8 1, 2, 4 1, 2, 4 2, 4, 8
n1-highcpu-32 4, 8 2, 4 2, 4 4, 8
n1-highcpu-64 8 4 4 8
n1-highcpu-96 4 8

Unten finden Sie ein Beispiel für das Senden eines Jobs mithilfe von Compute Engine-Maschinentypen mit angehängten GPUs.

Regionen mit Unterstützung für GPUs

Sie müssen Ihren Job in einer Region ausführen, die GPUs unterstützt. Die folgenden Regionen bieten derzeit Zugang zu GPUs:

  • us-east1
  • us-central1
  • us-west1
  • asia-east1
  • europe-west1
  • europe-west4

Darüber hinaus bieten einige dieser Regionen nur Zugang zu bestimmten GPU-Typen. Einen vollständigen Überblick über die verfügbaren Regionen für Cloud ML Engine-Dienste, einschließlich Modelltraining und Online-/Batchvorhersagen, erhalten Sie in den Informationen zu Regionen.

Wenn Ihr Trainingsjob mehrere GPU-Typen verwendet, müssen diese alle in einer einzigen Zone in Ihrer Region verfügbar sein. Sie können beispielsweise keinen Job in us-central1 mit einem Master-Worker ausführen, der NVIDIA Tesla V100-GPUs verwendet, mit Parameterservern, die NVIDIA Tesla K80-GPUs nutzen, und mit Workern, die NVIDIA Tesla P100-GPUs verwenden. Obwohl alle diese GPUs für Trainingsjobs in us-central1 verfügbar sind, bietet keine Zone in dieser Region alle drei GPU-Typen. Weitere Informationen zur Zonenverfügbarkeit von GPUs finden Sie im Vergleich von GPUs für Compute-Arbeitslasten.

Trainingsjobs senden

Sie können den Trainingsjob mit dem Befehl gcloud ml-engine jobs submit training senden.

  1. Definieren Sie eine config.yaml-Datei, in der die gewünschten GPU-Optionen beschrieben werden. Die Struktur der YAML-Datei stellt die Ressource "Job" dar. Im Folgenden finden Sie zwei Beispiele für config.yaml-Dateien.

    Das erste Beispiel zeigt eine Konfigurationsdatei für einen Trainingsjob unter Verwendung von Cloud ML Engine-Maschinentypen, von denen einige GPUs enthalten:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: complex_model_m_gpu
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: complex_model_m_gpu
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: large_model
    

    Das nächste Beispiel zeigt eine Konfigurationsdatei für einen Job mit einer ähnlichen Konfiguration wie oben. Bei dieser Konfiguration werden jedoch Compute Engine-Maschinentypen mit angehängten GPUs verwendet. Diese Art der Konfiguration ist in der Betaphase:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: n1-highcpu-16
      masterConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: n1-highcpu-16
      workerConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: n1-highmem-8
    
  2. Senden Sie den Job mit dem Befehl gcloud und fügen Sie das Argument --config hinzu, das auf die Datei config.yaml verweist. Im folgenden Beispiel wird davon ausgegangen, dass Sie für die Werte einiger Argumente Umgebungsvariablen eingerichtet haben, die durch ein $-Zeichen gefolgt von Großbuchstaben gekennzeichnet sind:

    gcloud ml-engine jobs submit training $JOB_NAME \
            --package-path $APP_PACKAGE_PATH \
            --module-name $MAIN_APP_MODULE \
            --job-dir $JOB_DIR \
            --region us-central1 \
            --config config.yaml \
            -- \
            --user_arg_1 value_1 \
             ...
            --user_arg_n value_n
    

Wenn Sie die Komponente gcloud beta installiert haben, können Sie alternativ die Clusterkonfigurationsdetails mit Befehlszeilen-Flags angeben, anstatt eine Konfigurationsdatei zu verwenden. Weitere Informationen zur Verwendung dieser Flags erhalten Sie hier. Wenn Sie die Komponente gcloud beta installieren oder aktualisieren möchten, führen Sie den Befehl gcloud components install beta aus.

Das folgende Beispiel zeigt, wie Sie einen Job mit der gleichen Konfiguration wie im vorherigen Beispiel senden (Compute Engine-Maschinentypen mit angehängten GPUs), ohne jedoch eine config.yaml-Datei zu verwenden:

gcloud beta ml-engine jobs submit training $JOB_NAME \
        --package-path $APP_PACKAGE_PATH \
        --module-name $MAIN_APP_MODULE \
        --job-dir $JOB_DIR \
        --region us-central1 \
        --scale-tier custom \
        --master-machine-type n1-highcpu-16 \
        --master-accelerator count=4,type=nvidia-tesla-k80 \
        --worker-server-count 9 \
        --worker-machine-type n1-highcpu-16 \
        --worker-accelerator count=4,type=nvidia-tesla-k80 \
        --parameter-server-count 3 \
        --parameter-server-machine-type n1-highmem-8 \
        -- \
        --user_arg_1 value_1 \
         ...
        --user_arg_n value_n

Hinweise:

  • Wenn Sie eine Option sowohl in der Konfigurationsdatei (config.yaml) als auch als Befehlszeilen-Flag angeben, wird der Wert in der Konfigurationsdatei mit dem Wert in der Befehlszeile überschrieben.
  • Das leere Flag -- markiert das Ende der für gcloud spezifischen Flags und den Anfang der USER_ARGS, die Sie an die Anwendung übergeben möchten.
  • Cloud ML Engine-spezifische Flags wie --module-name, --runtime-version und --job-dir müssen vor dem leeren Flag -- angegeben werden. Der Cloud ML Engine-Dienst interpretiert diese Flags.
  • Wenn das Flag --job-dir angegeben wird, muss dies vor dem leeren Flag -- geschehen, da Cloud ML Engine den Pfad mithilfe des Flags --job-dir validiert.
  • Wenn das Flag --job-dir angegeben wird, muss es auch von der Anwendung verarbeitet werden. Obwohl das Flag -- vor dem leeren Flag --job-dir steht, wird es ebenfalls als Befehlszeilen-Flag an die Anwendung übergeben.
  • Sie können beliebig viele USER_ARGS definieren. Cloud ML Engine übergibt --user_first_arg, --user_second_arg usw. an Ihre Anwendung.

Weitere Einzelheiten zu den Optionen für das Senden von Jobs finden Sie in der Anleitung zum Starten eines Trainingsjobs.

Vorgänge zu GPUs zuweisen

Zur Nutzung der GPUs auf einer Maschine nehmen Sie die entsprechenden Änderungen an Ihrer TensorFlow-Trainingsanwendung vor:

  • Allgemeine Estimator API: Es sind keine Codeänderungen erforderlich, sofern ClusterSpec (nur auf Enlisch verfügbar) richtig konfiguriert ist. Wenn es sich bei einem Cluster um eine Mischung aus CPUs und GPUs handelt, ordnen Sie den ps-Jobnamen den CPUs und den worker-Jobnamen den GPUs zu.

  • Core Tensorflow API: Sie müssen Vorgänge so zuweisen, dass sie auf GPU-fähigen Maschinen ausgeführt werden. Dieser Vorgang ist der gleiche wie bei der lokalen Verwendung von GPUs mit TensorFlow (nur auf Englisch verfügbar). Sie können replica_device_setter (Nur auf Englisch verfügbar) verwenden, um Vorgänge Geräten zuzuweisen.

Wenn Sie eine GPU-fähige Maschine einem Cloud ML Engine-Prozess zuweisen, hat dieser Prozess exklusiven Zugang zu den GPUs dieser Maschine. Es ist nicht möglich, die GPUs einer einzelnen Maschine in Ihrem Cluster über mehrere Prozesse aufzuteilen. Dieser Vorgang entspricht der verteilten TensorFlow-Aufgabe in Ihrer Clusterspezifikation. Die Dokumentation für verteiltes TensorFlow (nur auf Englisch verfügbar) beschreibt Clusterspezifikationen und -aufgaben.

GPU-Geräte-String

Eine einzelne GPU einer standard_gpu-Maschine wird als "/gpu:0" identifiziert. Maschinen mit mehreren GPUs verwenden Kennungen, die mit "/gpu:0" beginnen und mit "/gpu:1" usw. weitergehen. Zum Beispiel haben complex_model_m_gpu-Maschinen vier GPUs mit Kennungen zwischen "/gpu:0" und "/gpu:3".

Python-Pakete auf GPU-fähigen Maschinen

Auf GPU-fähigen Maschinen ist tensorflow-gpu (nur auf Englisch verfügbar) vorinstalliert, das TensorFlow-Python-Paket mit GPU-Unterstützung. Eine Liste mit allen vorinstallierten Paketen finden Sie in der Liste der Cloud ML-Laufzeitversionen.

Wartungsereignisse

Wenn Sie GPUs in Ihren Trainingsjobs verwenden, sollten Sie bedenken, dass die zugrunde liegenden virtuellen Maschinen gelegentlich einer Compute Engine-Hostwartung unterzogen werden. Die für Trainingsjobs verwendeten GPU-fähigen virtuellen Maschinen sind so konfiguriert, dass sie nach solchen Wartungsereignissen automatisch neu gestartet werden. Allerdings müssen Sie unter Umständen zusätzliche Schritte ausführen, damit Ihr Job durch dieses Herunterfahren nicht beeinträchtigt wird. Konfigurieren Sie Ihre Trainingsanwendung so, dass regelmäßig Modell-Checkpoints gespeichert werden (meist im Cloud Storage-Pfad, den Sie in gcloud ml-engine jobs submit training über das Argument --job-dir angegeben haben) und dass der neueste Checkpoint wiederhergestellt wird, falls bereits mehrere Checkpoints existieren.

Die TensorFlow Estimator API (nur auf Englisch verfügbar) implementiert diese Funktionalität für Sie. Falls Ihr Modell also bereits in einen Estimator eingebettet ist, müssen Sie sich keine Gedanken um Wartungsereignisse auf den GPU-Workern machen.

Falls die Einbettung des Modells in einen TensorFlow-Estimator nicht möglich ist und Sie möchten, dass Wartungsereignisse Ihre GPU-fähigen Trainingsjobs nicht beeinträchtigen, müssen Sie die Funktionalität zur Checkpoint-Speicherung und -Wiederherstellung manuell in das Modell schreiben. TensorFlow stellt im Modul tf.train einige nützliche Ressourcen für eine solche Implementierung zur Verfügung, insbesondere tf.train.checkpoint_exists und tf.train.latest_checkpoint (alle Links nur auf Englisch verfügbar).

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Cloud ML Engine für TensorFlow