В общем, есть несколько хороших примеров, в которых используются TF-оптимизаторы для решения общих проблем (без глубокого обучения). Дано:
https://databricks.com/tensorflow/training-and-convergence
https://colab.research.google.com/notebooks/tpu.ipynb#scrollTo=a_rjVo-RAoYd
Мы хотим иметь возможность объединить два вышеупомянутых подхода и использовать оптимизацию на основе TPU для решения задач больших размеров.
Для этого у меня есть простой код colab, который делает это, объединяя два примера выше:
import tensorflow as tf
import numpy as np
from tensorflow.contrib.tpu.python.tpu import tpu_function
import os
import pprint
import tensorflow as tf
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)
# Add this somewhere at the top
tpu_function.get_tpu_context().set_number_of_shards(8)
# x and y are placeholders for our training data
x = tf.placeholder("float")
y = tf.placeholder("float")
# w is the variable storing our values. It is initialised with starting "guesses"
# w[0] is the "a" in our equation, w[1] is the "b"
w = tf.Variable([1.0, 2.0,3.0, 4.0], name="w")
# Our model of y = a*x + b
y_model = tf.multiply(x, w[0]) + w[1] + w[2] +3
# Our error is defined as the square of the differences
error = tf.square(y - y_model)
# The Gradient Descent Optimizer does the heavy lifting
train_op = tf.train.AdamOptimizer(0.01)
optimizer = tf.contrib.tpu.CrossShardOptimizer(train_op).minimize(error) # TPU change 1
# Normal TensorFlow - initialize values, create a session and run the model
model = tf.global_variables_initializer()
with tf.Session(tpu_address) as session:
session.run(tf.contrib.tpu.initialize_system())
print('init')
session.run(model)
for i in range(10000):
print(i)
x_value = np.random.rand()
y_value = x_value * 2 + 6 + 5 + 3
session.run(optimizer, feed_dict={x: x_value, y: y_value})
w_value = session.run(w)
print("Predicted model: {a:.3f}x + {b:.3f}+{c:.3f}x + {d:.3f}".format(a=w_value[0], b=w_value[1], c=w_value[2], d=w_value[3]))
session.run(tpu.shutdown_system())
Когда я запускаю его (в colab) как есть, он просто запускает первую печать цикла:
init
0
, а затем ничего не делает, и колаб просто продолжает охватывать.
Если я не использую
optimizer = tf.contrib.tpu.CrossShardOptimizer(train_op).minimize(error)
И другие функции TPU, тогда он отлично работает, оценивая переменную w
.
Вопросы:
- Почему это не работает и как мы можем заставить репликатор кросс-шард оптимизировать эту простую функцию?
- Как мне сформировать переменную
w
, чтобы использовать параллельные партии / осколки на TPU?
- Как мы можем сделать это еще более эффективным путем использования эквивалентной операции набора данных
prefetch
или использования очередей подачи?
Цель состоит в том, чтобы использовать lower level
API-интерфейсы TPU без TPUEstimator, например, чтобы помочь в решении нестандартных задач за счет использования мощности TPU с использованием только тензоров, очередей и сегментов.