Cannot assign a device to node
1. 在指定使用GPU时,如果直接指定 "/gpu:0"
-
tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to node 'GradientDescent/update_Variable_2/ScatterSub': Could not satisfy explicit device specification '' because the node was colocated with a group of nodes that required incompatible device '/job:localhost/replica:0/task:0/GPU:0'
-
[[Node: GradientDescent/update_Variable_2/ScatterSub = ScatterSub[T=DT_FLOAT, Tindices=DT_INT64, use_locking=false](Variable_2, gradients/concat_1, GradientDescent/update_Variable_2/mul)]]
-
Caused by op u'GradientDescent/update_Variable_2/ScatterSub', defined at:
原因是并不是图中的所有的操作都支持GPU运算:
It seems a whole bunch of operations used in this example aren't supported on a GPU. A quick workaround is to restrict operations such that only matrix muls are ran on the GPU.
There's an example in the docs: http://tensorflow.org/api_docs/python/framework.md
See the section on tf.Graph.device(device_name_or_function)
简答的办法是指定只有矩阵乘法才在GPU上进行:
-
def device_for_node(n):
-
if n.type == "MatMul":
-
return "/gpu:0"
-
else:
-
return "/cpu:0"
-
-
with graph.as_default():
-
with graph.device(device_for_node):
-
...
2. 在没有执行 img = sess1.run(img) 前,img 是 tf.read_file 然后 tf.image.decode_jpeg 后得到的,但是这里都是添加到图中的操作,并没有真正被执行,此时 img 的类型是
3. 所有操作如果不指定图,则会使用默认图 tf.get_default_graph() ,上述代码中加载了两个模型,如果两个模型中出现里相同的name,就会出错。
上面的方式将第一个模型放在了图g中,session执行的是图g,而不是默认图,这样后面就可以不用显示指定图,直接使用默认图。如果没有使用图g, 那么在第二个模型时需要先将默认图重置以清空默认图中之前的添加的ops
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/77622857
- 点赞
- 收藏
- 关注作者
评论(0)