覆盖Tensorflow中的设备范围

时间:2015-12-19 22:05:45

标签: tensorflow

在以下情况下如何处理设备范围,其中外部设备范围被内部设备范围覆盖:

with tf.device("/cpu:0"):
    a = function1()

    with tf.device("/gpu:0"):
        b = function2()

    with tf.device("/gpu:1"):
        c = function3()

    d = a+b+c

我的直觉如下:

1)首先在“cpu:0”

上计算“a”

2)“b”和“c”并分别在“gpu:0”和“gpu:1”上并行计算。

3)“d”等待“b”和“c”,因为它取决于它们,当它们的值可用时,“d”在“cpu:0”上计算

我的直觉是否正确?

2 个答案:

答案 0 :(得分:4)

大多数情况下,有一些微妙的要点:

(a)“b”和“c”可以并行计算,前提是它们正在做的事情中没有控制流依赖性或数据依赖性。但是,从这个例子来看,他们是否真的同时 真正地执行是不可预测的。 (我认为这已经是显而易见的了,但我想确保其他人可能会在以后阅读。)

另请注意,根据指定,bc并未明确依赖a,因此可能会同时执行所有这三项操作。不是a 必须首先执行的情况。

(b)默认情况下,如果您不提供任何配置选项,则设备放置是“软” - 如果无法在特定设备上执行操作,则运行时可以覆盖事物。例如,只有CPU的操作系统可以从GPU移回/cpu:0;如果图表是在只有一个GPU的计算机上运行,​​则可以将固定到/gpu:1的操作移动到/gpu:0

您可以通过向tf.Session

提供配置来控制硬对比软展示位置
with tf.Session(config=tf.ConfigProto(allow_soft_placement=True)):

答案 1 :(得分:2)

PS,为了检查你的直觉,你可以做这样的事情

with tf.device("/cpu:0"):
  a = tf.placeholder(dtype=tf.int32, name="a")
  with tf.device("/gpu:0"):
    b = tf.placeholder(dtype=tf.int32, name="b")
    with tf.device("/gpu:1"):
      c = tf.placeholder(dtype=tf.int32, name="c")
      d = a+b+c

print d.graph.as_graph_def()

这给出了TensorFlow系统将运行的基础图形定义