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.
Öffnen Sie ein Cloud Shell-Fenster.
Erstellen Sie eine Variable für Ihre Projekt-ID.
export PROJECT_ID=project-id
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 aufAuthorize
unten auf der Seite, um esgcloud
zu erlauben, GCP API-Aufrufe mit Ihren Anmeldedaten durchzuführen.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
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.
Starten Sie mit dem Befehl
ctpu up
eine Compute Engine-VM.$ ctpu up --project=${PROJECT_ID} \ --zone=europe-west4-a \ --vm-only \ --disk-size-gb=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.5 \ --name=retinanet-tutorial
Beschreibung der Befehls-Flags
project
- Die ID Ihres GCP-Projekts
zone
- Die Zone, in der Sie die Cloud TPU erstellen möchten.
vm-only
- Erstellt die VM ohne Cloud TPU. Standardmäßig werden mit dem Befehl
ctpu up
eine VM und eine Cloud TPU erstellt. 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. name
- Der Name der zu erstellenden Cloud TPU.
Die von Ihnen angegebene Konfiguration wird angezeigt. Geben Sie y zum Bestätigen oder n zum Abbrechen ein.
Wenn der Befehl
ctpu up
ausgeführt wurde, sollten Sie prüfen, ob die Shell-Eingabeaufforderung vonusername@projectname
inusername@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.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
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
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.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
Führen Sie den folgenden Befehl aus, um die Cloud TPU zu erstellen.
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.5 \ --name=retinanet-tutorial
Beschreibung der Befehls-Flags
project
- Die ID Ihres GCP-Projekts
tpu-only
- Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl
ctpu up
eine VM und eine Cloud TPU erstellt. tf-version
- Die Version von Tensorflow, die von
ctpu
auf der VM installiert wird. name
- Der Name der zu erstellenden Cloud TPU.
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.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
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
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
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_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.--mode
Gibt den Modus an, in dem das Modell ausgeführt werden soll. Gültige Werte sind train
undeval
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.
Richten Sie die folgenden Umgebungsvariablen ein:
(vm)$ export EVAL_SAMPLES=5000
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_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.--mode
Gibt den Modus an, in dem das Modell ausgeführt werden soll. Gültige Werte sind train
undeval
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
Löschen Sie die Cloud TPU-Ressource, die Sie zum Trainieren des Modells auf einem einzelnen Gerät erstellt haben.
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --zone=europe-west4-a \ --name=retinanet-tutorial
Führen Sie den Befehl
ctpu up
mit dem Parametertpu-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 --project=${PROJECT_ID} \ --tpu-only \ --tpu-size=v3-32 \ --zone=europe-west4-a \ --tf-version=1.15.5 \ --name=retinanet-tutorial-pod
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.Richten Sie die folgenden Umgebungsvariablen ein:
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-pod (vm)$ export TPU_NAME=retinanet-tutorial-pod
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_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.--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
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.
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.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 --project=${PROJECT_ID} \ --zone=europe-west4-a \ --name=retinanet-tutorial
Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Compute Engine-VM und die Cloud TPU heruntergefahren wurden:
$ ctpu status --project=${PROJECT_ID} \ --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: --
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.