在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)