EfficientNet auf Cloud TPU trainieren (TF 2.x)

In dieser Anleitung erfahren Sie, wie Sie ein Keras EfficientNet-Modell auf Cloud TPU mit tf.distribute.TPUStrategy trainieren.

Wenn Sie nicht mit Cloud TPU vertraut sind, sollten Sie sich die Kurzanleitung durchlesen, um zu erfahren, wie Sie eine Cloud TPU und eine Compute Engine-VM erstellen.

Ziele

  • 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 prü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 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 -b on 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 ctpu up-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 in Cloud Shell die Compute Engine-VM-Ressource mit dem Befehl ctpu up.

    ctpu up --vm-only \
       --name=efficientnet-tutorial \
       --zone=europe-west4-a \
       --disk-size-gb=300 \
       --machine-type=n1-standard-16 \
       --tf-version=2.3.1
    

    Beschreibung der Befehls-Flags

    name
    Der Name der zu erstellenden Cloud TPU.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    disk-size-gb
    Die Größe des Laufwerks in GB der VM, die mit dem Befehl ctpu up erstellt wurde.
    machine-type
    Der Maschinentyp der zu erstellenden Compute Engine-VM.
    tf-version
    Die Version von Tensorflow, die von ctpu auf der VM installiert wird.

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

  7. 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@projectname in username@vm-name geändert wurde. Diese Änderung bedeutet, dass Sie jetzt bei Ihrer Compute Engine-VM angemeldet sind.

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

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}/efficientnet-2x
(vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet

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.

EfficientNet-Modell mit fake_imagenet trainieren und evaluieren

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. Starten Sie mit dem ctpu-Dienstprogramm eine Cloud TPU-Ressource.

    (vm)$ ctpu up --tpu-only \
     --name=efficientnet-tutorial \
     --tpu-size=v3-8  \
     --zone=europe-west4-a \
     --tf-version=2.3.1
    

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl ctpu up eine VM und eine Cloud TPU erstellt.
    name
    Der Name der zu erstellenden Cloud TPU.
    tpu-size
    Der Typ der zu erstellenden Cloud TPU.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    tf-version
    Die Version von Tensorflow, die von ctpu auf der VM installiert wird.
  2. Legen Sie die Cloud TPU-Namensvariable fest. Dies ist entweder ein Name, den Sie mit dem Parameter --name auf ctpu up festgelegt haben, oder der Standardwert, Ihr Nutzername:

    (vm)$ export TPU_NAME=efficientnet-tutorial
    
  3. Das Trainingsskript EfficientNet erfordert zusätzliche Pakete. Installieren Sie diese jetzt:

    (vm)$ sudo pip3 install tensorflow-addons
    (vm)$ sudo pip3 install tensorflow-model-optimization>=0.1.3
    
  4. Fügen Sie dem Python-Pfad den obersten Ordner /models hinzu:

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models/"
    

    Das EfficientNet-Modell ist auf Ihrer Compute Engine-VM vorinstalliert.

  5. Rufen Sie das Verzeichnis auf:

    (vm)$ cd /usr/share/models/official/vision/image_classification/
    
  6. Führen Sie das Trainingsskript aus. Dies verwendet ein fake_imagenet-Dataset und trainiert EfficientNet für eine Epoche.

    (vm)$ python3 classifier_trainer.py \
    --mode=train_and_eval \
    --model_type=efficientnet \
    --dataset=imagenet \
    --tpu=${TPU_NAME} \
    --data_dir=${DATA_DIR} \
    --model_dir=${MODEL_DIR} \
    --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
    --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
    

    Beschreibung der Befehls-Flags

    mode
    Wenn train_and_eval festgelegt ist, wird dieses Modell trainiert und bewertet. Wenn dieses Skript auf export_only gesetzt ist, exportiert es ein gespeichertes Modell.
    model_type
    Der Typ des Modells. Zum Beispiel efficientnet usw.
    dataset
    Der Name des Datasets. Beispiel: imagenet
    tpu
    Verwendet den in der Umgebungsvariable TPU_NAME angegebenen Namen.
    data_dir
    Gibt den Cloud Storage-Pfad für die Trainingseingabe an. In diesem Beispiel ist er 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 Sie eine Cloud TPU verwenden, muss model_dir ein Cloud Storage-Pfad ("gs://...") sein. Sie können einen vorhandenen Ordner wiederverwenden, um aktuelle Prüfpunktdaten zu laden und zusätzliche Prüfpunkte zu speichern, solange die vorherigen Prüfpunkte mit Cloud TPU derselben Größe und TensorFlow-Version erstellt wurden.
    config_file
    Der Pfad zur JSON-Datei, die das vortrainierte Modell EfficientNet enthält. Diese Datei enthält die Modellarchitektur.
    params_override
    Ein JSON-String, der Standardskriptparameter überschreibt. Weitere Informationen zu Skriptparametern finden Sie unter /usr/share/models/official/vision/detection/main.py.

Dies führt zu einer Trainingsphase von EfficientNet für eine Epoche und wird in weniger als 10 Minuten auf einem v3-8-Cloud-TPU-Knoten abgeschlossen. Am Ende des Trainings sieht die Ausgabe in etwa so aus:

I1107 20:28:57.561836 140033625347520 efficientnet_ctl_imagenet_main.py:222] Training 1 epochs, each epoch has 1251 steps, total steps: 1251; Eval 48 steps
I1107 20:34:09.638025 140033625347520 efficientnet_ctl_imagenet_main.py:358] Training loss: 0.6292637, accuracy: 0.99680257 at epoch 1
I1107 20:34:21.682796 140033625347520 efficientnet_ctl_imagenet_main.py:372] Test loss: 3.8977659, accuracy: 0.0% at epoch: 1
I1107 20:34:22.028973 140033625347520 efficientnet_ctl_imagenet_main.py:392]
Run stats:
{'train_loss': 0.6292637, 'train_acc': 0.99680257, 'eval_acc': 0.0, 'step_timestamp_log':
['BatchTimestamp < batch_index: 1, timestamp: 1573158554.11 >'],
'train_finish_time': 1573158861.683073, 'eval_loss': 3.8977659>}

Führen Sie EfficientNet 90 Epochen lang aus, wie im folgenden Skript gezeigt. Training und Bewertung werden gemeinsam durchgeführt. Jede Epoche umfasst 1251 Schritte für insgesamt 112590 Trainingsschritte und 48 Bewertungsschritte.

   (vm)$ python3 classifier_trainer.py \
     --mode=train_and_eval \
     --model_type=efficientnet \
     --dataset=imagenet \
     --tpu=${TPU_NAME} \
     --data_dir=${DATA_DIR} \
     --model_dir=${MODEL_DIR} \
     --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
     --params_override="train_dataset.builder=records, validation_dataset.builder=records"

Beschreibung der Befehls-Flags

mode
Wenn dieses Skript auf "train_and_eval" gesetzt ist, wird das Modell trainiert und ausgewertet. Wenn dieses Skript auf "export_only" gesetzt ist, exportiert dieses Skript ein gespeichertes Modell.
model_type
Der Typ des Modells. Zum Beispiel efficientnet usw.
dataset
Der Name des Datasets. Beispiel: imagenet
tpu
Verwendet den in der Variable TPU_NAME angegebenen Namen.
data_dir
Gibt den Cloud Storage-Pfad für die Trainingseingabe an. In diesem Beispiel ist er 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, wird er vom Skript erstellt. Wenn Sie eine Cloud TPU verwenden, muss model_dir ein Cloud Storage-Pfad ("gs://...") sein. Sie können einen vorhandenen Ordner wiederverwenden, um aktuelle Prüfpunktdaten zu laden und zusätzliche Prüfpunkte zu speichern, solange die vorherigen Prüfpunkte mit einer Cloud TPU derselben Größe und TensorFlow-Version erstellt wurden.
config_file
Der Pfad zur JSON-Datei, die das vortrainierte Modell EfficientNet enthält. Diese Datei enthält die Modellarchitektur.
params_override
Ein JSON-String, der Standardskriptparameter überschreibt. Weitere Informationen zu Skriptparametern finden Sie unter /usr/share/models/official/vision/detection/main.py.

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 beenden und Ihre GCP-Ressourcen bereinigen oder die Ausführung des Modells auf Cloud TPU Pods kennenlernen.

Modell mit Cloud TPU Pods skalieren

Sie können schneller Ergebnisse erzielen, wenn Sie Ihr Modell mit Cloud TPU Pods skalieren. Das vollständig unterstützte EfficientNet-Modell kann mit den folgenden Pod-Segmenten 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)$ ctpu delete --tpu-only \
     --name=efficientnet-tutorial \
     --zone=europe-west4-a
  2. Führen Sie den Befehl ctpu up mit dem Parameter tpu-size aus, um den Pod-Slice anzugeben, den Sie verwenden möchten. Der folgende Befehl verwendet beispielsweise einen v3-32-Pod-Slice.

    (vm)$ ctpu up --tpu-only \
      --name=efficientnet-tutorial \
      --zone=europe-west4-a \
      --tpu-size=v3-32 \
      --tf-version=2.3.1
    

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl ctpu up eine VM und eine Cloud TPU erstellt.
    name
    Der Name der zu erstellenden Cloud TPU.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    tpu-size
    Der Typ der zu erstellenden Cloud TPU.
    tf-version
    Die Version von Tensorflow, die von ctpu auf der VM installiert wird.
    gcloud compute ssh efficientnet-tutorial --zone=europe-west4-a
    
  3. Aktualisieren Sie das Verzeichnis MODEL_DIR, um die Cloud TPU Pod-Trainingsdaten zu speichern.

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x-pod
    
  4. Definieren Sie Ihren Cloud TPU-Namen.

    (vm)$ export TPU_NAME=efficientnet-tutorial
    
  5. Rufen Sie das Verzeichnis auf:

    (vm)$ cd /usr/share/models/official/vision/image_classification/
    
  6. Modell trainieren

    (vm)$ python3 classifier_trainer.py \
    --mode=train_and_eval \
    --model_type=efficientnet \
    --dataset=imagenet \
    --tpu=${TPU_NAME} \
    --data_dir=${DATA_DIR} \
    --model_dir=${MODEL_DIR} \
    --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
    --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
    

    Beschreibung der Befehls-Flags

    mode
    Wenn train_and_eval festgelegt ist, wird dieses Modell trainiert und bewertet. Wenn dieses Skript auf export_only gesetzt ist, exportiert es ein gespeichertes Modell.
    model_type
    Der Typ des Modells. Zum Beispiel efficientnet usw.
    dataset
    Der Name des Datasets. Beispiel: imagenet
    tpu
    Verwendet den in der Variable TPU_NAME angegebenen Namen.
    data_dir
    Gibt den Cloud Storage-Pfad für die Trainingseingabe an. In diesem Beispiel ist er 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 Skript einen. Wenn Sie eine Cloud TPU verwenden, muss model_dir ein Cloud Storage-Pfad ("gs://...") sein. Sie können einen vorhandenen Ordner wiederverwenden, um aktuelle Prüfpunktdaten zu laden und zusätzliche Prüfpunkte zu speichern, solange die vorherigen Prüfpunkte mit Cloud TPU derselben Größe und TensorFlow-Version erstellt wurden.
    config_file
    Der Pfad zur JSON-Datei, die das vortrainierte Modell EfficientNet enthält. Diese Datei enthält die Modellarchitektur.
    params_override
    Ein JSON-String, der Standardskriptparameter überschreibt. Weitere Informationen zu Skriptparametern finden Sie unter /usr/share/models/official/vision/detection/main.py.

Mit dem Verfahren wird das Modell für das fake_imagenet-Dataset auf eine Epoche (insgesamt 312 Trainingsschritte und 12 Bewertungsschritte) trainiert. Dieses Training dauert bei einer v3-32 Cloud TPU etwa 2 Minuten. Wenn das Training und die Bewertung abgeschlossen sind, wird eine Meldung wie die folgende angezeigt:

1107 22:45:19.821746 140317155378624 efficientnet_ctl_imagenet_main.py:358] Training loss: 0.22576721, accuracy: 0.838141 at epoch 1
I1107 22:45:33.892045 140317155378624 efficientnet_ctl_imagenet_main.py:372] Test loss: 0.26673648, accuracy: 0.0% at epoch: 1
I1107 22:45:34.851322 140317155378624 efficientnet_ctl_imagenet_main.py:392] Run stats:
{'train_loss': 0.22576721, 'train_acc': 0.838141, 'eval_acc': 0.0, 'step_timestamp_log': ['BatchTimestamp <batch_index: 1, timestamp: 1573166574.67>'], 'train_finish_time': 1573166733.892282, 'eval_loss': 0.26673648}

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@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:

    $ ctpu delete --name=efficientnet-tutorial \
      --zone=europe-west4-a
    
  3. Führen Sie ctpu status aus, damit keine Instanzen zugeordnet wurden und unnötige Gebühren für die Cloud TPU-Nutzung vermieden werden. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass keine weiteren Instanzen vorhanden sind:

    $ ctpu status --name=efficientnet-tutorial --zone=europe-west4-a
    
    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 EfficientNet-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.

  • In der Anleitung zur Dataset-Konvertierung erfahren Sie, wie Sie mit Ihren eigenen Daten anstelle der Datasets "fake_imagenet" oder "ImageNet" trainieren und auswerten. In dieser Anleitung wird erläutert, wie Sie mit dem Skript-Beispiel für die Konvertierung von Bildklassifizierungsdaten ein Rohdataset für die Bildklassifizierung in das von Cloud TPU Tensorflow-Modellen verwendete TFRecord-Format konvertieren.

  • Führen Sie eine Cloud TPU colab aus, die zeigt, wie Sie ein Bildklassifizierungsmodell mit Ihren eigenen Bilddaten ausführen.

  • Andere Cloud TPU-Anleitungen ansehen.

  • TPU-Monitoring-Tools in TensorBoard verwenden