答案 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是个好主意。