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.
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
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.
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)
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"])
Es ist ein sehr gewöhnliches Modell.
TPUtest.py
%%time
model.fit(X_train, y_train, epochs=10, validation_data=(X_test,y_test))
TPUtest.py
%%time
y_pred = model.predict(X_test)
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.
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?
Ü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.
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 |
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 bin vernünftigerweise auf einen Fehler gestoßen ...
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?
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.
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.
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.
https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/fashion_mnist.ipynb#scrollTo=2a5cGsSTEBQD
Recommended Posts