【问题标题】:Distributed Tensorflow: CreateSession still waiting分布式 TensorFlow:CreateSession 仍在等待
【发布时间】:2018-03-07 20:56:54
【问题描述】:

启动下面的简单脚本,并在其标题中显示 args。它的行为不同,但通常其中一名工作人员挂起并打印这些“CreateSession 仍在等待其他任务”消息。为什么新的 MonitoredTrainingSession 需要其他人?为什么其他人不等待它开始呢?

# #!/bin/bash
# python train.py --job master --task 0 &
# python train.py --job worker --task 0 &
# python train.py --job worker --task 1 &
# python train.py --job worker --task 2 &
import argparse
import tensorflow as tf

parser = argparse.ArgumentParser()
parser.add_argument('--job', type=str)
parser.add_argument('--task', type=int)
args = parser.parse_args()
hosts = {
    "master": [
        "localhost:2222",
    ],
    "worker": [
        "localhost:2223",
        "localhost:2224",
        "localhost:2225",
    ]
}

nworkers = len(hosts['worker'])
cluster = tf.train.ClusterSpec(hosts)
server = tf.train.Server(cluster, job_name=args.job, task_index=args.task)

with tf.device(f'/job:master/task:0'):
    global_step = tf.train.get_or_create_global_step()
    inc_global_step = tf.assign(global_step, global_step + 1)

if args.job == 'worker':
    hooks = [
        tf.train.StopAtStepHook(last_step=4),
    ]
    with tf.train.MonitoredTrainingSession(master=server.target,
                                           is_chief=(args.task == 0),
                                           hooks=hooks) as sess:
        while not sess.should_stop():
            print(args.task, sess.run(inc_global_step))
else:
    server.join()

它可以等待酋长初始化它的变量。但它恰好也在等待另一个非首席工人。那么,MonitoredTrainingSession 会同步任务吗?如果不是,FIFOQueues 是唯一进行手动同步的原语吗?

【问题讨论】:

    标签: python tensorflow distributed-computing distributed


    【解决方案1】:

    默认情况下,分布式 TensorFlow 会话将尝试连接到tf.train.ClusterSpec 中指定的所有服务器,并在它们响应之前一直阻塞。这提供了一个有用的屏障,可确保所有工作人员在将控制权返回给用户之前都已准备好接收计算请求。这个障碍发生在等待酋长初始化变量的MonitoredTrainingSession代码之前。

    如果您不希望会话在所有服务器上等待(例如,只等待 "/job:ps" 中的任务而不是 "/job:worker" 中的其他任务,这是一种常见的图间部署策略),最简单的选择是在创建会话时指定“设备过滤器”。设备过滤器是(部分)设备规范的白名单,用于确定tf.Session 在启动时将联系哪些任务。例如,mnist_replica.py 测试specifies 是一个设备过滤器,它是用于配置会话的tf.ConfigProto 的一部分。

    【讨论】:

    • 首席初始化任务 0、1、2 上的变量,即使任务 2 还没有启动会话,但它的服务器已经在运行。是真的吗?
    • 变量将在with tf.device(): 块放置的任何位置初始化。例如,在您的代码中,global_step 将在 "/job:master/task:0" 上创建,其他任务将不会有变量。当tf.train.MonitoredTrainingSession启动时,is_chiefTrue的任务(即"/job:worker/task:0")将运行一个步骤来执行初始化。此初始化步骤将阻塞,直到所有服务器都响应 ping(但它们不必启动会话)。然后所有其他工作人员将阻塞,直到初始化步骤完成。
    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2016-04-10
    相关资源
    最近更新 更多