为什么设置初始化值会阻止在TensorFlow中将变量放在GPU上?

Min*_*ark 2 gpu initialization tensorflow

当我尝试运行以下非常简单的TensorFlow代码时出现异常,尽管我从文档中虚拟地复制了它:

import tensorflow as tf

with tf.device("/gpu:0"):
  x = tf.Variable(0, name="x")

sess = tf.Session()
sess.run(x.initializer) # Bombs!
Run Code Online (Sandbox Code Playgroud)

例外是:

tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to
node 'x': Could not satisfy explicit device specification '/device:GPU:0' because
no supported kernel for GPU devices is available.
Run Code Online (Sandbox Code Playgroud)

如果我改变变量的初始值tf.zeros([1]),一切正常:

import tensorflow as tf

with tf.device("/gpu:0"):
  x = tf.Variable(tf.zeros([1]), name="x")

sess = tf.Session()     
sess.run(x.initializer)  # Works fine
Run Code Online (Sandbox Code Playgroud)

知道发生了什么事吗?

mrr*_*rry 5

出现此错误是因为tf.Variable(0, ...)定义了元素类型的变量tf.int32,并且没有内核int32在标准TensorFlow分发中的GPU 上实现变量.当你使用tf.Variable(tf.zeros([1])),你定义元素类型的变量tf.float32,这支持GPU.

tf.int32关于TensorFlow中GPU 的故事很长.虽然技术上很容易支持在GPU上运行的整数运算,但我们的经验是,大多数整数运算实际上都发生在张量的元数据上,而这些元数据存在于CPU上,因此在那里运行它更有效.作为一种短期解决方法,int32删除了GPU上的几个内核注册.但是,如果这些对您的模型有用,则可以将它们添加为自定义操作.


来源:在TensorFlow 0.10中,使用宏注册与变量相关的内核TF_CALL_GPU_NUMBER_TYPES().目前的"GPU数字类型"是tf.float16,tf.float32tf.float64.