分布式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()
有助于复制更新的值。非常感谢你!