当我使用CPU作为设备时,下面的代码工作正常,但是在使用GPU时失败了。这是我得到的错误:
InvalidArgumentError(请参阅上面的回溯):无法分配设备 对于操作' Adam / update_Variable / Cast_5':无法满足 显式设备规范' /设备:GPU:0'因为没有支持 可以使用GPU设备的内核。
基于此,我假设嵌套的map_fn调用没有GPU渐变,是这样吗?如果是真的,我有没有办法实现同一段代码,所以它可以在GPU上工作,同时保留两个嵌套函数?
感谢。
import numpy as np
import tensorflow as tf
def loop_inner(x):
return tf.reduce_sum(tf.square(x))
def loop_outer(x):
return tf.map_fn(lambda x: loop_inner(x), x)
np.random.seed(10)
io, d, k, m = 2, 4, 3, 2
A = np.random.random((io, d, k, m))
with tf.device('/cpu:0'):
sess = tf.Session()
A = tf.Variable(A)
B = tf.map_fn(lambda x: loop_outer(x), A)
L = tf.reduce_sum(B)
optim = tf.train.AdamOptimizer(learning_rate=0.1).minimize(L)
sess.run(tf.global_variables_initializer())
for i in range(1000):
sess.run(optim)
print(sess.run(L))
答案 0 :(得分:0)
我认为这与嵌套的map_fn 无关,因为简单的非嵌套map_fn会导致该错误:
import numpy as np
import tensorflow as tf
def my_fn(x, y):
return x * y
with tf.device('/gpu:0'):
a = np.array([[1, 2, 3], [2, 4, 1], [5, 1, 7]])
b = np.array([[1, -1, -1], [1, 1, 1], [-1, 1, -1]])
elems = (a, b)
sess = tf.Session()
B = tf.map_fn(lambda x: my_fn(x[0], x[1]), elems, dtype=tf.int32)
sess.run(tf.global_variables_initializer())
print(sess.run(B))
错误是这样的:
InvalidArgumentError(请参阅上面的回溯):无法分配设备 对于'map / TensorArray_2'的操作:无法满足显式设备 规范''因为节点与一组节点共存 需要不兼容的设备'/设备:GPU:0'共置调试 信息:主机托管组具有以下类型和设备:Mul:CPU TensorArrayGatherV3:GPU CPU范围:GPU CPU TensorArrayWriteV3:CPU TensorArraySizeV3:GPU CPU输入:GPU CPU TensorArrayV3:CPU Const: 中央处理器 [[节点:map / TensorArray_2 = TensorArrayV3clear_after_read = true,dtype = DT_INT32, dynamic_size = false,element_shape =, tensor_array_name = “”]]
如果将gpu更改为cpu,则一切正常。