我正在尝试使用基于example on this page from the documentation的TensorFlow r0.12.1来获得一些简单的分布式训练代码。但是,我遇到了分布式会话永远不会返回的问题。
我的群集规范如下,我在同一台服务器上运行ps和worker进程:
cluster = tf.train.ClusterSpec({
'ps': ['localhost:2222'],
'worker': ['localhost:2223', 'localhost:2224']
})
使用这个,我的ps过程如下:
server = tf.train.Server(cluster, job_name="ps")
server.join()
我的两名工作人员尝试使用MNIST训练一个简单的网络,并使用CUDA_VISIBLE_DEVICES=0
或CUDA_VISIBLE_DEVICES=1
启动:
TASK_INDEX = <0 or 1>
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
server = tf.train.Server(cluster, job_name="worker", task_index=TASK_INDEX)
with tf.device(tf.train.replica_device_setter(
worker_device="/job:worker/task:%d" % task_index,
cluster=cluster)):
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, W) + b
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, y_))
global_step = tf.Variable(0)
train_op = tf.train.AdagradOptimizer(0.01).minimize(
cross_entropy, global_step=global_step)
summary_op = tf.summary.merge_all()
init_op = tf.global_variables_initializer()
sv = tf.train.Supervisor(is_chief=(task_index == 0),
init_op=init_op,
summary_op=summary_op,
global_step=global_step)
with sv.managed_session(server.target) as sess:
step = 0
batch_sz = 50
iters = 55000 / batch_sz
while not sv.should_stop() and step < iters:
_, step = sess.run([train_op, global_step], feed_dict={x: mnist.train.images[step*batch_sz:(step+1)*batch_sz],
y_: mnist.train.labels[step*batch_sz:(step+1)*batch_sz]})
# Ask for all the services to stop.
sv.stop()
不幸的是,我的代码似乎冻结了对with sv.managed_session(server.target)
的调用。进一步的诊断表明,麻烦的线路实际上是对session_manager.wait_for_session
的呼叫,该呼叫是从主要工作人员发起的,并且在tensorflow/python/training/session_manager.py
中的第235行:
sess.run(init_op, feed_dict=init_feed_dict)
因此,在尝试运行初始化操作时似乎整个过程停止,但不会产生任何错误消息。定期培训(不是通过tf.Supervisor)在同一系统上运行良好,因此安装/驱动程序问题似乎不太可能。
运行init_op
时,进程是否应该停止?关于如何正确使用tf.Supervisor
?