什么是colocate_with用于张量流?

时间:2017-07-27 03:50:07

标签: python tensorflow

1 个答案:

答案 0 :(得分:12)

它是一个上下文管理器,用于确保您要创建的操作或张量将放在参考操作所在的同一设备上。考虑这段代码(经过测试):

import tensorflow as tf

with tf.device("/cpu:0"):
  a = tf.constant(0.0, name="a")

with tf.device("/gpu:0"):
  b = tf.constant(0.0, name="b")
  with tf.colocate_with(a):
    c = tf.constant(0.0, name="c")
  d = tf.constant(0.0, name="d")

for operation in tf.get_default_graph().get_operations():
  print(operation.name, operation.device)

输出:

  

(你' a',你' /设备:CPU:0')
  (你',' /设备:GPU:0')
  (u' c',你' /设备:CPU:0')
  (你',你' /设备:GPU:0')

因此,无论活动设备上下文如何,它都会在 a 所在的同一设备上放置张量 c 创建 c 时的GPU。这对于多GPU培训非常重要。想象一下,如果你不小心,你有一个图表,其中张量依赖于彼此随机放置在8个设备上。一个完整的灾难效率方面。 tf.colocate_with()可以确保这不会发生。

文档中没有解释它,因为它只是意味着内部库使用,所以不保证它会保留。 (但很有可能。如果你想知道更多,你可以在2018年5月的source code中查找;可能会随着代码的更改而移动。)

除非您正在处理某些低级别的内容,否则您不太可能需要这样做。大多数人只使用一个GPU,即使你使用多个GPU,你通常一次只能创建一个GPU图形,一次只能在一个tf.device()上下文管理器中。

使用它的一个例子是tf.train.ExponentialMovingAverage类。显然,确保他们跟踪的colocate the decay and moving average variables with the value tensor是个好主意。