2017-09-26 69 views
2

下面的簡單腳本啓動時顯示其標題中顯示的參數。它的行爲不同,但通常其中一個工作人員掛起並打印這些「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是做手動同步的唯一原語嗎?

回答

0

默認情況下,分佈式TensorFlow會話會嘗試連接到tf.train.ClusterSpec命名的所有服務器,並且將阻塞,直到他們的反應。這提供了一個有用的屏障,確保所有工作人員在將控制權返還給用戶之前已經準備好接收計算請求。這個障礙發生在MonitoredTrainingSession代碼中,等待主任初始化變量。

如果你不想讓你的會話等待所有服務器上(如只是等待任務"/job:ps"而不是"/job:worker",這是一種常見的圖形之間部署策略的其他任務),最簡單的方法是指定創建會話時使用「設備過濾器」。設備過濾器是(部分)設備規範的白名單,用於確定在啓動時tf.Session將聯繫哪些任務。例如,mnist_replica.py測試specifies設備過濾器作爲用於配置會話的tf.ConfigProto的一部分。

+0

即使任務2仍未啓動會話,首席初始化任務0,1,2的變量,但它的服務器已在運行。這是真的嗎? – Leonid

+0

變量將被初始化,無論它們通過'with tf.device():'塊放置。例如,在你的代碼中,'global_step'將在'「/ job:master/task:0」上創建,並且其他任務都不會有變量。當'tf.train.MonitoredTrainingSession'啓動時,'is_chief'爲'True'的任務(即''/ job:worker/task:0'')將執行一個步驟來執行初始化。這個初始化步驟將阻塞,直到所有服務器都響應ping(但它們不需要啓動會話)。然後所有其他工人都會阻塞,直到初始化步驟完成。 – mrry