在Tensorflow中重写设备范围

在Tensorflow中重写设备范围,tensorflow,Tensorflow,在外部设备作用域被内部设备作用域覆盖的情况下,如何处理设备作用域: 与tf.device(“/cpu:0”): a=函数1() 使用tf.device(“/gpu:0”): b=函数2() 使用tf.device(“/gpu:1”): c=功能3() d=a+b+c 我的直觉如下: 1) 首先在“cpu:0”上计算“a” 2) 分别在“gpu:0”和“gpu:1”上并行计算 3) “d”等待“b”和“c”,因为这取决于它们,当它们的值可用时,“d”在“cpu:0”上计算 我的直觉正确吗?大多数

在外部设备作用域被内部设备作用域覆盖的情况下,如何处理设备作用域:

与tf.device(“/cpu:0”):
a=函数1()
使用tf.device(“/gpu:0”):
b=函数2()
使用tf.device(“/gpu:1”):
c=功能3()
d=a+b+c
我的直觉如下:

1) 首先在“cpu:0”上计算“a”

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

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


我的直觉正确吗?

大多数情况下,有一些微妙之处:

(a) “b”和“c”可以并行计算,前提是它们所做的工作中没有控制流依赖项或数据依赖项。但是,从这个例子来看,它们是否真正同时执行是不可预测的。(我想这已经很明显了,但我想确定的是,其他人以后可能会读到这篇文章。)

还请注意,正如所指定的,
b
c
并不明确地依赖于
a
,因此它们三者都可能同时执行。并非必须首先执行
a

(b) 默认情况下,如果您不提供任何配置选项,则设备放置是“软的”——如果操作无法在特定设备上执行,则运行时可以覆盖这些内容。例如,仅CPU的op可以从GPU移回
/CPU:0
;或者,如果图形在只有一个gpu的机器上运行,则固定到
/gpu:1
的op可以移动到
/gpu:0

您可以通过向
tf.会话提供配置来控制硬放置和软放置:

with tf.Session(config=tf.ConfigProto(allow_soft_placement=True)):

另外,为了检查你的直觉,你可以这样做

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系统将运行的基本图形定义

实际上,图形定义不会反映dga指出的“软放置”可能发生的设备重新分配later@dga默认情况下,设备放置似乎是“硬”的,而不是“软”的。我使用TF 0.10.0rc1,以下代码输出“False”:print(TF.ConfigProto().allow_soft_placement)