Mask RCNN auf Cloud TPU trainieren (TF 2.x)

Überblick

In dieser Anleitung wird erläutert, wie Sie das Mask RCNN-Modell mit Cloud TPU mit dem COCO-Dataset ausführen.

Mask RCNN ist ein neuronales Deep-Learning-Netzwerk, das für die Objekterkennung und Bildsegmentierung entwickelt wurde, eine der komplexeren Herausforderungen beim maschinellen Sehen.

Das Mask RCNN-Modell generiert Begrenzungsrahmen und Segmentierungsmasken für jede Instanz eines Objekts im Bild. Das Modell beruht auf dem Feature Pyramid Network (FPN) und einem ResNet50-Backbone.

In dieser Anleitung wird das Modell mit Tensorflow Keras APIs trainiert. Die Keras API ist eine übergeordnete TensorFlow API und die empfohlene Methode zum Erstellen und Ausführen eines Modells für maschinelles Lernen auf Cloud TPU. Die API vereinfacht den Modellentwicklungsprozess. Sie blendet die meisten Implementierungen auf untergeordneter Ebene aus, wodurch leichter zwischen der TPU und anderen Plattformen wie GPUs oder CPUs gewechselt werden kann.

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

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.

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.

Ressourcen einrichten

Dieser Abschnitt enthält Informationen zur Einrichtung von Cloud Storage-, VM- und Cloud TPU-Ressourcen für diese Anleitung.

  1. Öffnen Sie ein Cloud Shell-Fenster.

    Cloud Shell öffnen

  2. Erstellen Sie eine Umgebungsvariable für die Projekt-ID.

    export PROJECT_ID=project-id
  3. Konfigurieren Sie das gcloud - Befehlszeilentool für die Verwendung des Projekts, in dem Sie die 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-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 ctpu up eine Compute Engine-VM.

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

  8. 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 mask-rcnn-tutorial --zone=europe-west4-a
    

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

Zusätzliche Pakete installieren

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

(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt

Daten vorbereiten

  1. Fügen Sie eine Umgebungsvariable für Ihren Storage-Bucket hinzu. Ersetzen Sie bucket-name durch Ihren Bucket-Namen.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  2. Fügen Sie eine Umgebungsvariable für das Datenverzeichnis hinzu.

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    
  3. Fügen Sie eine Umgebungsvariable für das Modellverzeichnis hinzu.

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn
    
  4. 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.

  5. Daten in den Cloud Storage-Bucket kopieren

    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 Annotationsdateien müssen ebenfalls kopiert werden. Diese Dateien helfen dabei, die Leistung des Modells zu validieren.

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

Cloud TPU einrichten und Training starten

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

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-8 \
      --zone=europe-west4-a \
      --name=mask-rcnn-tutorial \
      --tf-version=2.3.1
    Parameter Beschreibung
    tpu-size Gibt die Größe der Cloud TPU an. In dieser Anleitung wird eine TPU-Größe von v3-8 für das Training und die Bewertung mit einem einzelnen Gerät verwendet.
    zone Die Zone, in der Sie die Cloud TPU erstellen möchten. Das sollte dieselbe Zone sein, die Sie für die Compute Engine-VM verwendet haben. Beispiel: europe-west4-a.
    tf-version Die Version von Tensorflow, die von `ctpu` 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. Fügen Sie eine Umgebungsvariable für den Namen Ihrer Cloud TPU hinzu.

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
    

Training und Bewertung

Das folgende Skript führt ein Beispieltraining aus, das mit nur 10 Schritten trainiert wird und etwa 6 Minuten auf einer v3-8-TPU benötigt. Das Training zur Konvergenz dauert etwa 22.500 Schritte und ca. 6 Stunden auf einer v3-8-TPU.

  1. Fügen Sie einige erforderliche Umgebungsvariablen hinzu:

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    (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 den folgenden Befehl aus, um das Mask-RCNN-Modell zu trainieren:

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=train \
       --model=mask_rcnn \
       --params_override="{train: { total_steps: 10, 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
    tpu Gibt den Namen der Cloud TPU an. Dieser wird durch Angabe der Umgebungsvariable (TPU_NAME) 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_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.
    RESNET_CHECKPOINT Gibt einen vortrainierten Prüfpunkt an. Das Mask-RCNN-Modell erfordert ein vortrainiertes Bildklassifizierungsmodell wie ResNet als Backbonenetzwerk. In diesem Beispiel wird ein vortrainierter Prüfpunkt verwendet, der mit dem ResNet-Demonstrationsmodell erstellt wurde. Sie können stattdessen aber auch Ihr eigenes ResNet-Modell trainieren und einen Prüfpunkt aus Ihrem ResNet-Modellverzeichnis angeben.
  3. Führen Sie die Bewertung aus:

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=eval \
       --model=mask_rcnn \
       --params_override="{eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
    
    Parameter Beschreibung
    tpu Gibt den Namen der Cloud TPU an. Dieser wird durch Angabe der Umgebungsvariable (TPU_NAME) 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_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.

Von hier aus können Sie entweder diese Anleitung abschließen und Ihre GCP-Ressourcen bereinigen oder sich die Ausführung des Modells auf einem Cloud TPU Pod genauer ansehen.

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 Mask RCNN-Modell funktioniert mit den folgenden Pod-Slices:

  • v2-32
  • v3-32

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

Wenn Sie Ihre Compute Engine-Instanz bereits gelöscht haben, erstellen Sie gemäß den Schritten unter Ressourcen einrichten eine neue Instanz.

Das folgende Beispieltraining erfordert nur 20 Schritte und dauert etwa 10 Minuten auf einem v3-32-TPU-Knoten. Das Training zur Konvergenz erfordert etwa 11.250 Schritte und dauert etwa 2 Stunden auf einem v3-32-TPU-Pod.

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

    (vm)$ ctpu delete --tpu-only --zone=europe-west4-a --name=mask-rcnn-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 einen v3-32-Pod-Slice.

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-32  \
      --zone=europe-west4-a \
      --name=mask-rcnn-tutorial \
      --tf-version=2.3.1 
  3. Aktualisieren Sie die Umgebungsvariablen TPU_NAME und MODEL_DIR.

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pods
    
  4. Starten Sie das Trainingsskript.

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=train \
       --model=mask_rcnn \
       --params_override="{train: { batch_size: 128, iterations_per_loop: 500, total_steps: 20, learning_rate: {'learning_rate_levels': [0.008, 0.0008], 'learning_rate_steps': [10000, 13000] }, 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}} }"
    
    Parameter Beschreibung
    tpu Gibt den Namen der Cloud TPU an. Dieser wird durch Angabe der Umgebungsvariable (TPU_NAME) 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_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.
    RESNET_CHECKPOINT Gibt einen vortrainierten Prüfpunkt an. Das Mask-RCNN-Modell erfordert ein vortrainiertes Bildklassifizierungsmodell wie ResNet als Backbonenetzwerk. In diesem Beispiel wird ein vortrainierter Prüfpunkt verwendet, der mit dem ResNet-Demonstrationsmodell erstellt wurde. Sie können stattdessen aber auch Ihr eigenes ResNet-Modell trainieren und einen Prüfpunkt aus Ihrem ResNet-Modellverzeichnis angeben.

Modell bewerten

In diesem Schritt verwenden Sie einen einzelnen Cloud TPU-Knoten, um das oben trainierte Modell mit dem COCO-Dataset zu bewerten. Dies dauert etwa 20 Minuten.

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

    (vm)$ ctpu delete --tpu-only \
     --zone=europe-west4-a \
     --name=mask-rcnn-tutorial
  2. Starten Sie ein neues TPU-Gerät, um die Bewertung auszuführen.

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-8 \
      --zone=europe-west4-a \
      --tf-version=2.3.1 \
      --name=mask-rcnn-tutorial
    
  3. Aktualisieren Sie die Umgebungsvariable TPU_NAME.

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
    
  4. Starten Sie die Bewertung.

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=mask-rcnn-tutorial \
       --model_dir=${MODEL_DIR} \
       --mode=eval \
       --model=mask_rcnn \
       --params_override="{eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
    

Bereinigen

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

Bereinigen Sie die Compute Engine-VM-Instanz und die Cloud TPU-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. Führen Sie in Ihrer VM oder Cloud Shell ctpu delete mit den Flags --name und --zone aus, die Sie beim Einrichten der Cloud TPU zum Löschen der Cloud TPU verwendet haben:

    $ ctpu delete --name=mask-rcnn-tutorial \
      --zone=europe-west4-a
    
  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 --name=mask-rcnn-tutorial --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 Mask-RCNN-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.