ResNet in der Cloud TPU trainieren

Das Modell in dieser Anleitung basiert auf dem Framework Deep Residual Learning for Image Recognition, in dem erstmalig die Residualnetzwerkarchitektur (ResNet-Architektur) eingeführt wurde. In der Anleitung wird anhand der 50-Schichten-Variante "ResNet-50" gezeigt, wie Sie das Modell mit TPUEstimator trainieren. Das ResNet-50-Modell ist auf Ihrer Compute Engine-VM vorinstalliert.

Ziele

  • Cloud Storage-Bucket zum Speichern der Dataset- und Modellausgabe erstellen
  • Bereiten Sie eine Testversion des ImageNet-Datasets vor, die als Dataset fake_imagenet bezeichnet wird.
  • Trainingsjob ausführen
  • Ausgabeergebnisse überprüfen

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

  • Compute Engine
  • Cloud TPU
  • cl

Sie können mithilfe des Preisrechners die Kosten für Ihre voraussichtliche Nutzung kalkulieren. 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-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. Wählen Sie in der Cloud Console auf der Seite für die Projektauswahl ein Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. 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 das gcloud-Befehlszeilentool für das Projekt, in dem Sie eine Cloud TPU erstellen möchten.

    gcloud config set project ${PROJECT_ID}
    
  4. Erstellen Sie mit dem folgenden Befehl einen Cloud Storage-Bucket:

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

    Dieser Cloud Storage-Bucket speichert die Daten, die Sie zum Trainieren Ihres Modells verwenden, und die Trainingsergebnisse. Das in dieser Anleitung verwendete Tool ctpu up richtet Standardberechtigungen für das Cloud TPU-Dienstkonto ein. Wenn Sie weitere Berechtigungen benötigen, können Sie die Berechtigungen auf Zugriffsebene anpassen.

    Der Bucket-Speicherort muss sich in derselben Region wie die virtuelle Maschine (VM) und der TPU-Knoten befinden. VMs und TPU-Knoten befinden sich in bestimmten Zonen, die Untergruppen innerhalb einer Region sind.

  5. Starten Sie die dafür erforderlichen Compute Engine-Ressourcen mit dem Befehl ctpu up.

    ctpu up --zone=europe-west4-a \
    --vm-only \
    --disk-size-gb=300 \
    --machine-type=n1-standard-8 \
    --tf-version=1.15.3 \
    --name=resnet-tutorial

    Weitere Informationen zum CTPU-Dienstprogramm finden Sie unter CTPU-Referenz.

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

Wenn der Befehl ctpu up ausgeführt wurde, prüfen Sie, ob die Shell-Eingabeaufforderung von username@project in username@vm-name geändert wurde. Diese Änderung bedeutet, dass Sie jetzt bei Ihrer Compute Engine-VM angemeldet sind. Wenn Sie nicht mit der Compute Engine-Instanz verbunden sind, führen Sie den folgenden Befehl aus:

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

Ab jetzt bedeutet das Präfix (vm)$, dass Sie den Befehl in der Compute Engine-VM-Instanz ausführen sollten.

Speicher-, Modell- und Datenpfade konfigurieren

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
(vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"

Die Trainingsanwendung erwartet, dass Ihre Trainingsdaten in Cloud Storage verfügbar sind. Die Trainingsanwendung verwendet Ihren Cloud Storage-Bucket zum Speichern von Prüfpunkten während des Trainings.

ResNet-Modell mit fake_imagenet trainieren und evaluieren

ImageNet ist eine Bilddatenbank. Die Bilder in der Datenbank sind in einer Hierarchie organisiert. Jeder Knoten der Hierarchie enthält Hunderte und Tausende von Bildern.

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. Starten Sie eine Cloud TPU-Ressource mit dem Dienstprogramm ctpu und legen Sie einige Umgebungsvariablen fest, die später verwendet werden.

     (vm)$ ctpu up --tpu-only \
     --tf-version=1.15.3 \
     --name=resnet-tutorial
    
     (vm)$ export TPU_NAME=resnet-tutorial
     (vm)$ export ACCELERATOR_TYPE=v3-8
    
  2. Navigieren Sie zum Modellverzeichnis:

    (vm)$ cd /usr/share/tpu/models/official/resnet/
    
  3. Führen Sie das Trainingsskript aus.

    Bei einem einzelnen Cloud TPU-Gerät wird das ResNet-50-Modell über 90 Epochen trainiert und die Ergebnisse werden nach jedem Trainingsschritt bewertet. Die Anzahl der Trainingsschritte wird mit dem Flag train_steps festgelegt. Mit der folgenden Skriptbefehlszeile sollte das Modell in etwa 15 Minuten trainiert werden.

    Da das Training und die Bewertung für das fake_imagenet-Dataset durchgeführt werden, weichen die Trainings- und Bewertungsergebnisse von den tatsächlichen Ergebnisse ab, die Sie bei der Ausführung des Trainings und der Bewertung mit einem echten Dataset erhalten hätten.

    Wenn Sie dieses Skript für ein echtes Dataset ausführen, verwenden Sie das Flag train_steps, um die Anzahl der Trainingsschritte anzugeben. In den .yaml-Dateien im Verzeichnis /usr/share/tpu/models/official/resnet/configs/cloud sehen Sie, wie viele Trainingsschritte Sie verwenden sollten.

     (vm)$ python3 resnet_main.py \
        --tpu=${TPU_NAME} \
        --data_dir=${DATA_DIR} \
        --model_dir=${MODEL_DIR} \
        --train_steps=500 \
        --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    
    Parameter Beschreibung
    tpu Gibt den Namen der Cloud TPU an. Beachten Sie, dass ctpu diesen Namen als Umgebungsvariable (TPU_NAME) an die Compute Engine-VM übergibt.
    data_dir Gibt den Cloud Storage-Pfad für die Trainingseingabe an. Er ist in diesem Beispiel auf das Dataset "fake_imagenet" festgelegt.
    model_dir Gibt das Verzeichnis an, in dem während des Modelltrainings Prüfpunkte und Zusammenfassungen gespeichert werden. Wenn der Ordner fehlt, erstellt das Programm einen. Wenn eine Cloud TPU verwendet wird, muss model_dir ein Cloud Storage-Pfad sein (`gs://...`). Sie können einen vorhandenen Ordner wiederverwenden, um aktuelle Prüfpunktdaten zu laden und zusätzliche Prüfpunkte zu speichern, sofern die vorherigen Prüfpunkte mit TPU derselben Größe und TensorFlow-Version erstellt wurden.
    config_file Gibt die YAML-Konfigurationsdatei an, die während des Trainings verwendet werden soll. Der Name dieser Datei entspricht dem verwendeten TPU-Typ. Beispiel: v2-8.yaml.

An dieser Stelle können Sie entweder diese Anleitung beenden und Ihre GCP-Ressourcen bereinigen oder die Ausführung des Modells auf Cloud TPU Pods kennenlernen.

Modell mit Cloud TPU Pods skalieren

Wenn Sie ein Modell mit Cloud TPU Pods skalieren, können Sie schneller Ergebnisse erzielen. Das vollständig unterstützte ResNet50-Modell kann mit den folgenden Pod-Slices verwendet werden:

  • v2-32
  • v2-128
  • v2-256
  • v2-512
  • v3-32
  • v3-128
  • v3-256
  • v3-512
  • v3-1024
  • v3-2048

Wenn Sie Cloud TPU Pods verwenden, trainieren Sie zuerst das Modell mit einem Pod und verwenden dann ein einzelnes Cloud TPU-Gerät, um das Modell zu bewerten.

Mit 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)$ ctpu delete --tpu-only --name=resnet-tutorial
    
  2. Führen Sie den Befehl ctpu up mit dem Parameter tpu-size aus, um das Pod-Slice anzugeben, das Sie verwenden möchten. Der folgende Befehl verwendet beispielsweise ein v2-32-Pod-Slice.

      (vm)$ ctpu up --tpu-only --tpu-size=v2-32 --tf-version=1.15.3 --name=resnet-tutorial
    
  3. Aktualisieren Sie die Umgebungsvariablen TPU_NAME und ACCELERATOR_TYPE, um einen TPU-Pod-Namen als Beschleunigertyp anzugeben.

      (vm)$ export TPU_NAME=resnet-tutorial
      (vm)$ export ACCELERATOR_TYPE=v2-32
    
  4. Aktualisieren Sie das Verzeichnis MODEL_DIR, um die Trainingsdaten zu speichern.

      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-tutorial
    
  5. Trainieren Sie das Modell und aktualisieren Sie den Parameter config_file, um die Konfigurationsdatei zu verwenden, die dem Pod-Slice entspricht, den Sie verwenden möchten. Das Trainingsskript verwendet beispielsweise die Konfigurationsdatei v2-32.yaml.

    Das Skript trainiert das Modell für das Dataset "fake_im oben" in 35 Epochen. Die Ausführung auf einer v3-128 Cloud TPU dauert ungefähr 90 Minuten.

      (vm)$ python3 resnet_main.py \
        --tpu=${TPU_NAME} \
        --data_dir=${DATA_DIR} \
        --model_dir=${MODEL_DIR} \
        --train_steps=500 \
        --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    

Modell bewerten

In diesem Schritt verwenden Sie Cloud TPU, um das oben trainierte Modell anhand der Bewertungsdaten von "fake_imagenet" zu bewerten.

  1. Löschen Sie die Cloud TPU-Ressource, die Sie zum Trainieren des Modells erstellt haben.

     (vm)$ ctpu delete --tpu-only --name=resnet-tutorial
    
  2. Starten Sie eine v2-8 Cloud TPU.

     (vm)$ ctpu up --tpu-only \
       --tf-version=1.15.3 \
       --name=resnet-eval
    
  3. Aktualisieren Sie die Umgebungsvariable TPU_NAME.

     (vm)$ export TPU_NAME=resnet-eval
    
  4. Führen Sie die Modellbewertung aus. Fügen Sie dieses Mal das Flag mode hinzu und setzen Sie es auf eval.

     (vm)$ python3 resnet_main.py \
       --tpu=${TPU_NAME} \
       --data_dir=${DATA_DIR} \
       --model_dir=${MODEL_DIR} \
       --mode=eval
       --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    

Dadurch wird eine Ausgabe generiert, die etwa so aussieht:

Eval results: {'loss': 8.255788, 'top_1_accuracy': 0.0009969076, 'global_step': 0, 'top_5_accuracy': 0.005126953}. Elapsed seconds: 76

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.

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud Platform-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

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

    (vm)$ exit
    

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

  2. Führen Sie in Cloud Shell den Befehl ctpu delete mit dem Flag "--zone" aus, das Sie auch beim Einrichten der Cloud TPU angegeben haben, um die Compute Engine-VM und die Cloud TPU zu löschen:

    $ ctpu delete --zone=europe-west4-a
    
  3. Führen Sie ctpu status aus, um zu bestätigen, dass keine Instanzen zugeordnet wurden. So vermeiden Sie unnötige Gebühren für die TPU-Nutzung. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass keine weiteren Instanzen vorhanden sind:

    2018/04/28 16:16:23 WARNING: Setting zone to "europe-west4-a"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. Führen Sie gsutil wie angegeben aus und ersetzen Sie dabei bucket-name durch den Namen des Cloud Storage-Buckets, den Sie für diese Anleitung erstellt haben:

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

Nächste Schritte

In dieser Anleitung haben Sie das RESNET-Modell mithilfe eines Beispiel-Datasets trainiert. Die Ergebnisse dieses Trainings sind in den meisten Fällen nicht für die Inferenz verwendbar. Wenn Sie ein Modell für die Inferenz verwenden möchten, können Sie die Daten in einem öffentlich verfügbaren Dataset oder in Ihrem eigenen Dataset trainieren. Für Modelle, die auf Cloud TPUs trainiert wurden, müssen Datasets das Format TFRecord haben.

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

Hyperparameter-Abstimmung

Sie können die Hyperparameter des Modells optimieren, um die Leistung des Modells mit Ihrem Dataset zu verbessern. Informationen zu Hyperparametern, die für alle TPU-unterstützten Modelle üblich sind, finden Sie auf GitHub. Informationen zu modellspezifischen Hyperparametern finden Sie im Quellcode für die einzelnen Modelle. Weitere Informationen zur Hyperparameter-Abstimmung finden Sie unter Übersicht über Hyperparameter-Abstimmung, Hyperparameter-Abstimmungsdienst und Hyperparameter abstimmen.

Inferenz

Sobald Ihr Modell trainiert ist, können Sie es für Inferenz (auch als Vorhersage bezeichnet) verwenden. AI Platform ist eine cloudbasierte Lösung, mit der Sie Modelle für maschinelles Lernen entwickeln, trainieren und bereitstellen können. Sobald ein Modell bereitgestellt wurde, können Sie den AI Platform Prediction-Dienst verwenden.

  • Mehr über ctpu und die Installation auf einem lokalen Computer
  • TPU-Tools in TensorBoard
  • ResNet mit Cloud TPU und GKE trainieren
  • Anleitung für das RetinaNet-Objekterkennungsmodell durcharbeiten
  • SqueezeNet-Modell von TensorFlow auf Cloud TPU ausführen. Verwenden Sie dazu die obige Anleitung als Ausgangspunkt Die Modellarchitekturen für SqueezeNet und ResNet-50 sind ähnlich. Sie können dieselben Daten und Befehlszeilen-Flags zum Trainieren des Modells verwenden.