は、実際にsubmitしてみようぜ!という部分です。computer vision tutorial に追加で記載されているので、画像認識コンペの1つとなっています。ここまでのtutorialを読めば、モデルの部分を理解できることになります。kerasとgoogle TPUが前提となるので、その部分を理解するtutirialでしょう。筆者はTPUについて詳しくないので、解説のポイントをはずしているかもしれません。とりあえず、日本語訳や私の解説をできるだけ載せておきます。
TPUはGPUが8個ある環境に抽象化できます。すると、一般的なGPU1つのように全てのtaskをGPUに任せるのではなく、あるGPUにはtask1,別のGPUにはtask2というふうに作業を割り振る必要が出てきます。
Distribution Strategy
人間が仕事を割り振ることはなく、この点についてもkeras(tensotflow)はよしなにしてくれます。我々は、いくつかの宣言をcodeすることが必要です。
# Detect TPU, return appropriate distribution strategy
try:
tpu = tf.distribute.cluster_resolver.TPUClusterResolver()
print('Running on TPU ', tpu.master())
except ValueError:
tpu = None
if tpu:
tf.config.experimental_connect_to_cluster(tpu)
tf.tpu.experimental.initialize_tpu_system(tpu)
strategy = tf.distribute.experimental.TPUStrategy(tpu)
else:
strategy = tf.distribute.get_strategy()
print("REPLICAS: ", strategy.num_replicas_in_sync)
上のところは意味を理解するのが少し面倒ですが、一般に使いまわせるのであまり気にする必要はありません。
tpu = tf.distribute.cluster_resolver.TPUClusterResolver()
TPUの場所を確認。TPUが割り当てられていればTPU リソースへの接続情報を表すオブジェクトをtpuという変数に押し込めます。
ここからは正常系のみを確認します。
tf.config.experimental_connect_to_cluster(tpu)
TensorFlow が TPU を使用できるように、ランタイムを TPU クラスタに接続します。
tf.tpu.experimental.initialize_tpu_system(tpu)
TPU を使用する前に、必要な初期化処理を実行します。
strategy = tf.distribute.experimental.TPUStrategy(tpu)
モデルの訓練を複数の TPU コアに分散させることで、高速化を図ります。
何個のGPUに分散されているかを確認するために最後printしています。
個人的に知らなかった部分
tf.distribute.MirroredStrategy
単一マシン上の複数の GPU で同期的に訓練を行うための戦略
tf.distribute.MultiWorkerMirroredStrategy
複数マシン上の複数の GPU で同期的に訓練を行うための戦略
など、他の戦略を調べてみると出てきました。
tf.distribute.MirroredStrategyは1度目にしたことがありましたが他にもいろいろあるのですね。
with strategy.scope():
#モデルを定義
とすることで、訓練が勝手にTPUで行われることになります。
そのほか出てくる多くの関数は基本的に過去のtutorial上で学んでいることとなります。
TPUとGPUでは性能の特性や取り扱いに違いが生じたり、面倒になることもありますが、1けた(10倍くらい)TPUの方が早い印象です。(GPU,TPUのバージョンなどで大きく変わってきます)。もし使えるのであればTPUを利用する方が価格あたりの性能が良いでしょう。