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
  • Cloud Storage

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.

    Zu Cloud Shell

  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}
    

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

  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. Das in dieser Anleitung verwendete Tool gcloud compute tpus execution-groups 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.

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

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=retinanet-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-8 \
     --tf-version=1.15.5
    

    Beschreibung der Befehls-Flags

    vm-only
    Erstellen Sie nur eine VM. Standardmäßig werden mit dem Befehl gcloud compute tpus execution-groups 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.
    disk-size
    Die Größe des Laufwerks in GB der VM, die mit dem Befehl gcloud compute tpus execution-groups erstellt wurde.
    machine-type
    Der Maschinentyp der zu erstellenden Compute Engine-VM.
    tf-version
    Die Version von Tensorflow, die von gcloud compute tpus execution-groups auf der VM installiert wird.

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

  7. Die von Ihnen angegebene Konfiguration wird angezeigt. Geben Sie y zum Bestätigen oder n zum Abbrechen ein.

    Wenn der Befehl gcloud compute tpus execution-groups ausgeführt wurde, sollten Sie prüfen, ob die Shell-Eingabeaufforderung von username@projectname zu 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 Ihrer Compute Engine-Instanz aus.

    Wenn der Befehl gcloud 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)$ gcloud compute tpus execution-groups create \
     --tpu-only \
     --name=retinanet-tutorial \
     --zone=europe-west4-a \
     --tf-version=1.15.5
    

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellt die Cloud TPU, ohne eine VM zu erstellen. Standardmäßig werden mit dem Befehl gcloud compute tpus execution-groups 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.
    tf-version
    Die Version von Tensorflow, die von gcloud compute tpus execution-groups auf der VM installiert wird.
  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 } }"
    

    Beschreibung der Befehls-Flags

    use_tpu
    Trainieren Sie das Modell auf einer einzelnen Cloud TPU.
    tpu
    Der Name der Cloud TPU. Dieser wird mit der Umgebungsvariable TPU_NAME festgelegt.
    num_cores
    Die Anzahl der Cloud TPU-Kerne, die beim Training verwendet werden sollen.
    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.
    mode
    Entweder train, eval oder train_and_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} } }"
    

    Beschreibung der Befehls-Flags

    use_tpu
    Legen Sie den Wert true fest, um auf einer Cloud TPU zu trainieren.
    tpu
    Der Name der Cloud TPU, um das Training oder die Bewertung auszuführen.
    num_cores
    Die Anzahl der Cloud TPU-Kerne, die beim Training verwendet werden sollen.
    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.
    mode
    Entweder train, eval oder train_and_eval.
    params_override
    Ein JSON-String, der Standardskriptparameter überschreibt. Weitere Informationen zu Skriptparametern finden Sie unter /usr/share/models/official/vision/detection/main.py.

    Das Bewertungsskript zeigt eine Ausgabe wie die folgende an:

    Eval result: {
      'AP': 0.3371653,
      'ARl': 0.6749888,
      'ARmax100': 0.4848119,
      'APl': 0.48918217,
      'ARmax10': 0.45885247,
      'APs': 0.14764188,
      'ARm': 0.545395,
      'ARs': 0.24094534,
      'AP75': 0.3606217,
      'AP50': 0.51819533,
      'APm': 0.38223606,
      'ARmax1': 0.29476196
    }

    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)$ gcloud compute tpus execution-groups delete retinanet-tutorial \
      --zone=europe-west4-a \
      --tpu-only
  2. Führen Sie den Befehl gcloud compute tpus execution-groups mit dem Parameter accelerator-type aus, um den Pod-Slice anzugeben, den Sie verwenden möchten. Der folgende Befehl verwendet beispielsweise einen v3-32-Pod-Slice.

    (vm)$ gcloud compute tpus execution-groups create --name=retinanet-tutorial \
      --accelerator-type=v3-32  \
      --zone=europe-west4-a \
      --tf-version=1.15.5 \
      --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 die Cloud TPU erstellen möchten.
    tf-version
    Die Version von Tensorflow, die von gcloud auf der VM installiert wird.
    tpu-only
    Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl gcloud eine VM und eine Cloud TPU erstellt.
  3. Richten Sie die folgenden Umgebungsvariablen ein:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-pod
    (vm)$ export TPU_NAME=retinanet-tutorial
    
  4. 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 }} }"
    

    Beschreibung der Befehls-Flags

    use_tpu
    Legen Sie den Wert true fest, um auf einer Cloud TPU zu trainieren.
    tpu
    Der Name der Cloud TPU. Wenn beim Einrichten der Compute Engine VM und Cloud TPU kein Name angegeben wird, wird standardmäßig Ihr Nutzername verwendet.
    num_cores
    Die Anzahl der Cloud TPU-Kerne, die für das Training verwendet werden sollen.
    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.
    mode
    Entweder train, eval, train_and_eval oder predict.
    eval_after_training
    Legen Sie hier true fest, um das Modell nach dem Training auszuwerten.
    params_override
    Ein JSON-String, der Standardskriptparameter überschreibt. Weitere Informationen zu Skriptparametern finden Sie unter /usr/share/models/official/vision/detection/main.py.

Die Ausgabe des Trainingsskripts sollte folgenden Text enthalten:

INFO:tensorflow:Loss for final step: 0.96952075.
I1125 21:47:10.729412 140023184553728 estimator.py:371] Loss for final step: 0.96952075.
INFO:tensorflow:training_loop marked as finished
I1125 21:47:10.730288 140023184553728 error_handling.py:101] training_loop marked as finished

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 retinanet-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 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.