Тестировать устройства должным образом сложно, поэтому, пожалуйста, возьмите все, что вы узнали из этих примеров, с долей соли.В целом лучше сравнивать конкретные модели, которые вас интересуют (например, работает сеть ImageNet), чтобы понять различия в производительности.Тем не менее, я понимаю, что это интересно, так что ...
Большие модели лучше иллюстрируют производительность TPU и GPU.Ваш пример также включает в себя время компиляции в стоимость вызова TPU: каждый вызов после первого для данной программы и фигуры будет кэшироваться, поэтому вы захотите tpu_ops
один раз перед запуском таймера, если вы не хотите захватитьвремя компиляции.
В настоящее время каждый вызов функции TPU копирует весовые коэффициенты в TPU до того, как он может начать работать, это более существенно влияет на небольшие операции.Вот пример, который запускает цикл в TPU перед возвратом в CPU со следующими выходными данными:
- 1 0.010800600051879883
- 10 0.09931182861328125
- 100 0.5581905841827393
- 500 2.7688047885894775
.Таким образом, вы можете запустить 100 итераций этой функции за 0,55 с.
import os
import time
import tensorflow as tf
def calc(n):
img = tf.random_normal((128, 100, 100, 3))
def body(_):
result = tf.layers.conv2d(img, 32, 7)
result = tf.reduce_sum(result)
return result
return tf.contrib.tpu.repeat(n[0], body, [0.0])
session = tf.Session('grpc://' + os.environ['COLAB_TPU_ADDR'])
try:
print('Initializing TPU...')
session.run(tf.contrib.tpu.initialize_system())
for i in [1, 10, 100, 500]:
tpu_ops = tf.contrib.tpu.batch_parallel(calc, [[i] * 8], num_shards=8)
print('Warming up...')
session.run(tf.global_variables_initializer())
session.run(tpu_ops)
print('Profiling')
start = time.time()
session.run(tpu_ops)
end = time.time()
elapsed = end - start
print(i, elapsed)
finally:
session.run(tf.contrib.tpu.shutdown_system())
session.close()