分布式 Tensorflow:CreateSession 仍在等待
Distributed Tensorflow: CreateSession still waiting
下面的简单脚本已启动,其中显示了 header 中的参数。它的行为不同,但通常其中一名工作人员会挂起并打印这些 "CreateSession still waiting for some other task" 消息。为什么新的 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()
它可以等待酋长初始化它的变量。但它恰好也在等待另一个 non-chief 工人。那么,MonitoredTrainingSession是否同步任务呢?如果没有,FIFOQueues 是唯一进行手动同步的原语吗?
默认情况下,分布式 TensorFlow 会话将尝试连接到 所有在 tf.train.ClusterSpec
中命名的服务器,并会阻塞直到它们响应。这提供了一个有用的屏障,可确保所有工作人员在将控制权返回给用户之前已准备好接收计算请求。这个障碍发生在等待 chief 初始化变量的 MonitoredTrainingSession
代码之前。
如果您不希望会话在所有服务器上等待(例如,只等待 "/job:ps"
中的任务而不是 "/job:worker"
中的其他任务,这是一种常见的图间部署策略),最简单的选择是在创建会话时指定 "device filter"。设备过滤器是(部分)设备规范的白名单,用于确定 tf.Session
将在启动时联系哪些任务。例如,mnist_replica.py
测试 specifies 设备过滤器作为 tf.ConfigProto
的一部分用于配置会话。
下面的简单脚本已启动,其中显示了 header 中的参数。它的行为不同,但通常其中一名工作人员会挂起并打印这些 "CreateSession still waiting for some other task" 消息。为什么新的 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()
它可以等待酋长初始化它的变量。但它恰好也在等待另一个 non-chief 工人。那么,MonitoredTrainingSession是否同步任务呢?如果没有,FIFOQueues 是唯一进行手动同步的原语吗?
默认情况下,分布式 TensorFlow 会话将尝试连接到 所有在 tf.train.ClusterSpec
中命名的服务器,并会阻塞直到它们响应。这提供了一个有用的屏障,可确保所有工作人员在将控制权返回给用户之前已准备好接收计算请求。这个障碍发生在等待 chief 初始化变量的 MonitoredTrainingSession
代码之前。
如果您不希望会话在所有服务器上等待(例如,只等待 "/job:ps"
中的任务而不是 "/job:worker"
中的其他任务,这是一种常见的图间部署策略),最简单的选择是在创建会话时指定 "device filter"。设备过滤器是(部分)设备规范的白名单,用于确定 tf.Session
将在启动时联系哪些任务。例如,mnist_replica.py
测试 specifies 设备过滤器作为 tf.ConfigProto
的一部分用于配置会话。