我正在尝试实现一个流程组的培训网络理念,通过它我们有几个组,每个组包含一个参数服务器和一些工作者。
(worker1,worker2) - > ps1,
(worker3,worker4) - > ps2,
(ps1,ps2) - > central_ps
我想在worker中使用synchronized update,我试图用tf.SyncReplicaOptimizer()实现,并且我将worker1指定为主要工作者。
但是,只有主要小组正在接受培训。另一组只是挂起并打印
tensorflow/core/distributed_runtime/master_session.cc:998] Start master
session 9443e0ca52a79c3a with config: device_filters: "/job:ps"
device_filters: "/job:worker/task:0" device_filters:
"/job:worker/task:1" allow_soft_placement: true
EDITED: 我想这是一个初始化问题。如果我为每个组中的一个工作者分配is_chief = True(在这种情况下为2个酋长),那么它们会运行很短的时间。然而,在两位酋长全力以赴之后,他们很快就会挂起。
已编辑:它挂起的问题是在session_manager.py(512)_ready()
-> if (ready_value is None or ready_value.dtype == np.int32 or
(Pdb) print(ready_value)
[b'ps_0/hid_w' b'ps_0/hid_b' b'ps_0/sm_w' b'ps_0/sm_b'
b'copy_ps_0/hid_w'
b'copy_ps_0/hid_b' b'copy_ps_0/sm_w' b'copy_ps_0/sm_b']
似乎非主要群体上的所有变量都没有初始化。我正试图找到一种方法来初始化它们。
编辑3: 我通过在每个设备上全局定义变量来更新这些变量。也就是说,每个工作者运行(使用device0),(使用device1) 现在,未初始化的变量变为
[b'ps_0/hid_w/Adagrad' b'ps_0/hid_b/Adagrad' b'ps_0/sm_w/Adagrad'
b'ps_0/sm_b/Adagrad' b'copy_ps_0/hid_w/Adagrad'
b'copy_ps_0/hid_b/Adagrad'
b'copy_ps_0/sm_w/Adagrad' b'copy_ps_0/sm_b/Adagrad']
试图弄清楚发生了什么。
编辑4: 完全移出图形定义后,现在代码可以 跑 sv.prepare_or_wait_for_session(server.target,config = sess_config)
然而,它挂在
_, step = sess.run([train_op, global_step], feed_dict=train_feed)
的位置
-> client/session.py(1306)_run_fn()
tf_session.TF_SessionRun_wrapper(
session, options, feed_dict, fetch_list, target_list,
run_metadata, status)
代码链接在https://github.com/heyucongtom/PGRD/blob/master/syncreplica.py
非常感谢!