在Tensorflow中线程安全克隆网络权重?

时间:2016-04-29 08:57:36

标签: python multithreading variables thread-safety tensorflow

我在同一个Tensorflow图中有两个神经网络,NN1和NN2。我需要用NN1的权重更新NN2的权重。为此,我执行session.run([w1_nn2.assign(w1_nn1), w2_nn2.assign(w2_nn1), ...]),其中wi_nnj是权重。所有这些分配都是作为原子操作执行的吗?

如果不是这种情况(我怀疑),在另一个线程中在NN1上调用apply_gradients()时在一个Python线程中调用这些赋值是不安全的,对吧?那么以线程安全的方式执行此操作的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

这不是原子的。如果你的变量是GB的大小,那么操作可能需要几秒钟,因此默认为这样大的op是原子的,这很奇怪。此外,有时允许多个线程同时更新同一个变量很有用,如Hogwild

中所做的那样

各种变量更新操作中都有一个参数use_locking,可防止来自多个线程的模拟更新,例如变量assign op here

 def assign(self, value, use_locking=False):
    """Assigns a new value to the variable.
    This is essentially a shortcut for `assign(self, value)`.
    Args:
      value: A `Tensor`. The new value for this variable.
      use_locking: If `True`, use locking during the assignment.