RetinaNet auf Cloud TPU trainieren

In diesem Dokument wird eine Implementierung des RetinaNet-Objekterkennungsmodells erläutert. Der Code ist auf GitHub verfügbar.

In der folgenden Anleitung wird davon ausgegangen, dass Sie bereits mit dem Ausführen eines Modells auf Cloud TPU vertraut sind. Wenn Sie Cloud TPU noch nicht kennen, finden Sie in der Kurzanleitung eine grundlegende Einführung.

Wenn Sie auf einem TPU Pod-Slice trainieren möchten, lesen Sie Auf TPU Pods trainieren, um mehr über Parameteränderungen für Pod-Slices zu erfahren.

Ziele

  • Cloud Storage-Bucket zum Speichern der Dataset- und Modellausgabe erstellen
  • COCO-Dataset vorbereiten
  • Compute Engine-VM und einen Cloud TPU-Knoten für das Training und die Bewertung einrichten
  • Training und Bewertung auf einer einzelnen Cloud TPU oder einem Cloud TPU Pod ausführen

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

Dieser Abschnitt enthält Informationen zum Einrichten eines Cloud Storage-Buckets und einer Compute Engine-VM.

  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 Befehlszeilentool gcloud, um das Projekt zu verwenden, in dem Sie 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.

  5. Starten Sie mit dem Befehl ctpu up eine Compute Engine-VM.

    ctpu up --zone=europe-west4-a \
     --vm-only \
     --disk-size-gb=300 \
     --machine-type=n1-standard-8 \
     --tf-version=1.15.3 \
     --name=retinanet-tutorial
    
  6. Die von Ihnen angegebene Konfiguration wird angezeigt. Geben Sie y zum Bestätigen oder n zum Abbrechen ein.

  7. Wenn der Befehl ctpu up ausgeführt wurde, sollten Sie prüfen, 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 retinanet-tutorial --zone=europe-west4-a
    

    Führen Sie im weiteren Verlauf dieser Anleitung jeden Befehl, der mit (vm)$ beginnt, in Ihrem VM-Sitzungsfenster aus.

    Wenn der Befehl ctpu eine virtuelle Maschine (VM) von Compute Engine startet, werden die RetinaNet-Modelldateien aus dem TensorFlow-Branch automatisch im Verzeichnis /usr/share/tpu/models/official/detection/ abgelegt.

  8. Verwenden Sie den Befehl export, um diese Umgebungsvariablen festzulegen.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export TPU_NAME=retinanet-tutorial
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    
  9. Zusätzliche Pakete installieren

    Die RetinaNet-Trainingsanwendung erfordert mehrere zusätzliche Pakete. Installieren Sie diese jetzt:

    (vm)$ sudo apt-get install -y python3-tk
    
    (vm)$ pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow
    
    (vm)$ pip3 install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'
    
    (vm)$ pip3 install --user -U gast==0.2.2
    

COCO-Dataset vorbereiten

  1. Führen Sie das Skript download_and_preprocess_coco.sh aus, um das COCO-Dataset in einen Satz von TFRecords (*.tfrecord) zu konvertieren, der von der Trainingsanwendung erwartet wird.

    (vm)$ sudo bash /usr/share/tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco
    

    Dadurch werden die erforderlichen Bibliotheken installiert und das Skript für die Vorverarbeitung ausgeführt. Dann werden verschiedene *.tfrecord-Dateien in Ihr lokales Datenverzeichnis ausgegeben.

  2. Nachdem Sie die Daten in TFRecords konvertiert haben, kopieren Sie sie mit dem Befehl gsutil aus dem lokalen Speicher in den Cloud Storage-Bucket. Die Anmerkungsdateien müssen ebenfalls kopiert werden. Diese Dateien helfen dabei, die Leistung des Modells zu bewerten:

    (vm)$ gsutil -m cp ./data/dir/coco/*.tfrecord ${DATA_DIR}
    
    (vm)$ gsutil cp ./data/dir/coco/raw-data/annotations/*.json ${DATA_DIR}
    

Trainingsumgebung einrichten

  1. Führen Sie den folgenden Befehl aus, um die Cloud TPU zu erstellen.

    (vm)$ ctpu up --tpu-only \
      --tf-version=1.15.3 \
      --name=retinanet-tutorial
    
    Parameter Beschreibung
    --tpu-only Erstellen Sie nur eine Cloud TPU und keine VM.
    --tf-version Die Version von Tensorflow, die von `ctpu` auf der VM installiert wird.
    --name Der Name der Cloud TPU.
  2. Die von Ihnen angegebene Konfiguration wird angezeigt. Geben Sie y zum Bestätigen oder n zum Abbrechen ein.

    Sie erhalten folgende Meldung: Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag. Da Sie die SSH-Schlüsselverteilung bereits abgeschlossen haben, können Sie diese Nachricht ignorieren.

  3. Keepalive-Werte der VM-Verbindung aktualisieren

    Diese Anleitung erfordert eine langlebige Verbindung zur Compute Engine-Instanz. Führen Sie den folgenden Befehl aus, um zu prüfen, ob eine Verbindung zur Instanz besteht:

    (vm)$ sudo /sbin/sysctl \
      -w net.ipv4.tcp_keepalive_time=120 \
      net.ipv4.tcp_keepalive_intvl=120 \
      net.ipv4.tcp_keepalive_probes=5
    
  4. Sie können jetzt das Modell mit den vorverarbeiteten COCO-Daten ausführen. Fügen Sie zuerst dem Python-Pfad mit folgendem Befehl den obersten Ordner /models hinzu:

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

Für das Training und die Evaluierung wird mindestens die TensorFlow-Version 1.13 benötigt.

Einzelnes Cloud TPU-Gerät trainieren

  1. Richten Sie die folgenden Umgebungsvariablen ein:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-train
    (vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07
    (vm)$ export TRAIN_FILE_PATTERN=${DATA_DIR}/train-*
    (vm)$ export EVAL_FILE_PATTERN=${DATA_DIR}/val-*
    (vm)$ export VAL_JSON_FILE=${DATA_DIR}/instances_val2017.json
    
  2. Führen Sie das Trainingsskript aus:

    (vm)$ python3 /usr/share/tpu/models/official/detection/main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --num_cores=8 \
    --model_dir=${MODEL_DIR} \
    --mode="train" \
    --eval_after_training=True \
    --params_override="{ type: retinanet, train: { checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
    
    Parameter Beschreibung
    --use_tpu Trainieren Sie das Modell auf einer einzelnen Cloud TPU.
    --tpu Gibt den Namen der Cloud TPU an. Dieser wird durch Angabe der Umgebungsvariable (TPU_NAME) festgelegt.
    --num_cores Gibt die Anzahl der Kerne der Cloud TPU an.
    --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_direin 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.
    --mode Gibt den Modus an, in dem das Modell ausgeführt werden soll. Gültige Werte sind train und eval

Bewertung eines einzelnen Cloud TPU-Geräts

Im folgenden Verfahren werden die COCO-Bewertungsdaten verwendet. Es dauert etwa zehn Minuten, um die Bewertungsschritte zu durchlaufen.

  1. Richten Sie die folgenden Umgebungsvariablen ein:

    (vm)$ export EVAL_SAMPLES=5000
    
  2. Führen Sie das Bewertungsskript aus:

      (vm)$ python3 /usr/share/tpu/models/official/detection/main.py \
        --use_tpu=True \
        --tpu=${TPU_NAME} \
        --num_cores=8 \
        --model_dir=${MODEL_DIR} \
        --mode="eval" \
        --params_override="{ type: retinanet, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: ${EVAL_SAMPLES} } }"
    
    Parameter Beschreibung
    --use_tpu Bewertet das Modell auf einer einzelnen Cloud TPU.
    --tpu Gibt den Namen der Cloud TPU an. Dieser wird durch Angabe der Umgebungsvariable (TPU_NAME) festgelegt.
    --num_cores Gibt die Anzahl der Kerne der Cloud TPU an.
    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_direin 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.
    --mode Gibt den Modus an, in dem das Modell ausgeführt werden soll. Gültige Werte sind train und eval

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 RetinaNet-Modell kann mit den folgenden Pod-Slices verwendet werden:

  • v2-32
  • v3-32
  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 --zone=europe-west4-a --name=retinanet-tutorial
  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 \
      --tpu-size=v3-32 \
      --zone=europe-west4-a \
      --tf-version=1.15.3 \
      --name=retinanet-tutorial-pod
     
  3. Die von Ihnen angegebene Konfiguration wird angezeigt. Geben Sie y zum Bestätigen oder n zum Abbrechen ein.

    Sie erhalten folgende Meldung: Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag. Da Sie die SSH-Schlüsselverteilung bereits abgeschlossen haben, können Sie diese Nachricht ignorieren.

  4. Richten Sie die folgenden Umgebungsvariablen ein:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-pod
    (vm)$ export TPU_NAME=retinanet-tutorial-pod
    
  5. Führen Sie das Pod-Trainingsskript auf einem v3-32-TPU-Knoten aus:

    (vm)$ python3 /usr/share/tpu/models/official/detection/main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --num_cores=32 \
    --model_dir=${MODEL_DIR} \
    --mode="train" \
    --eval_after_training=False \
    --params_override="{ type: retinanet, train: { train_batch_size: 1024, total_steps: 2109, learning_rate: { warmup_steps: 820, init_learning_rate: 0.64, learning_rate_levels: [0.064, 0.0064], learning_rate_steps: [1641, 1992] }, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: { batch_norm: { batch_norm_momentum: 0.9 }}, fpn: { batch_norm: { batch_norm_momentum: 0.9 }}, retinanet_head: { batch_norm: { batch_norm_momentum: 0.9 }} }"
    
    Parameter Beschreibung
    --use_tpu Trainiert das Modell in einem Cloud TPU-Pod.
    --tpu Gibt den Namen der Cloud TPU an. Dieser wird durch Angabe der Umgebungsvariable (TPU_NAME) festgelegt.
    --num_cores Gibt die Anzahl der Kerne der Cloud TPU an.
    --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_direin 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.
    --mode Gibt den Modus an, in dem das Modell ausgeführt werden soll.
    --eval_after_training Auf True gesetzt, um das Modell nach dem Training auszuwerten.
    --params_override Überschreibt Modellparameter mit angegebenen Werten

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. 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 --name=retinanet-tutorial
    
  3. Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Compute Engine-VM und die Cloud TPU heruntergefahren wurden:

    $ ctpu status --zone=europe-west4-a
    

    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 RetinaNet-Modell mit einem Beispiel-Dataset 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.

Mit verschiedenen Bildgrößen trainieren

Sie können auch ein neuronales Netzwerk wie ResNet-101 statt ResNet-50 ausprobieren. Ein größeres Eingabebild und ein leistungsfähigeres neuronales Netzwerk ergeben ein langsameres, aber präziseres Modell.

Andere Grundlage verwenden

Alternativ können Sie versuchen, ein ResNet-Modell im Voraus mit Ihrem eigenen Dataset zu trainieren und es als Grundlage für Ihr RetinaNet-Modell zu verwenden. Sie haben auch die Möglichkeit, ResNet durch ein alternatives neuronales Netzwerk zu ersetzen. Wenn Sie Ihre eigenen Objekterkennungsmodelle implementieren möchten, ist dieses Netzwerk möglicherweise eine gute Basis für weitere Experimente.