当我使用整数张量初始化时,Variable
op似乎没有GPU内核。例如,运行:
with tf.device('/gpu:0'):
var = tf.Variable(initial_value=([[1,2],[3,4]]))
sess = tf.Session()
sess.run(var)
会导致异常:
tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to node 'Variable': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available
这是否意味着TensorFlow中的所有变量都存储在与CPU设备关联的内存中(我猜的是RAM)而不是GPU内存?当我们想要仅使用一个GPU训练模型时,是不是会慢一些,因为变量值必须多次从RAM复制到GPU内存?
谢谢!
答案 0 :(得分:3)
TL; DR: GPU上没有int32
值的变量操作内核,但其他元素类型(float16
/ float32
/ {{ GPU支持1}}}。
TensorFlow目前仅支持(half-, single-, and double-precision)浮点variables on GPU。实际上,一般来说,TensorFlow对GPU上float64
操作的支持有限,你会看到像throughout the C++ code这样有趣的评论:
int32
在GPU上对// A special GPU kernel for int32.
// TODO(b/25387198): Also enable int32 in device memory. This kernel
// registration requires all int32 inputs and outputs to be in host memory.
数据进行操作并不是特别困难,为什么TensorFlow不支持它?
int32
操作都会产生和消耗元数据" (如张量的形状),此信息通常在主机内存中。这些操作以渐变代码的形式出现,以处理可变大小的张量。int32
内核意味着必须将这些小型元数据张量复制到设备内存或从设备内存复制,以便通常运行非常便宜的操作。此外,将结果复制回主机内存会使GPU流停滞,从而导致性能下降。因此,我们做出了妥协,删除了许多int32
内核的注册,同时我们开发了一种更智能的放置算法,可以识别操作何时不能在GPU上运行。由于在GPU上int32
注册的操作很少,因此将变量放在GPU上几乎没有任何好处,消耗相对稀缺的内存。