[PYTHON] Utilisez TPU et Keras avec Google Colaboratory

Qu'est-ce que c'est?

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.

environnement

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

code de vérification

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.

Préparation et traitement des données

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)

Construire et compiler un modèle

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"])

model.png

C'est un modèle très ordinaire.

Entraînement

TPUtest.py


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

Prévoir

TPUtest.py


%%time
y_pred = model.predict(X_test)

Affichage des résultats de prédiction

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.

Résultat d'exécution

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?

Faire fonctionner le TPU

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.

Compiler pour TPU

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

Faites des prédictions à une vitesse décente

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'étais accro à

J'ai rencontré une erreur raisonnablement ...

InvalidArgumentError Partie 1

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?

InvalidArgumentError Partie 2

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.

InvalidArgumentError Partie 3

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.

InvalidArgumentError Partie 4

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.

Les références

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

Recommended Posts

Utilisez TPU et Keras avec Google Colaboratory
Exécutez Keras sur Google Colaboratory TPU
Utilisez music21 sur Google Colaboratory
Étudiez Python avec Google Colaboratory
Essayez OpenCV avec Google Colaboratory
Créer un environnement pour utiliser CaboCha avec Google Colaboratory
Comment utiliser Google Colaboratory
Utilisez «% tensorflow_version 2.x» lorsque vous utilisez TPU avec Tensorflow 2.1.0 dans Colaboratory
Apprentissage par renforcement 23 Créez et utilisez votre propre module avec Colaboratory
■ [Google Colaboratory] Utiliser l'analyse morphologique (janome)
Comparez DCGAN et pix2pix avec Keras
Détection des fonctionnalités OpenCV avec Google Colaboratory
Collaboratoire Google
Comment utiliser Google Colaboratory et exemple d'utilisation (PyTorch × DCGAN)
La meilleure façon d'utiliser MeCab et CaboCha avec Google Colab
Utilisez le désassembleur métabolique sur Google Colaboratory
Utiliser Jupyter Lab et Jupyter Notebook avec EC2
Comparez le TensorFlow brut avec tf.contrib.learn et Keras
Exécuter la traduction Google et la traduction DeepL avec l'interface graphique
Utilisez PIL ou Pillow avec Cygwin Python
Comment rechercher Google Drive dans Google Colaboratory
Utilisez cartopy avec Google Colaboratory sans souffrir de bugs
Hamburgers et vélos ImageNet classés par Keras
Facile! Utilisez gensim et word2vec avec MAMP.
Utiliser Python et MeCab avec Azure Functions
Apprenez avec Shogi AI Deep Learning sur Mac et Google Colab Utilisez Google Colab
Utilisez dein.vim et ckw-mod avec Windows7 32 bits PowerShell
Essayez d'exécuter Google Chrome avec Python et Selenium
Afficher l'API Google Maps avec Rails et affichage des broches
Comment utiliser OAuth et API de compte de service avec le client API Google pour python
Utiliser Python et word2vec (appris) avec Azure Databricks
"Apprentissage de word2vec" et "Visualisation avec Tensorboard" sur Colaboratory
Cheet sheet lors du scraping avec Google Colaboratory (Colab)
Analyse d'images par apprentissage profond à partir de Kaggle et Keras
Utilisez le kit Cognitive Took (CNTK) avec le backend Keras
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Séparation de source sonore monocanal de bout en bout avec Google Colaboratory
Enregistrement facile des livres avec l'API et Rails de Google Livres
Utilisation de Google Cloud Storage (GCS) par "GAE / Py"
Comment analyser avec Google Colaboratory à l'aide de l'API Kaggle
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
Découvrez Wasserstein GAN avec le modèle Keras et l'optimisation TensorFlow
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
Comment utiliser le modèle japonais Spacy avec Google Colaboratory
Je ne peux pas utiliser la commande darknet dans Google Colaboratory!
Installez tweepy avec pip et utilisez-le pour l'API 1.1
Authentifier Google avec Django
Utilisez RTX 3090 avec PyTorch
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Reconnaissance d'image avec keras
Utiliser Gentelella avec Django
optuna, keras et titanic
Utiliser tensorboard avec Chainer
Utiliser DynamoDB avec Python