Auf Cloud TPU trainieren (TF 2.x)


In dieser Anleitung wird gezeigt, wie Sie das Keras ResNet-RS-Modell mit tf.distribute.TPUStrategy auf einem Cloud TPU-Gerät trainieren. Weitere Informationen zu ResNet-RS finden Sie unter Revisiting ResNets: Improved Training and Scaling Strategies.

Wenn Sie nicht mit Cloud TPU vertraut sind, wird dringend empfohlen, die quickstart zu lesen, um zu erfahren, wie Sie eine TPU und eine Compute Engine-VM erstellen.

Lernziele

  • Cloud Storage-Bucket zum Speichern der Dataset- und Modellausgabe erstellen
  • Bereiten Sie ein Imitaten-Dataset vor, das dem ImageNet-Dataset ähnlich ist.
  • Trainingsjob ausführen
  • Ausgabeergebnisse überprüfen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

Bevor Sie mit dieser Anleitung beginnen, prüfen Sie, ob Ihr Google Cloud-Projekt ordnungsgemäß eingerichtet ist.

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  6. In dieser Anleitung werden kostenpflichtige Komponenten der Google Cloud verwendet. Rufen Sie die Seite mit den Cloud TPU-Preisen auf, um Ihre Kosten abzuschätzen. Denken Sie daran, nicht mehr benötigte Ressourcen zu bereinigen, um unnötige Kosten zu vermeiden.

Ressourcen einrichten

Dieser Abschnitt enthält Informationen zum Einrichten von Cloud Storage-, VM- und Cloud TPU-Ressourcen für Anleitungen.

  1. Öffnen Sie ein Cloud Shell-Fenster.

    Cloud Shell öffnen

  2. Erstellen Sie eine Variable für Ihre Projekt-ID.

    export PROJECT_ID=project-id
    
  3. Konfigurieren Sie die Google Cloud CLI so, dass das Projekt verwendet wird, in dem Sie eine Cloud TPU erstellen möchten.

    gcloud config set project ${PROJECT_ID}
    

    Wenn Sie diesen Befehl zum ersten Mal in einer neuen Cloud Shell-VM ausführen, wird die Seite Authorize Cloud Shell angezeigt. Klicken Sie unten auf der Seite auf Authorize, um gcloud das Ausführen von Google Cloud API-Aufrufen mit Ihren Anmeldedaten zu erlauben.

  4. Erstellen Sie ein Dienstkonto für das Cloud TPU-Projekt.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    Der Befehl gibt ein Cloud TPU-Dienstkonto im folgenden Format zurück:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Erstellen Sie mit dem folgenden Befehl einen Cloud Storage-Bucket:

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
    

    Dieser Cloud Storage-Bucket speichert die Daten, die Sie zum Trainieren Ihres Modells verwenden, und die Trainingsergebnisse. Mit dem in dieser Anleitung verwendeten gcloud compute tpus execution-groups-Tool werden Standardberechtigungen für das Cloud TPU-Dienstkonto eingerichtet, das Sie im vorherigen Schritt eingerichtet haben. Wenn Sie detailliertere Berechtigungen benötigen, können Sie die Berechtigungen auf Zugriffsebene anpassen.

    Der Bucket-Standort muss sich in derselben Region wie Ihre Compute Engine (VM) und Ihr Cloud TPU-Knoten befinden.

  6. Starten Sie mit dem Befehl gcloud eine Compute Engine-VM.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-16 \
     --tf-version=2.12.0
     

    Beschreibung der Befehls-Flags

    vm-only
    Erstellen Sie nur eine VM und keine TPU.
    name
    Der Name der zu erstellenden TPU.
    zone
    Die Zone, in der die Cloud TPU erstellt werden soll.
    disk-size
    Die Größe der Festplatte in GB der mit dem Befehl gcloud compute tpus execution-groups erstellten VM.
    machine-type
    Der Maschinentyp der Compute Engine-VM, die erstellt werden soll.

    Weitere Informationen zum Befehl gcloud finden Sie in der gcloud-Referenz.

  7. Wenn Sie dazu aufgefordert werden, drücken Sie auf y, um Ihre Cloud TPU-Ressourcen zu erstellen.

    Wenn der Befehl gcloud compute tpus execution-groups ausgeführt wurde, prüfen Sie, ob die Shell-Eingabeaufforderung von username@projectname in username@vm-name geändert wurde. Diese Änderung bedeutet, dass Sie jetzt bei Ihrer Compute Engine-VM angemeldet sind.

    gcloud compute ssh resnet-rs-tutorial --zone=europe-west4-a
    

    Führen Sie im weiteren Verlauf dieser Anleitung jeden Befehl, der mit (vm)$ beginnt, in Ihrer Compute Engine-Instanz aus.

  8. Installieren Sie die erforderlichen Pakete.

    $ pip3 install tensorflow-text==2.8.1 --no-deps

Cloud Storage-Bucket-Variablen festlegen

Richten Sie die folgenden Umgebungsvariablen ein und ersetzen Sie bucket-name durch den Namen Ihres Cloud Storage-Buckets:

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-rs-2x
(vm)$ export IMAGENET_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
(vm)$ export PYTHONPATH=/usr/share/models
(vm)$ export TPU_NAME=resnet-rs-tutorial

Die Trainingsanwendung erwartet, dass Ihre Trainingsdaten in Cloud Storage verfügbar sind. Die Trainingsanwendung verwendet auch Ihren Cloud Storage-Bucket, um während des Trainings Prüfpunkte zu speichern.

Training und Bewertung für einzelne Geräte in Cloud TPU

ImageNet ist eine Bilddatenbank. Die Bilder in der Datenbank sind hierarchisch angeordnet, wobei jeder Knoten der Hierarchie durch Hunderte und Tausende von Bildern dargestellt wird.

In dieser Anleitung wird eine Demoversion des vollständigen ImageNet-Datasets verwendet, die als fake_imagenet bezeichnet wird. Wenn Sie die Anleitung mit dieser Demoversionen durcharbeiten, können Sie den Speicher- und Zeitaufwand reduzieren, der normalerweise mit dem Ausführen eines Modells für die gesamte ImageNet-Datenbank verbunden ist.

Das Dataset "fake_imagenet" befindet sich an diesem Speicherort in Cloud Storage:

gs://cloud-tpu-test-datasets/fake_imagenet

Das Dataset "fake_imagenet" dient nur zum Verständnis, wie eine Cloud TPU verwendet wird und wie die End-to-End-Leistung validiert wird. Die Genauigkeitszahlen und das gespeicherte Modell sind nicht aussagekräftig.

Informationen zum Herunterladen und Verarbeiten des vollständigen ImageNet-Datasets finden Sie unter Das ImageNet-Dataset herunterladen, vorverarbeiten und hochladen.

  1. Erstellen Sie eine Cloud TPU mit dem Befehl gcloud.

    $ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v3-8  \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --tf-version=2.12.0

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellen Sie nur eine TPU, keine VM.
    accelerator-type
    Der Typ der zu erstellenden Cloud TPU.
    name
    Der Name der zu erstellenden TPU.
    zone
    Die Zone, in der die Cloud TPU erstellt werden soll.
    tf-version
    Die TensorFlow-Version, die auf der VM installiert ist.
  2. Legen Sie die Namensvariable TPU_NAME fest.

    (vm)$ export TPU_NAME=resnet-rs-tutorial
    
  3. Führen Sie das Trainingsskript aus.

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    Beschreibung der Befehls-Flags

    experiment
    Der Name des Tests, der ausgeführt werden soll.
    mode
    Der Modus, in dem das Script ausgeführt wird. Gültige Werte sind "train", "eval" oder "train_and_eval".
    model_dir
    Der Cloud Storage-Bucket, in dem während des Trainings Prüfpunkte und Zusammenfassungen gespeichert werden. Sie können einen vorhandenen Ordner verwenden, um zuvor generierte Prüfpunkte zu laden, die auf einer TPU mit derselben Größe und TensorFlow-Version erstellt wurden.
    tpu
    Der Name der zu verwendenden TPU.
    config_file
    Der Pfad zu einer Skriptkonfigurationsdatei.
    params_override
    Überschreibt die Einstellungen, die in der Skriptkonfigurationsdatei festgelegt wurden.

Dadurch wird ResNet-RS für 100 Trainingsschritte trainiert und das Training wird auf einem v3-8-TPU-Knoten in weniger als 5 Minuten abgeschlossen. Die Ausgabe des Trainingsskripts sollte Text wie den folgenden enthalten:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

Das Trainingsskript führt ebenfalls eine Evaluierung durch. Die Evaluierungsausgabe sollte folgenden Text enthalten:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

Wenn Sie das ResNet-RS-Modell bis zur Konvergenz trainieren möchten, lassen Sie das Argument trainer.train_steps=100 weg, wie im folgenden Skript gezeigt. Training und Evaluierung werden gemeinsam durchgeführt.

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

Beschreibung der Befehls-Flags

experiment
Der Name des Tests, der ausgeführt werden soll.
mode
Der Modus, in dem das Script ausgeführt wird. Gültige Werte sind "train", "eval" oder "train_and_eval".
model_dir
Der Cloud Storage-Bucket, in dem während des Trainings Prüfpunkte und Zusammenfassungen gespeichert werden. Sie können einen vorhandenen Ordner verwenden, um zuvor generierte Prüfpunkte zu laden, die auf einer TPU mit derselben Größe und TensorFlow-Version erstellt wurden.
tpu
Der Name der zu verwendenden TPU.
config_file
Der Pfad zu einer Skriptkonfigurationsdatei.
params_override
Überschreibt die Einstellungen, die in der Skriptkonfigurationsdatei festgelegt wurden.

Da das Dataset fake_imagenet für das Training und die Bewertung verwendet wurde, weichen die Ergebnisse von der tatsächlichen Ausgabe ab, die Sie bei Ausführung des Trainings und der Bewertung mit einem echten Dataset erhalten hätten.

An dieser Stelle können Sie entweder diese Anleitung abschließen und Ihre Google Cloud-Ressourcen bereinigen oder sich genauer damit beschäftigen, wie das Modell auf Cloud TPU Pods ausgeführt wird.

Größere Modelle verwenden

ResNet-RS bietet eine Reihe von Modellen unterschiedlicher Größe. Dabei sind die größeren Modelle in der Regel genauer, erfordern jedoch einen höheren Rechenaufwand. Weitere Informationen finden Sie unter Revisiting ResNets: Improved Training and Scaling Strategies.

Sie können die Größe des zu trainierenden Modells auswählen. Dazu ändern Sie die config_file im folgenden Befehl.

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs200_i256.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

Die verfügbaren Konfigurationen befinden sich in /usr/share/models/official/vision/beta/configs/experiments/ auf Ihrer VM.

Modell mit Cloud TPU Pods skalieren

Wenn Sie das Modell auf Cloud TPU-Pods trainieren, sind möglicherweise einige Änderungen am Trainingsskript erforderlich. Weitere Informationen finden Sie unter Training auf TPU-Pods.

Sie können schneller Ergebnisse erzielen, wenn Sie Ihr Modell mit Cloud TPU Pods skalieren. Das vollständig unterstützte ResNet-RS-50-Modell kann mit den folgenden Pod-Slices verwendet werden:

  • v2-32
  • v3-32

Mit Cloud TPU-Pods werden Training und Evaluierung gemeinsam durchgeführt.

Cloud TPU Pods trainieren

  1. Löschen Sie die Cloud TPU-Ressource, die Sie zum Trainieren des Modells auf einem einzelnen Gerät erstellt haben.

    (vm)$ gcloud compute tpus execution-groups delete resnet-rs-tutorial \
      --zone=europe-west4-a \
      --tpu-only
  2. Erstellen Sie mit dem Parameter accelerator-type eine neue Cloud TPU-Ressource für den Pod, um das Pod-Slice anzugeben, das verwendet werden soll. Der folgende Befehl nutzt beispielsweise ein v3-32-Pod-Slice.

    (vm)$ gcloud compute tpus execution-groups  create --name=resnet-rs-tutorial \
      --accelerator-type=v3-32  \
      --zone=europe-west4-a \
      --tf-version=2.12.0 \
      --tpu-only
    

    Beschreibung der Befehls-Flags

    name
    Der Name der zu erstellenden Cloud TPU.
    accelerator-type
    Der Typ der zu erstellenden Cloud TPU.
    zone
    Die Zone, in der Sie Ihre Cloud TPU erstellen möchten.
    tf-version
    Die TensorFlow-Version gcloud wird auf der VM installiert.
    tpu-only
    Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl gcloud eine VM und eine Cloud TPU erstellt.
  3. Führen Sie das Trainingsskript aus.

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    Beschreibung der Befehls-Flags

    experiment
    Der Name des Tests, der ausgeführt werden soll.
    mode
    Der Modus, in dem das Script ausgeführt wird. Gültige Werte sind "train", "eval" oder "train_and_eval".
    model_dir
    Der Cloud Storage-Bucket, in dem während des Trainings Prüfpunkte und Zusammenfassungen gespeichert werden. Sie können einen vorhandenen Ordner verwenden, um zuvor generierte Prüfpunkte zu laden, die auf einer TPU mit derselben Größe und TensorFlow-Version erstellt wurden.
    tpu
    Der Name der zu verwendenden TPU.
    config_file
    Der Pfad zu einer Skriptkonfigurationsdatei.
    params_override
    Überschreibt die Einstellungen, die in der Skriptkonfigurationsdatei festgelegt wurden.

Dadurch wird ResNet-RS für 100 Trainingsschritte trainiert und das Training wird auf einem v3-8-TPU-Knoten in weniger als 5 Minuten abgeschlossen. Die Ausgabe des Trainingsskripts sollte Text wie den folgenden enthalten:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

Das Trainingsskript führt ebenfalls eine Evaluierung durch. Die Evaluierungsausgabe sollte folgenden Text enthalten:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

Training und Bewertung werden gemeinsam durchgeführt. Jede Epoche umfasst 1251 Schritte für insgesamt 112590 Trainingsschritte und 48 Bewertungsschritte.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

  1. Trennen Sie die Verbindung zur Compute Engine-Instanz, sofern noch nicht geschehen:

    (vm)$ exit
    

    Die Eingabeaufforderung sollte nun username@projectname lauten und angeben, dass Sie sich in Cloud Shell befinden.

  2. Verwenden Sie in Cloud Shell den folgenden Befehl, um Ihre Compute Engine-VM und Cloud TPU zu löschen:

    $ gcloud compute tpus execution-groups delete resnet-rs-tutorial \
      --zone=europe-west4-a
    
  3. Prüfen Sie, ob die Ressourcen gelöscht wurden. Führen Sie dazu gcloud compute tpus execution-groups list aus. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass Ihre Instanzen erfolgreich gelöscht wurden.

    $ gcloud compute tpus execution-groups list \
     --zone=europe-west4-a
    

    Sie sollten eine leere Liste der TPUs sehen, die in etwa so aussieht:

       NAME             STATUS
    
  4. Löschen Sie Ihren Cloud Storage-Bucket wie unten gezeigt mit gsutil. Ersetzen Sie bucket-name durch den Namen des Cloud Storage-Buckets.

    $ gsutil rm -r gs://bucket-name
    

Nächste Schritte

In den Cloud TPU-Anleitungen von TensorFlow wird das Modell in der Regel mithilfe eines Beispiel-Datasets trainiert. Die Ergebnisse dieses Trainings sind nicht für Inferenzen verwendbar. Wenn Sie ein Modell für die Inferenz verwenden möchten, können Sie die Daten mit einem öffentlich verfügbaren Dataset oder Ihrem eigenen Dataset trainieren. Für TensorFlow-Modelle, die auf Cloud TPUs trainiert wurden, müssen im Allgemeinen Datasets im TFRecord-Format erforderlich sein.

Mit dem Beispiel für das Dataset-Konvertierungstool können Sie ein Bildklassifizierungs-Dataset in das TFRecord-Format konvertieren. Wenn Sie kein Bildklassifizierungsmodell verwenden, müssen Sie das Dataset selbst in das TFRecord-Format konvertieren. Weitere Informationen finden Sie unter TFRecord und tf.Example.

Hyperparameter-Feinabstimmung

Sie können die Hyperparameter des Modells abstimmen, um die Leistung des Modells mit Ihrem Dataset zu verbessern. Informationen zu den Hyperparametern, die alle von der TPU unterstützten Modelle gemeinsam sind, finden Sie auf GitHub. Informationen zu modellspezifischen Hyperparametern finden Sie im Quellcode des jeweiligen Modells. Weitere Informationen zur Abstimmung von Hyperparametern finden Sie unter Übersicht über die Abstimmung von Hyperparametern und Hyperparameter abstimmen.

Inferenz

Nachdem Sie Ihr Modell trainiert haben, können Sie es für Inferenzen (auch Vorhersage genannt) verwenden. Mit dem Cloud TPU-Inferenzkonverter-Tool können Sie ein TensorFlow-Modell für die Inferenz in Cloud TPU v5e vorbereiten und optimieren. Weitere Informationen zur Inferenz in Cloud TPU v5e finden Sie unter Einführung in Cloud TPU v5e-Inferenz.