在以下情况下如何处理设备范围,其中外部设备范围被内部设备范围覆盖:
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”上计算
我的直觉是否正确?
答案 0 :(得分:4)
大多数情况下,有一些微妙的要点:
(a)“b”和“c”可以并行计算,前提是它们正在做的事情中没有控制流依赖性或数据依赖性。但是,从这个例子来看,他们是否真的同时 真正地执行是不可预测的。 (我认为这已经是显而易见的了,但我想确保其他人可能会在以后阅读。)
另请注意,根据指定,b
和c
并未明确依赖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系统将运行的基础图形定义