Dies ist Ichi Lab von RHEMS Giken. (* Bitte beachten Sie, dass TPU im Titel eine Abkürzung für Tensor Processing Unit ist und nicht thermoplastisches Polyurethan bedeutet.)
Der vorherige Artikel ist hier. [Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Die Objekterkennungs-API von TensorFlow (im Folgenden als API bezeichnet) ist sehr praktisch zum Erstellen von KI für die Objekterkennung. Andererseits denke ich, dass es viele Menschen gibt, die die folgenden Probleme haben.
Dieses Mal möchte ich diese Gelegenheit nutzen, um ein Memorandum darüber zu hinterlassen, wie ich Cloud TPU so weit nutzen konnte, dass ich es mir leisten konnte, auch auf individueller Ebene zu zahlen. Wenn Sie die API mit der in diesem Artikel beschriebenen Methode verwenden, können Sie die Cloud-TPU von GCP wesentlich billiger gestalten als von Anfang bis Ende.
Wir hoffen, dass es allen helfen wird.
Aus der Schlussfolgerung denke ich, dass das Folgende der beste Weg ist, die API mit TPU zum niedrigstmöglichen Preis zu verwenden.
Google Colaboratory wurde bereits in anderen Artikeln eingeführt, daher werde ich die Details weglassen, aber
Auf Kosten einer kostenlosen und leistungsstarken Umgebung können Sie Ihre GPU oder TPU möglicherweise eine Weile nicht verwenden, wenn Sie sie überbeanspruchen.
In einem solchen Fall kostet es Sie Geld, wenn Sie eine ähnliche Umgebung selbst vorbereiten können, aber Sie können die Zeit sparen, um zu warten, bis Sie sie wieder verwenden können.
Es gibt auch einen netten Dienst namens Google Colaboratory Pro für 9,99 USD pro Monat, der zum Zeitpunkt des Schreibens dieses Artikels (2020/06) jedoch nur in den USA verfügbar ist. Ich werde. (Es gibt einen anderen Artikel, den ich sogar aus Japan registrieren konnte, aber es besteht die Möglichkeit, dass die Regeln verletzt werden, also auf eigenes Risiko und ich habe es nicht versucht)
Die Erklärung hier basiert auf den folgenden Bedingungen.
Die hier vorgestellte Methode verwendet immer den Dienst von GCP. Bei beiden Methoden wird Ihnen definitiv die Nutzungsgebühr von Cloud Storage berechnet. Zum ersten Mal hat GCP 300 US-Dollar kostenlose Stufe, In der kostenlosen Stufe ist die TPU-Nutzungsgebühr nicht enthalten, und es gibt einige Einschränkungen für die kostenlose Stufe des Cloud-Speichers. Überprüfen Sie daher den Inhalt selbst, bevor Sie fortfahren. (Cloud ML hat eine kostenlose Stufe, aber ich habe es nicht ausprobiert)
Um mit TPU trainieren zu können, muss es in Cloud Storage gespeichert sein.
Hier nehmen wir an, dass die Namen wie folgt sind.
Projekt-ID:
gcp-project-123
Eimername: my-Bucket-123
Vergessen Sie nicht die Option -m, wenn Sie schnell von Ihrem lokalen PC in Ihren Bucket kopieren möchten!
Befehlsbeispiel zum Senden des Ordners des aktuellen Verzeichnisses an den Bucket mit zsh von Mac
gsutil -m cp -r \* gs://my-bucket-123/
Die Ordnerstruktur im Bucket ist wie folgt. (* Die folgende Erklärung wird unter der Voraussetzung dieser Konfiguration fortgesetzt.)
gs://my-bucket-123/
├── models
│ ├── ssd_mobilenet_v1_fpn (Modelldaten der Transfer-Lernquelle)
│ └── .ckpt und viele mehr
├── data
│ ├── save (Trainingsdatenspeicherverzeichnis)
│ ├── train (Zur Speicherung von Lehrerdaten~ tfrecord)
│ └── val (Zur Datenspeicherung zur Überprüfung~ tfrecord)
├── hoge.config (Daten konfigurieren)
└── tf_label_map.pbtxt (Daten beschriften)
Dieses Mal habe ich ssd_mobilenet_v1_fpn_coco verwendet. Darüber hinaus befindet sich auf der Seite von Tensorflow Detection Model Zoo auf dem trainierten Modell ein ☆-Zeichen, das TPU unterstützt. Es läuft.
Informationen zum Inhalt der Konfiguration finden Sie unter [oben](https://qiita.com/IchiLab/items/fd99bcd92670607f8f9b#%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3 % 82% B0% E3% 83% 95% E3% 82% A1% E3% 82% A4% E3% 83% AB% E3% 81% AE% E7% B7% A8% E9% 9B% 86) Ich werde es weglassen, weil ich es getan habe, Nachdem sich die oben genannten Dateien im Cloud-Speicher befinden, müssen die folgenden Elemente entsprechend abgeglichen werden.
fine_tune_checkpoint: "gs://my-bucket-123/models/ssd_mobilenet_v1_fpn/model.ckpt"
label_map_path: "gs://my-bucket-123/tf_label_map.pbtxt"
input_path: "gs://my-bucket-123/data/train/{filename}.tfrecord
input_path: "gs://my-bucket-123/data/val/{filename}.tfrecord
(* Das Schreiben des Teils {Dateiname} ist [oben](https://qiita.com/IchiLab/items/fd99bcd92670607f8f9b#%E3%82%B3%E3%83%B3%E3%83%95%E3% 82% A3% E3% 82% B0% E3% 83% 95% E3% 82% A1% E3% 82% A4% E3% 83% AB% E3% 81% AE% E7% B7% A8% E9% 9B% 86))
Wenn Sie es mit der kostenlosen Stufe tun können, lassen Sie es uns hier tun. Wie bereits erwähnt, fallen jedoch Cloud-Speichergebühren an.
Es kann lokal oder Container sein. Wenn Sie also "git clone" haben, speichern Sie es in Ihrem Google-Laufwerk.
Übrigens, als ich es mit dem neuesten Meister gemacht habe, gab es viele Probleme, wie zum Beispiel, dass ich nicht in der Lage war, verschiedene Dinge zu tun, die gut funktionierten Die folgenden Zweige werden mir empfohlen.
git clone -b tf_2_1_reference https://github.com/tensorflow/models.git
Vergessen Sie nicht die Coco API.
git clone --depth 1 https://github.com/cocodataset/cocoapi.git
Hierbei wird davon ausgegangen, dass der Quellcode im folgenden Verzeichnis abgelegt ist.
/content/drive/My Drive/models/research
/content/drive/My Drive/cocoapi/PythonAPI
Im Browser von Google Drive Wählen Sie Neu> Andere> Google Colaboratory.
Ändern Sie den Titel von "Untitled0.ipynb" in einen beliebigen Namen. (Empfehlung)
Wählen Sie im obigen Menü Laufzeit-> Laufzeittyp ändern-> Hardwarebeschleuniger als "TPU" und "Speichern" angeben. Wählen Sie dann Verbinden.
Wenn Sie die API-Quelle nicht lesen können, wird sie zunächst nicht gestartet. Hängen Sie sie daher ein.
from google.colab import drive
drive.mount('/content/drive')
Richten Sie das Projekt mit dem Befehl gcloud für die Arbeit mit Cloud Storage ein.
from google.colab import auth
auth.authenticate_user()
project_id = 'gcp-project-123'
!gcloud config set project {project_id}
!gsutil ls my-bucket-123
Es ist dieselbe Authentifizierung wie bei Google Drive.
Bei Erfolg können Sie den Inhalt des Buckets mit dem Befehl ls
überprüfen.
%cd /content/drive/My\ Drive/cocoapi/PythonAPI
!make
!cp -r pycocotools /content/drive/My\ Drive/models/research/
Konvertieren Sie .proto in .py.
%cd /content/drive/My\ Drive/models/research
!protoc object_detection/protos/*.proto --python_out=.
Die Tensorflow-Objekterkennungs-API unterstützt Tensorflow 2.X nicht. Auf der anderen Seite hat Google Colaboratory von Anfang an die 2.X-Serie installiert. Daher müssen Sie die Version überprüfen und neu installieren.
!pip list | grep tensor
!pip install tensorflow==1.15.0rc3
%env PYTHONPATH=/env/python:/content/drive/My Drive/models/research:/content/drive/My Drive/models/research/slim
Testen wir, ob die Umgebung erfolgreich erstellt wurde. Wenn alles gut geht, sehen Sie "OK" über mehrere Zeilen. Übrigens verwendet dieser Artikel die Quelle eines etwas älteren Zweigs, wurde aber kürzlich in "model_builder_tf1_test.py" umbenannt.
%cd /content/drive/My Drive/models/research
!python object_detection/builders/model_builder_test.py
Wenn Sie das Verzeichnis angeben, in dem die Trainingsdaten gespeichert und wie unten gezeigt gestartet werden sollen, können Sie die Verlustbewegung und die Anzahl der Lernschritte pro Sekunde überprüfen.
%load_ext tensorboard
%tensorboard --logdir gs://my-bucket-123/data/save
Verwenden Sie zum Training model_tpu_main.py
anstelle von model_main.py
.
Sie können die GCP-Projekt-ID und den TPU-Namen als Optionen angeben, dies war jedoch in der Umgebung von Google Colaboratory nicht erforderlich.
Wahrscheinlich, weil die TPU-Adresse ursprünglich in der Umgebungsvariablen registriert ist (Vermutung).
(Wenn Sie mit "% env" prüfen, wird die Adresse der TPU nach "grpc: //" mit dem Namen "TPU_NAME" registriert.)
%cd /content/drive/My Drive/models/research
pipeline = 'gs://my-bucket-123/hoge.config'
save = 'gs://my-bucket-123/data/save'
train_step = 1000
mode = 'train'
batch_size = 64
!python object_detection/model_tpu_main.py \
--pipeline_config_path={pipeline} \
--mode={mode} \
--num_train_steps={train_step} \
--eval_training_data=True \
--train_batch_size={batch_size} \
--model_dir={save} \
--alsologtostderra
Google Colaboratory hat ein Nutzungslimit von weniger als 12 Stunden. Ich schreibe nicht irgendwo darüber, wie viele Stunden ich tatsächlich nutzen kann. Sie können dies herausfinden, indem Sie den folgenden Code ausführen.
import time, psutil
Start = time.time()- psutil.boot_time()
Left= 12*3600 - Start
print('remaining time: ', Left/3600)
Sobald Sie mit dem Lernen beginnen, warten andere Ausführungen, bis sie abgeschlossen sind Lassen Sie uns dies tun, wenn etwas getan wurde.
Übrigens, wenn Google Colaboratory sagt "Ich kann es eine Weile nicht verwenden, bitte warten" und Sie nicht warten können, versuchen Sie diese Methode.
Zunächst müssen Compute Engine und Cloud TPU aktiviert sein.
Das erste Mal wird es wie folgt angezeigt (Bild zum Zeitpunkt des Schreibens)
Für Compute Engine
"Navigationsmenü" -> "Compute Engine" -> "VM und Instanz" oben links
Die Vorbereitung beginnt automatisch.
Für Cloud TPU
"Navigationsmenü" -> "Compute Engine" -> "TPU" oben links
Beim ersten Mal müssen Sie "API aktivieren" auswählen. (Bitte seien Sie versichert, dass die TPU-Abrechnung nicht allein damit beginnt.)
Wenn Sie diese bereit oder bereits aktiviert haben, öffnen Sie die Cloud-Shell. Cloud Shell hat ein Symbol wie das unten in der oberen rechten Ecke. Nachdem Sie eine Weile gewartet und geöffnet haben, starten Sie die VM und die TPU gleichzeitig mit dem Befehl "ctpu".
ctpu up --zone=us-central1-b --tf-version=1.15 --machine-type=n1-standard-4 --name=mytpu --preemptible --preemptible-vm
Der wichtige Punkt hierbei ist, "preemptible" in die VM- und TPU-Optionen zu setzen. Das ist präventiv zu verwenden.
Die folgende Tabelle zeigt die vom offiziellen Preistool berechneten Ergebnisse, wenn sich der Standort von TPU V2 in den USA befindet1.
TPU Class | Regular | Preemptible |
---|---|---|
Pro Stunde | Über 485 Yen | Über 146 Yen |
Informationen zur Vorabentscheidung finden Sie im offiziellen Dokument.
Der gleiche Vorgang kann über die Konsole oder den Befehl gcloud ausgeführt werden. Details finden Sie im offiziellen Dokument Erstellen und Löschen von TPUs.
Wenn Sie den Befehl ausführen, wird eine Bestätigung wie unten gezeigt angezeigt.
Name: mytpu
Zone: us-central1-b
GCP Project: gcp-project-123
TensorFlow Version: 1.15
VM:
Machine Type: n1-standard-4
Disk Size: 250 GB
Preemptible: true
Cloud TPU:
Size: v2-8
Preemptible: true
Reserved: false
OK to create your Cloud TPU resources with the above configuration? [Yn]:
Geben Sie "y" ein und drücken Sie "Enter / Return", um jede Erstellung zu starten. Der Grund, warum ich für den Maschinentyp "n1-standard-4" gewählt habe, liegt darin, dass es sich in der Nähe des Speichers der Google Colaboratory-Umgebung befindet. Ändern Sie es daher bei Bedarf.
Übrigens, wenn Sie versehentlich das Standarddienstkonto von Compute Engine löschen, können Sie es nicht mit dem obigen Befehl ctpu erstellen.
2020/06/20 00:00:00 Creating Compute Engine VM mytpu (this may take a minute)...
2020/06/20 00:00:07 TPU operation still running...
2020/06/20 00:00:07 error retrieving Compute Engine zone operation:
(Für einen Fehler wie diesen ... Wann haben Sie ihn gelöscht?) Ich kannte die Lösung nicht und habe ein neues Projekt neu erstellt.
"... Lass uns in der Zeit zurückgehen."
Cloud TPU wird in Sekunden aufgeladen. Wenn Sie bestätigen können, dass es sicher gestartet wurde, lassen Sie es uns vorerst stoppen.
Wenn die Instanz erfolgreich gestartet wurde, geben Sie sie über "SSH" ein.
Nach Abschluss der Verbindung wurde der Konsolenbildschirm wie unten gezeigt geöffnet.
Von hier aus werden wir daran arbeiten.
Sie können den TPU-Status auch hier mit dem Befehl "gcloud" überprüfen.
gcloud config set compute/zone us-central1-b
Updated property [compute/zone].
gcloud compute tpus list
NAME ZONE ACCELERATOR_TYPE NETWORK_ENDPOINTS NETWORK RANGE STATUS
mytpu us-central1-b v2-8 10.240.1.2:8470 default 10.240.1.0/29 STOPPING
Nebenbei wird der Status der TPU wie folgt angezeigt.
Herstellung | Während des Startvorgangs | Anlaufen | Anhalten | Halt |
---|---|---|---|---|
CREATING | STARTING | READY | STOPPING | STOPPED |
Ich habe dieses Element hinzugefügt, weil ich klar vereinheitlichen möchte, ob es sich um Python oder Python3 handelt. Da Python immer 3.X verwenden möchte, ändern Sie die Einstellungen wie folgt.
Open .bashrc
vi ~/.bashrc
Einstellungen zur letzten Zeile hinzufügen
I
und drücken Sie Shift + G
, um nach unten zu gelangen, geben Sie Folgendes ein und drücken Sie esc
, um mit zu überschreiben: wq
!alias python="python3"
alias pip='pip3'
Einstellungen widerspiegeln
source ~/.bashrc
Jetzt ist "Python" jetzt "Python3".
Von hier aus wird es fast so sein wie beim Erstellen der API-Umgebung, aber ich werde es beschreiben, ohne es wegzulassen.
sudo apt-get update
sudo apt-get install -y protobuf-compiler python-pil python-lxml python-tk
pip install -U pip && pip install Cython contextlib2 jupyter matplotlib tf_slim pillow
Bringen Sie als Nächstes den API-Quellcode und cocoAPI mit.
git clone -b tf_2_1_reference https://github.com/tensorflow/models.git
git clone --depth 1 https://github.com/cocodataset/cocoapi.git
Der Quellcode für die in diesem Artikel verwendete API ist wiederum der obige Zweig.
Installieren Sie dann die Coco-API.
Ich habe mit "make" wie folgt versagt.
x86_64-linux-gnu-gcc: error: pycocotools/_mask.c: No such file or directory
Um dies zu vermeiden, ändern Sie das Makefile ein wenig.
cd cocoapi/PythonAPI
vi Makefile
Ändern Sie nach dem Öffnen des Makefiles den Python-Teil in Python3 (es gibt zwei Stellen).
make
cp -r pycocotools /home/ichilab/models/research && cd ../../ && rm -rf cocoapi
Konvertieren Sie .proto in .py.
cd models/research
protoc object_detection/protos/*.proto --python_out=.
Nachdem ich den SSH-Bildschirm geschlossen hatte, musste ich diesen Teil erneut ausführen.
(pwd = models/research)
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
source ~/.bashrc
Testen wir, ob die Umgebung erfolgreich erstellt wurde. Bei Erfolg wird "OK" über mehrere Zeilen angezeigt.
python object_detection/builders/model_builder_test.py
Es kann gut sein, sicherzustellen, dass Sie den Inhalt des Eimers sehen können.
gsutil ls gs://my-bucket-123
Sie können nicht lernen, wenn es gestoppt ist, also fangen wir hier noch einmal an. Wenn Sie den Start bestätigen können, ist es der nächste.
Das Lernen hat begonnen.
python object_detection/model_tpu_main.py \
--tpu_name=mytpu \
--model_dir=gs://my-bucket-123/data/save \
--mode=train \
--pipeline_config_path=gs://my-bucket-123/hoge.config \
--alsologtostderra
Schreiben Sie eine kurze Beschreibung der Option.
--gcp_project
: Die Projekt-ID. Es war optional.--tpu_name
: Wird beim Start mit dem Befehl ctpu benannt.--tpu_zone
: Die Zeitzone der TPU. Es war optional.--model_dir
: Geben Sie das Speicherziel der trainierten ckpt-Dateien an.--pipeline_config_path
: Gibt den Speicherort für die Konfigurationsdatei an.Übrigens, wenn ich hier die neueste Quelle verwende
tensorflow.python.framework.errors_impl.InvalidArgumentError: From /job:tpu_worker/replica:0/task:0:
Der Fehler hat mich ziemlich geärgert. Dies ist der einzige Grund, warum ich den zuvor erwähnten Zweigquellcode verwende. Die Ursache ist bisher unbekannt, da sich die Konfiguration und andere Dateien unter genau den gleichen Bedingungen befanden.
Wenn Sie fertig sind, geben Sie dem Stoppen / Löschen der TPU Priorität.
Nachdem Sie die Erklärung zum Aufbau der Umgebung abgeschlossen haben, fragen Sie sich, wie viel es kosten wird.
Es tut mir leid, dass ich keinen richtigen Vergleich veröffentlichen kann. Wenn Sie mit Google Colaboratory 100.000 Schritte trainieren, kostet dies weniger als 400 Yen. Als ich VM und TPU in meinem Projekt gestartet und verwendet habe, habe ich nie 100.000 Schritte ausgeführt, aber In Anbetracht der oben genannten Gebühren als Richtwert betrug die TPU 4 Yen für etwa 6 Stunden Nutzung durch Compute Engine und 1 Yen für die externe IP-Nutzungsgebühr, die insgesamt weniger als 10 Yen betrug.
In diesem Bereich ist die Verwendung des offiziellen Preistools der richtigen Antwort näher als mein Artikel.
Was haben Sie gedacht?
Überraschenderweise kann ich keinen zusammenfassenden Artikel über die Umgebungskonstruktion der "Cloud TPU × Tensorflow Object Detection API" finden. Ich hoffe, dass mehr Menschen diese Gelegenheit nutzen werden, um mit TPU und denjenigen, die an GCP interessiert sind, zu lernen. ..
Wir hoffen aufrichtig, dass Ihre Forschung zur Objekterkennungs-KI beschleunigt wird, wenn die Lerngeschwindigkeit beschleunigt wird.
Recommended Posts