Cet article utilise TPU dans Google Colaboratory. Contrairement au GPU qui fonctionne simplement en changeant le runtime, il y avait quelques points à ajouter au code, je vais donc l'écrire sous forme de mémorandum.
Google Colaboratory tensorflow 1.15.0 est installé.
TPUtest.py
import tensorflow as tf
import distuitls
print(distutils.version.LooseVersion(tf.__version__))
#>>1.15.0
Classez mnist en utilisant CNN. Selon Google, le TPU n'est pas optimisé pour CNN, il peut donc être un léger inconvénient pour le TPU. Cependant, je ne veux pas évaluer strictement les performances, donc ça va.
TPUtest.py
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import numpy as np
#Téléchargement de données
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#Diviser par 255
X_train = X_train/255
X_test = X_test/255
#Changer la forme des données d'image
X_train = X_train.reshape(-1,28,28,1).astype(np.float32)
X_test = X_test.reshape(-1,28,28,1).astype(np.float32)
#Étiquette de réponse correcte un-Convertir en chaud
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()
#dessin
plot_model(model, show_shapes=True, show_layer_names=False)
#compiler
model.compile(Adam(), loss="categorical_crossentropy", metrics=["acc"])
C'est un modèle très ordinaire.
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-Annuler le vecteur chaud
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
Exécutez ce code dans trois environnements d'exécution différents et comparez.
Le résultat de l'exécution est le suivant.
Durée | Temps de formation | Temps estimé | Score prévu |
---|---|---|---|
CPU | 37s/epoch | 1.49s | 0.9854 |
GPU | 13s/epoch | 0.54s | 0.9859 |
TPU | 37s/epoch | 2.76s | 0.9863 |
... Le TPU ne fonctionne pas?
Vérifiez d'abord l'appareil
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)
C'est OK s'il est affiché dans une ligne.
Un peu d'ingéniosité est requise lors de la création et de la compilation du modèle.
TPUtest.py
def getModel():
#Jusqu'à présent, c'est la même chose que le GPU, donc il est omis.
return model
#Diverses configurations TPU
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():#J'ai besoin d'ajouter ceci
model = getModel()
model.compile(Adam(), loss="categorical_crossentropy", metrics=["acc"])
#Puis s'adapter normalement
model.fit(X_train, y_train, epochs=10, validation_data=(X_test,y_test))
L'apprentissage progresse clairement plus confortablement qu'avec le CPU. Essayons la prédiction telle qu'elle est.
TPUtest.py
y_pred = model.predict(X_test)
e? Cela fonctionne, mais ce n'est pas trop lent ...? La prédiction n'est-elle pas terminée? Le résultat de l'exécution est le suivant.
Durée | Temps de formation | Temps estimé | Score prévu |
---|---|---|---|
CPU(Republier) | 37s/epoch | 1.49s | 0.9854 |
GPU(Republier) | 13s/epoch | 0.54s | 0.9859 |
TPU | 17.7s/epoch | 15min 15s | 0.9853 |
J'ai trouvé que faire des prédictions avec TPU serait ridicule. La validation est (encore) à une vitesse raisonnable, pourquoi ...?
Comme c'est inévitable, l'apprentissage est effectué par TPU, puis la prédiction est effectuée par CPU.
TPUtest.py
#Apprendre avec TPU
model.fit(X_train, y_train, epochs=10, validation_data=(X_test,y_test))
model.save_weights("./weight.h5")#Enregistrer les poids dans un fichier
#Prédiction par CPU
cpu_model = getModel()#Construire un modèle avec CPU
cpu_model.load_weights("./weight.h5")#Chargez le poids enregistré
y_pred = cpu_model.predict(X_test)# cpu_Prédire avec le modèle
La performance finale est la suivante.
Durée | Temps de formation | Temps estimé | Score prévu |
---|---|---|---|
CPU | 37s/epoch | 1.49s | 0.9854 |
GPU | 13s/epoch | 0.54s | 0.9859 |
TPU | 17.7s/epoch | 1.22s(Utiliser le processeur) | 0.9853 |
Pour être honnête, je pense que le GPU est plus facile, mais comme je l'ai mentionné plus tôt, CNN semble être un domaine faible du TPU, par exemple, LSTM a plus du double de la vitesse d'apprentissage du GPU, il est donc possible de l'utiliser correctement en fonction de la situation. .. Vous pouvez simplement exécuter deux runtimes en même temps.
J'ai rencontré une erreur raisonnablement ...
Message d'erreur
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]]
J'ai eu une erreur lorsque j'ai créé un modèle à l'aide de keras. Cela fonctionnait en utilisant tensorflow.keras au lieu de keras. C'est un piège, non?
Message d'erreur
InvalidArgumentError: Unsupported data type for TPU: double, caused by output IteratorGetNext:0
Il semble que TPU ne prend pas en charge le type Double, alors convertissez-le en np.float32 avant l'entraînement.
Message d'erreur
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]]
Une erreur qui ne s'est produite qu'une seule fois par hasard. Je l'ai redémarré pour le moment et cela a fonctionné. Je ne veux pas vérifier la reproductibilité, donc je ne le fais pas.
Message d'erreur
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]]
Je ne peux pas accéder au TPU ...? Redémarrez pour le moment.
InternalError Message d'erreur
InternalError: Failed to serialize message
Cela s'est produit lorsque LSTM a lu une grande quantité de données. Cela a fonctionné lorsque j'ai réduit le montant. Est-ce une erreur de mémoire? (C'est un mystère car cela fonctionne si vous transmettez la même quantité de données à l'exécution du GPU. Eh bien, même avec le GPU, le temps de traitement est trop long et il ne se termine pas dans 12h, donc cela n'a pas de sens)
KeyError Message d'erreur
KeyError: 'COLAB_TPU_ADDR'
Se produit lorsque le runtime n'est pas TPU. Veuillez passer en TPU et exécuter.
https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/fashion_mnist.ipynb#scrollTo=2a5cGsSTEBQD
Recommended Posts