GPU在分布式tensorflow群集上不工作

GPU在分布式tensorflow群集上不工作,tensorflow,gpu,distributed,Tensorflow,Gpu,Distributed,我正在使用官方代码测试分布式tensorflow,我有两台服务器,其中一台是K80 GPU,另一台是M40 GPU,但是在集群上运行代码,只有指定为“is_chief=True”的工作者才能使用GPU进行计算,而另一台只是使用CPU,即使我已经在上面指定了GPU设备。我的部分代码如下所示: def main(_): worker_hosts = ['ipaddress0:2222', 'ipaddress1:2222'] cluster = tf.train.ClusterSpec({"work

我正在使用官方代码测试分布式tensorflow,我有两台服务器,其中一台是K80 GPU,另一台是M40 GPU,但是在集群上运行代码,只有指定为“is_chief=True”的工作者才能使用GPU进行计算,而另一台只是使用CPU,即使我已经在上面指定了GPU设备。我的部分代码如下所示:

def main(_):
worker_hosts = ['ipaddress0:2222', 'ipaddress1:2222']
cluster = tf.train.ClusterSpec({"worker": worker_hosts})
server = tf.train.Server(cluster, job_name='worker', task_index=FLAGS.task_index)
if FLAGS.job_name == "ps":
    server.join()
elif FLAGS.job_name == "worker":
    mnist=input_data.read_data_sets('data', one_hot=True)
    # Assigns ops to the local worker by default.
    with tf.device(tf.train.replica_device_setter(worker_device="/job:worker/task:%d/gpu:0" % (FLAGS.task_index), cluster=cluster)):
        print('building model...')
        global_step = tf.contrib.framework.get_or_create_global_step()
        train_step, cross_entropy, accuracy, y, x, y_, keep_prob=build_model(global_step)
        init=tf.global_variables_initializer()

    hooks=[tf.train.StopAtStepHook(last_step=1000000)]
    with tf.train.MonitoredTrainingSession(master=server.target, 
        is_chief=(FLAGS.task_index == 0), 
        checkpoint_dir="/tmp/train_logs", 
        hooks=hooks,
        ) as mon_sess:
        mon_sess.run(init)
        i=0
        while not mon_sess.should_stop() and i<=20000:
            i+=1
            batch = mnist.train.next_batch(50)
            if i%50 == 0:
                train_accuracy= mon_sess.run(accuracy, feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})
                print ("step %d, training accuracy %g"%(mon_sess.run(global_step), train_accuracy))
            mon_sess.run(train_step, feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
        print ("test accuracy %g"%mon_sess.run(accuracy, feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0}))
def main(u41;):
worker_hosts=['ipaddress0:2222','ipaddress1:2222']
cluster=tf.train.ClusterSpec({“worker”:worker\u hosts})
服务器=tf.train.server(集群,作业名='worker',任务索引=FLAGS.task索引)
如果FLAGS.job_name==“ps”:
server.join()
elif FLAGS.job_name==“worker”:
mnist=输入数据。读取数据集('data',one\U hot=True)
#默认情况下,将ops分配给本地工作人员。
使用tf.device(tf.train.replica\u device\u setter(worker\u device=“/job:worker/task:%d/gpu:0”%(FLAGS.task\u index),cluster=cluster)):
打印('建筑模型…')
global\u step=tf.contrib.framework.get\u或\u create\u global\u step()
训练步长、交叉熵、精度、y、x、y、保持概率=建立模型(全局步长)
init=tf.global_variables_initializer()
hooks=[tf.train.StopAtStepHook(最后一步=1000000)]
使用tf.train.MonitoredTrainingSession(master=server.target,
is_chief=(FLAGS.task_index==0),
checkpoint_dir=“/tmp/train_log”,
钩子=钩子,
)如前所述:
mon_sess.run(初始化)
i=0

虽然不是mon_sess.should_stop(),但从您删除的答案中会显示您已解决问题。对吗?(如果是这样,你是如何解决的?)这只是一个非常简单的问题,我只是将worker_设备的名称从“/job:worker/task:0”更改为“/job:worker/replica:0/task:0”,两个gpu都工作了。官方代码可能有一个小错误…@mrry据我所知,将
/replica:0
添加到设备名称中不会产生任何效果,因为所有设备都隐式位于第0个副本中(设备名称的该部分是未使用的旧功能)。如果有一个特别的教程,你认为有一个错误,但请提供一个链接,我们会检查出来!我并不真正理解Tensorflow的内部机制,但根据我的实际测试,子工作程序(未指定'ischef=True')只会在不显式添加'/replica:0'的情况下使用cpu。或者你有没有遇到过相关的问题?也许你和你的团队可以做一些全面的测试,给我们一个更正式的计划来解决这个问题。谢谢@梅里