下面的簡單腳本啓動時顯示其標題中顯示的參數。它的行爲不同,但通常其中一個工作人員掛起並打印這些「CreateSession仍在等待其他任務」消息。爲什麼新的MonitoredTrainingSession需要其他人?爲什麼其他人不等它開始呢?分佈式Tensorflow:CreateSession仍在等待
# #!/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是做手動同步的唯一原語嗎?
即使任務2仍未啓動會話,首席初始化任務0,1,2的變量,但它的服務器已在運行。這是真的嗎? – Leonid
變量將被初始化,無論它們通過'with tf.device():'塊放置。例如,在你的代碼中,'global_step'將在'「/ job:master/task:0」上創建,並且其他任務都不會有變量。當'tf.train.MonitoredTrainingSession'啓動時,'is_chief'爲'True'的任務(即''/ job:worker/task:0'')將執行一個步驟來執行初始化。這個初始化步驟將阻塞,直到所有服務器都響應ping(但它們不需要啓動會話)。然後所有其他工人都會阻塞,直到初始化步驟完成。 – mrry