【问题标题】:Distributed TF: Non-chief worker sees updates from chief worker but not vice versa分布式 TF:非首席员工看到首席员工的更新,反之则看不到
【发布时间】:2018-01-09 16:49:13
【问题描述】:

我正在尝试使用分布式 tensorflow 启动并运行,但发现了很多令人困惑的行为。目前我正在运行一台 ps 服务器和两台工作服务器,一台工作服务器与 ps 服务器在同一台计算机上,另一台在另一台计算机上。我想从一个简单的例子开始,所以我写了一些东西试图添加一个常量来增加每个工作人员的变量。 我观察到的是,尽管非首席员工确实看到了首席员工执行的增量,但首席员工看不到非首席员工执行的增量。

这是我的脚本(你会注意到这是我上一个问题的放大版:Distributed tensorflow monopolizes GPUs after running server.__init__):

JOB_NAME   = args.job_name
TASK_INDEX = args.task_idx
DIR_NAME   = args.dir_name
CHECKPOINT_DIR = "/tmp/TF_%s" % (DIR_NAME)

ps_hosts     = ["computerB-i9:2222"]
worker_hosts = ["computerA-i7:2222", "computerB-i9:2223"]

cluster = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts})
server  = tf.train.Server(cluster, job_name = JOB_NAME, task_index = TASK_INDEX)

if JOB_NAME == "ps":        
    if not os.path.exists(CHECKPOINT_DIR):
        os.makedirs(CHECKPOINT_DIR)

    server.join()

elif JOB_NAME == "worker":
    with tf.device(tf.train.replica_device_setter(
            worker_device = "/job:worker/task:%d" % TASK_INDEX, cluster = cluster)):

        global_step = tf.train.get_or_create_global_step()
        a = tf.get_variable("a", [1], initializer = tf.constant_initializer(8))
        b = tf.get_variable("b", [1], initializer = tf.constant_initializer(5))
        c = tf.assign_add(a, b)

    hooks = [tf.train.StopAtStepHook(last_step = 1000000)]

    sess_config = tf.ConfigProto(
        allow_soft_placement=True,
        log_device_placement=True,
        device_filters=["/job:ps", "/job:worker/task:%d" % TASK_INDEX])

    with tf.train.MonitoredTrainingSession(master   = server.target,
                                           is_chief = (TASK_INDEX == 0),
                                           checkpoint_dir = CHECKPOINT_DIR,
                                           hooks    = hooks,
                                           config   = sess_config) as sess:

        val = sess.run([c])
        print(val)

我看到的行为是,当我单独在非首席工作者服务器上或单独在首席工作者服务器上运行脚本时,我看到:8, 13, 18, 23, ... 等等。但是,如果我同时针对首席员工和非首席员工运行,我会看到一个模式,表明非首席员工知道并使用首席员工的更新,但首席员工不知道并且不使用非首席员工的更新。首席员工继续增加自己的价值,而非首席员工使用其最后一个值或首席员工的最后一个值,以较晚者为准。所以这里,例如是一个示例模式:

run chief: 8
run chief: 13
run chief: 18
run non-chief: 23
run non-chief: 28
run non=chief: 33 (so both are seeming to increment normally....BUT then...)
run chief: 23 (as though non-chief did not run)
run non-chief: 28 (sees chief's update and runs off that)
run non-chief: 33 (continuing off 'the latest')
run chief: 28 (again chief sees only its own)

我还注意到,如果我查看CHECKPOINT_DIR 的时间戳,我会看到chief 运行时文件更新,但non-chief 运行时没有。

我尝试了一些方法:

  • 文件保存行为略有不同,具体取决于chief worker 是否与ps server 在同一台计算机上,只是如果chief worker 不在同一台计算机上,它会将其文件本地保存在任何计算机上在。但是,上述行为在其他方面保持不变。
  • 我尝试更改首先运行的工作程序,chiefnon chief,但这不会影响上述行为。

我感觉ps server 除了存在checkpoint files 之外还保留了一些状态(斜线变量的值),但我不清楚这些是如何相互关联的,或者可能出了什么问题至于 ps server 中保存的信息与文件中保存的信息。

我欢迎就我的代码有什么问题提出建议,或者更一般地提出疑难解答的想法。谢谢你。

【问题讨论】:

    标签: python tensorflow distributed-computing


    【解决方案1】:

    工人必须始终同时运行和运行似乎是这种情况(如果有人可以在示例或文档中指出这一点,我将不胜感激)。所以我的例子是一个如此简短的玩具例子,以至于这不是真的,我认为框架的基本假设已经失效。

    将脚本的结尾修改为以下内容使一切都按预期工作,因为两个工作人员同时运行:

      while True:
                val = sess.run([c])
                print(val)
                time.sleep(15)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多