[PYTHON] Verwenden Sie TPU und Keras mit Google Colaboratory

Was ist das?

Dieser Artikel verwendet TPU in Google Colaboratory. Im Gegensatz zu der GPU, die nur durch Umschalten der Laufzeit funktioniert, gab es einige Punkte, die dem Code hinzugefügt werden mussten, daher werde ich ihn als Memorandum schreiben.

Umgebung

Google Colaboratory Tensorflow 1.15.0 ist installiert.

TPUtest.py


import tensorflow as tf
import distuitls

print(distutils.version.LooseVersion(tf.__version__))
#>>1.15.0

Verifizierungs-Schlüssel

Klassifizieren Sie mnist mit CNN. Laut Google ist TPU nicht für CNN optimiert, daher kann es ein geringfügiger Nachteil für TPU sein. Ich möchte die Leistung jedoch nicht streng bewerten, daher ist es in Ordnung.

Datenaufbereitung und -verarbeitung

TPUtest.py


from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import numpy as np

#Daten herunterladen
(X_train, y_train), (X_test, y_test) = mnist.load_data()

#Teilen Sie durch 255
X_train = X_train/255
X_test = X_test/255

#Ändern Sie die Form der Bilddaten
X_train = X_train.reshape(-1,28,28,1).astype(np.float32)
X_test = X_test.reshape(-1,28,28,1).astype(np.float32)

#Richtiges Antwortetikett eins-In heiß umwandeln
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

Modell erstellen und kompilieren

TPUtest.py


from tensorflow.keras.layers import Conv2D, Dense, ReLU, Flatten, Input, MaxPool2D, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import plot_model

def getModel():
  model = Sequential()
  model.add(Conv2D(3,3,input_shape=(28,28,1)))
  model.add(MaxPool2D(2))
  model.add(ReLU())
  model.add(Dropout(0.2))
  model.add(Flatten())
  model.add(Dense(1024))
  model.add(ReLU())
  model.add(Dense(10, activation="softmax"))
  return model

model = getModel()

#Zeichnung
plot_model(model, show_shapes=True, show_layer_names=False)

#kompilieren
model.compile(Adam(), loss="categorical_crossentropy", metrics=["acc"])

model.png

Es ist ein sehr gewöhnliches Modell.

Ausbildung

TPUtest.py


%%time
model.fit(X_train, y_train, epochs=10, validation_data=(X_test,y_test))

Prognose

TPUtest.py


%%time
y_pred = model.predict(X_test)

Anzeige der Vorhersageergebnisse

TPUtest.py


from sklearn.metrics import accuracy_score
import numpy as np

#one-Machen Sie den heißen Vektor rückgängig
y_pred = np.argmax(y_pred, axis=1)
y_test = np.argmax(y_test, axis=1)
print(accuracy_score(y_pred, y_test))
#>>0.9854

Führen Sie diesen Code in drei verschiedenen Laufzeiten aus und vergleichen Sie ihn.

Ausführungsergebnis

Das Ausführungsergebnis ist wie folgt.

Laufzeit Trainings zeit Geschätzte Zeit Voraussichtliche Punktzahl
CPU 37s/epoch 1.49s 0.9854
GPU 13s/epoch 0.54s 0.9859
TPU 37s/epoch 2.76s 0.9863

... TPU nicht funktioniert?

Lass TPU funktionieren

Überprüfen Sie zuerst das Gerät

TPUtest.py


import os
import tensorflow as tf
import pprint

if 'COLAB_TPU_ADDR' not in os.environ:
  print('ERROR: Not connected to a TPU runtime; please see the first cell in this notebook for instructions!')
else:
  tpu_address = 'grpc://' + os.environ['COLAB_TPU_ADDR']
  print ('TPU address is', tpu_address)

  with tf.Session(tpu_address) as session:
    devices = session.list_devices()
    
  print('TPU devices:')
  pprint.pprint(devices)

Es ist in Ordnung, wenn es in einer Reihe angezeigt wird.

Für TPU kompilieren

Beim Erstellen und Kompilieren des Modells ist ein wenig Einfallsreichtum erforderlich.

TPUtest.py


def getModel():
  #Bis zu diesem Punkt ist es dasselbe wie die GPU, daher wird es weggelassen.
  return model

#Verschiedene TPU-Setups
resolver = tf.contrib.cluster_resolver.TPUClusterResolver('grpc://' + os.environ['COLAB_TPU_ADDR'])
tf.contrib.distribute.initialize_tpu_system(resolver)
strategy = tf.contrib.distribute.TPUStrategy(resolver)


with strategy.scope():#Ich muss das hinzufügen
  model = getModel()
  model.compile(Adam(), loss="categorical_crossentropy", metrics=["acc"])

#Dann normal passen
model.fit(X_train, y_train, epochs=10, validation_data=(X_test,y_test))

Das Lernen verläuft deutlich komfortabler als mit der CPU. Versuchen wir die Vorhersage so wie sie ist.

TPUtest.py


y_pred = model.predict(X_test)

e? Es funktioniert, aber es ist nicht zu langsam ...? Ist die Vorhersage nicht vorbei? Das Ausführungsergebnis ist wie folgt.

Laufzeit Trainings zeit Geschätzte Zeit Voraussichtliche Punktzahl
CPU(Erneut veröffentlichen) 37s/epoch 1.49s 0.9854
GPU(Erneut veröffentlichen) 13s/epoch 0.54s 0.9859
TPU 17.7s/epoch 15min 15s 0.9853

Machen Sie Vorhersagen mit einer anständigen Geschwindigkeit

Ich fand es lächerlich, mit TPU Vorhersagen zu treffen. Die Validierung erfolgt (noch) mit angemessener Geschwindigkeit. Warum ...?

Da dies unvermeidlich ist, erfolgt das Lernen durch die TPU und die Vorhersage durch die CPU.

TPUtest.py


#Lernen mit TPU
model.fit(X_train, y_train, epochs=10, validation_data=(X_test,y_test))
model.save_weights("./weight.h5")#Gewichte in Datei speichern

#Vorhersage durch die CPU
cpu_model = getModel()#Erstellen Sie ein Modell mit CPU
cpu_model.load_weights("./weight.h5")#Laden Sie das eingesparte Gewicht
y_pred = cpu_model.predict(X_test)# cpu_Mit Modell vorhersagen

Die endgültige Leistung ist wie folgt.

Laufzeit Trainings zeit Geschätzte Zeit Voraussichtliche Punktzahl
CPU 37s/epoch 1.49s 0.9854
GPU 13s/epoch 0.54s 0.9859
TPU 17.7s/epoch 1.22s(CPU verwenden) 0.9853

Um ehrlich zu sein, denke ich, dass die GPU einfacher ist, aber wie ich bereits erwähnt habe, scheint CNN ein schwaches Feld der TPU zu sein. Beispielsweise hat LSTM mehr als die doppelte Lerngeschwindigkeit der GPU, sodass es je nach Situation möglich sein kann, sie richtig zu verwenden. .. Sie können einfach zwei Laufzeiten gleichzeitig ausführen.

Ich war süchtig nach

Ich bin vernünftigerweise auf einen Fehler gestoßen ...

InvalidArgumentError Teil 1

Fehlermeldung

InvalidArgumentError: Cannot assign a device for operation conv2d_1/kernel/IsInitialized/VarIsInitializedOp: node conv2d_1/kernel/IsInitialized/VarIsInitializedOp (defined at /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py:1748)  was explicitly assigned to /job:worker/replica:0/task:0/device:TPU:0 but available devices are [ /job:localhost/replica:0/task:0/device:CPU:0, /job:localhost/replica:0/task:0/device:XLA_CPU:0 ]. Make sure the device specification refers to a valid device.
	 [[conv2d_1/kernel/IsInitialized/VarIsInitializedOp]]

Beim Erstellen eines Modells mit Keras ist ein Fehler aufgetreten. Es funktionierte mit tensorflow.keras anstelle von keras. Es ist eine Falle, nicht wahr?

InvalidArgumentError Teil 2

Fehlermeldung

InvalidArgumentError: Unsupported data type for TPU: double, caused by output IteratorGetNext:0

Es scheint, dass TPU Double Type nicht unterstützt. Konvertieren Sie es daher vor dem Training in np.float32.

InvalidArgumentError Teil 3

Fehlermeldung

InvalidArgumentError: No OpKernel was registered to support Op 'TPUReplicatedInput' used by node input0_1 (defined at /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py:1748) with these attrs: [T=DT_INT32, N=8]
Registered devices: [CPU, XLA_CPU]
Registered kernels:
  <no registered kernels>

	 [[input0_1]]

Ein Fehler, der nur einmal zufällig passiert ist. Ich habe es vorerst neu gestartet und es hat funktioniert. Ich möchte die Reproduzierbarkeit nicht überprüfen, also mache ich es nicht.

InvalidArgumentError Teil 4

Fehlermeldung

InvalidArgumentError: Cannot assign a device for operation lstm_1/random_uniform/RandomUniform: node lstm_1/random_uniform/RandomUniform (defined at /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py:1748)  was explicitly assigned to /job:worker/replica:0/task:0/device:TPU:0 but available devices are [ /job:localhost/replica:0/task:0/device:CPU:0, /job:localhost/replica:0/task:0/device:XLA_CPU:0 ]. Make sure the device specification refers to a valid device.
	 [[lstm_1/random_uniform/RandomUniform]]

Ich kann nicht auf die TPU zugreifen ...? Vorerst neu starten.

InternalError Fehlermeldung

InternalError: Failed to serialize message

Es trat auf, als ich LSTM eine große Datenmenge lesen ließ. Es hat funktioniert, als ich den Betrag reduziert habe. Ist es ein Speicherfehler? (Es ist ein Rätsel, denn wenn Sie die gleiche Datenmenge an die GPU-Laufzeit übergeben, funktioniert dies. Selbst mit der GPU ist die Verarbeitungszeit zu lang und endet nicht in 12 Stunden. Sie war also bedeutungslos.)

KeyError Fehlermeldung

KeyError: 'COLAB_TPU_ADDR'

Tritt auf, wenn die Laufzeit nicht TPU ist. Bitte wechseln Sie zu TPU und führen Sie aus.

Verweise

https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/fashion_mnist.ipynb#scrollTo=2a5cGsSTEBQD

Recommended Posts

Verwenden Sie TPU und Keras mit Google Colaboratory
Führen Sie Keras auf Google Colaboratory TPU aus
Verwenden Sie music21 in Google Colaboratory
Lernen Sie Python mit Google Colaboratory
Probieren Sie OpenCV mit Google Colaboratory aus
Erstellen einer Umgebung für die Verwendung von CaboCha mit Google Colaboratory
So verwenden Sie Google Colaboratory
Verwenden Sie "% tensorflow_version 2.x", wenn Sie TPU mit Tensorflow 2.1.0 in Colaboratory verwenden
Reinforcement Learning 23 Erstellen und verwenden Sie Ihr eigenes Modul mit Colaboratory
■ [Google Colaboratory] Morphologische Analyse verwenden (janome)
Vergleichen Sie DCGAN und pix2pix mit Keras
OpenCV-Funktionserkennung mit Google Colaboratory
Google-Labor
Verwendung von Google Colaboratory und Verwendungsbeispiel (PyTorch × DCGAN)
Die stärkste Möglichkeit, MeCab und CaboCha mit Google Colab zu verwenden
Verwenden Sie den Metabolic Disassembler in Google Colaboratory
Verwenden Sie Jupyter Lab und Jupyter Notebook mit EC2
Vergleichen Sie rohen TensorFlow mit tf.contrib.learn und Keras
Führen Sie die Google-Übersetzung und die DeepL-Übersetzung mit der GUI aus
Verwenden Sie PIL oder Pillow mit Cygwin Python
So suchen Sie in Google Colaboratory nach Google Drive
Verwenden Sie Cartopy mit Google Colaboratory, ohne an Fehlern zu leiden
Klassifizierte ImageNet Hamburger und Fahrräder von Keras
Einfach! Verwenden Sie gensim und word2vec mit MAMP.
Verwenden Sie Python und MeCab mit Azure-Funktionen
Lernen Sie mit Shogi AI Deep Learning auf Mac und Google Colab Verwenden Sie Google Colab
Verwenden Sie dein.vim und ckw-mod mit Windows7 32bit PowerShell
Versuchen Sie, Google Chrome mit Python und Selenium auszuführen
Zeigen Sie die Google Maps-API mit Rails und Pin-Anzeige an
Verwendung von OAuth und API für Dienstkonten mit Google API Client für Python
Verwenden Sie Python und word2vec (gelernt) mit Azure Databricks
"Learning word2vec" und "Visualisierung mit Tensorboard" auf Colaboratory
Cheet Sheet beim Schaben mit Google Colaboratory (Colab)
Deep Learning Bildanalyse beginnend mit Kaggle und Keras
Verwenden Sie das Cognitive Took Kit (CNTK) mit dem Keras-Backend
So laden Sie Dateien in Google Drive mit Google Colaboratory
End-to-End-Trennung von Einkanal-Tonquellen mit Google Colaboratory
Einfache Buchregistrierung mit Google Books API und Rails
Nutzung von Google Cloud Storage (GCS) durch "GAE / Py"
Analysieren mit Google Colaboratory mithilfe der Kaggle-API
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Lernen Sie Wasserstein GAN mit Keras-Modell und TensorFlow-Optimierung
Lernen Sie mit "Google Colaboratory" ganz einfach 100 Sprachverarbeitungsklopfen 2020.
Verwendung des japanischen Spacy-Modells mit Google Colaboratory
Ich kann den Darknet-Befehl in Google Colaboratory nicht verwenden!
Installieren Sie tweepy mit pip und verwenden Sie es für API 1.1
Authentifizieren Sie Google mit Django
Verwenden Sie RTX 3090 mit PyTorch
Verwenden Sie ansible mit cygwin
Verwenden Sie pipdeptree mit virtualenv
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Mock mit Pytest
Bilderkennung mit Keras
Verwenden Sie Gentelella mit Django
Optuna, Keras und Titanic
Verwenden Sie Tensorboard mit Chainer
Verwenden Sie DynamoDB mit Python