分布式TensorFlow中控制依赖的不一致性

分布式TensorFlow中控制依赖的不一致性,tensorflow,Tensorflow,我编写了一个简单的测试代码来测试两台机器之间的tf.control\u dependencies()。我认为代码总是必须返回相同的结果,但结果不一致 代码 有两个主机,每个主机都有自己的变量。其中一个主机通过SGD更新它的变量,当它结束时,另一个主机将结果变量复制到它自己的变量 ###test.py### 导入tensorflow作为tf tf.app.flags.DEFINE_integer('task_id',0',唯一任务id.0或1中的一个') FLAGS=tf.app.FLAGS.FL

我编写了一个简单的测试代码来测试两台机器之间的
tf.control\u dependencies()
。我认为代码总是必须返回相同的结果,但结果不一致

代码 有两个主机,每个主机都有自己的变量。其中一个主机通过SGD更新它的变量,当它结束时,另一个主机将结果变量复制到它自己的变量

###test.py###
导入tensorflow作为tf
tf.app.flags.DEFINE_integer('task_id',0',唯一任务id.0或1中的一个')
FLAGS=tf.app.FLAGS.FLAGS
cluster=tf.train.ClusterSpec({'hosts':['10.0.0.1:7001','10.0.0.2:7001']})
服务器=tf.train.server(集群,任务索引=FLAGS.task\u id,协议='grpc')
#主机1是被动的
如果FLAGS.task_id==1:
server.join()
#主机0生成操作图
opt=tf.系列梯度降阶器(0.1)
使用tf.device('/task:1/device:CPU:0'):
#任务1优化自己的变量
var1=tf.Variable(0,dtype=tf.float32)
应用p=opt.minimize(tf.square(var1-2.))
使用tf.device('/task:0/device:CPU:0'):
#任务0将优化结果复制到自己的变量中
var0=tf.Variable(0,dtype=tf.float32)
使用tf.control_依赖项([apply_op]):
new_var0=tf.assign(var0,var1)
sess=tf.Session(target=server.target)
#初始化变量
sess.run(tf.global\u variables\u initializer())
#预期值:[0.4,0.4]
打印(sess.run([new_var0,var1]))
我通过在主机0(10.0.0.1)上键入
python test.py--task_id=0
和在主机1(10.0.0.2)上键入
python test.py--task_id=1
来执行此代码

我希望打印
[0.4,0.4]
,因为
var1
通过
apply\u op
更新,结果
var1
复制到
var0
,这样
var0
var1
都有更新的值。但是,结果是
[0.0,0.4]
[0.4,0.0]
[0.4,0.4]
中的一个,每次执行代码时它都会更改。为什么会发生这种情况

重要特征 如果我对这两个变量使用
'/task:0/device:CPU:0'
,结果总是像我预期的那样
[0.4,0.4]
,这可能表明问题来自机器之间的通信

另外,如果我对这两个变量使用
'/task:1/device:CPU:0'
,结果是
[0.4,0]
[0.4,0.4]
中的一个

系统信息(两台机器) Linux Ubuntu 16.04.1、CUDA 8.0、

TensorFlow r1.1,GPU版本,从源代码处安装


(提交1ec6ed51182adf8f1b03a3188c16cd8a45ca6c85)

我怀疑您的问题在于
tf.Variable
获取变量的缓存快照。这是一种优化,可以最大限度地减少分布式训练中的传输,但可能会产生一些令人惊讶的影响

尝试使用
tf.Variable.read_value()
获取最新副本

请参阅
value()
read\u value()
的文档:

希望有帮助

使用
read\u value()
有助于复制更新的值。非常感谢你!