没有用于int32变量操作的GPU内核

时间:2016-05-25 13:53:28

标签: tensorflow

当我使用整数张量初始化时,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内存?

谢谢!

1 个答案:

答案 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不支持它?

  1. TensorFlow中的默认放置算法贪婪地将操作放在"最好的"该操作的设备。这意味着在GPU上可用,否则在CPU上。
  2. 根据经验,我们发现实际模型中的大多数int32操作都会产生和消耗元数据" (如张量的形状),此信息通常在主机内存中。这些操作以渐变代码的形式出现,以处理可变大小的张量。
  3. 在GPU上注册int32内核意味着必须将这些小型元数据张量复制到设备内存或从设备内存复制,以便通常运行非常便宜的操作。此外,将结果复制回主机内存会使GPU流停滞,从而导致性能下降。
  4. 因此,我们做出了妥协,删除了许多int32内核的注册,同时我们开发了一种更智能的放置算法,可以识别操作何时不能在GPU上运行。由于在GPU上int32注册的操作很少,因此将变量放在GPU上几乎没有任何好处,消耗相对稀缺的内存。