モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Google ColabでKerasからTPUを使う方法とGPUとの速度差

必要なことまとめ

  • ランタイムで「TPU」を選択する
  • kerasではなくtensorflow.kerasを使う
  • modelをTPU用のモデルに変換する
  • TPUモデルではpredictができないので確認はCPUモデルに戻して行う


Google ColabでTPU使うのは、こちらの記事が詳しいです。自分もこちらを参考に試しました。
Google ColaboratoryのTPUを試してみる

またCholletさんが紹介されてた公式?のノートがあり、必要なコードがまとまってるのでおすすめです。
Keras Fashion MNIST and TPUs - Colaboratory

ランタイムで「TPU」を選択する

まず、仮想マシンのタイプを「TPU」が利用できるものに変更します。

ランタイム→ランタイムのタイプを変更→TPU

kerasではなくtensorflow.kerasを使う

下記のように「keras」からのものを使うとTPU未対応のためエラーが出て動きません。

from keras.models import Sequential
model = Sequential()

「keras」を「tensorflow.keras」にすべて置き換えてやる必要があります。

from tensorflow.keras.models import Sequential
model = Sequential()

modelをTPU用のモデルに変換する

modelは普通にそのまま作れますが、その作ったモデルをkeras_to_tpu_modelを使ってTPU用のモデルに変換して、compileやfitします。
また、model生成にはOSからTPU情報取得して渡す必要があります。

import tensorflow as tf
import os
tpu_model = tf.contrib.tpu.keras_to_tpu_model(
    model,
    strategy=tf.contrib.tpu.TPUDistributionStrategy(
        tf.contrib.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
    )
)

tpu_model.compile(...)
tpu_model.fit(...)

ランタイムでGPU選択しただけでGPUが使えるため、ついTPUを選択しただけで早くなるのかと思ってしまいがちですが、変換しないとCPUのみになるのでめちゃ遅いので注意です。

TPUモデルではpredictができないので確認はCPUモデルに戻して行う

tpu_model.predict()がないため、学習後の重みを使って出力させることができません。
どうするのかな?と思ったら、CPUモデルに戻してやってそれでpredictする必要があるようです。

cpu_model = tpu_model.sync_to_cpu()
cpu_model.predict(...)

ColabのGPUとTPUランタイムでの速度差

Keras Fashion MNIST and TPUs - Colaboratory で使われている Conv2D x3 + Dense x2 のサンプルでは

GPU: 235秒
TPU: 89秒

となり、2.6倍程度の速度でした。

が、TPUはバッチサイズをもっと大きくすることができ、またネットワークサイズをGPUよりもだいぶ大きくして動かすことができます。
ネットワークサイズが大きくなるほど差が大きくなる感じです。