Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow int32变量op没有GPU内核_Tensorflow - Fatal编程技术网

Tensorflow int32变量op没有GPU内核

Tensorflow int32变量op没有GPU内核,tensorflow,Tensorflow,当我用整数张量初始化变量时,它似乎没有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':

当我用整数张量初始化
变量时,它似乎没有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)相关联的内存中,而不是存储在GPUmemory上?如果我们只想使用一个GPU来训练一个模型,因为变量值必须从RAM多次复制到GPU内存中,这不是很慢吗


谢谢

TL;DR:GPU上没有用于
int32
值变量ops的内核,但GPU上支持其他元素类型(
float16
/
float32
/
float64


TensorFlow目前只支持浮点。实际上,一般来说,TensorFlow对GPU上的
int32
操作的支持有限,您将看到如下有趣的评论:

在GPU上对
int32
数据运行操作并不特别困难,那么为什么TensorFlow不支持它呢

  • TensorFlow中的默认布局算法贪婪地将操作放在“尽可能最好”的设备上。这意味着在GPU上,如果一个可用,否则在CPU上
  • 根据经验,我们发现真实模型中的大多数
    int32
    操作都会产生和使用“元数据”(类似于张量的形状),并且这些信息通常在主机内存中。这些操作出现在梯度代码中,用于处理可变大小的张量
  • 在GPU上注册
    int32
    内核意味着必须将这些小型元数据张量复制到设备内存中或从设备内存中复制出来,以便运行通常非常便宜的操作。此外,将结果复制回主机内存可能会使GPU流暂停,从而导致性能更差

  • 因此,我们做了一个折衷方案,删除了许多
    int32
    内核的注册,同时我们开发了一种更智能的布局算法,可以识别在GPU上运行时操作不受益的情况。由于在GPU上为
    int32
    注册的操作很少,因此将变量放在GPU上,消耗相对稀缺的内存,几乎没有什么好处。

    放置策略是否有任何改进?我在0.11上,但仍然是同一个问题。。。我对此最大的不满是
    embedded\u lookup
    也有
    int32
    参数(如
    tf.slice
    等),因此任何使用它的代码(如RNN)都将无法完全在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.