int32 变量操作没有 GPU 内核
No GPU kernel for an int32 Variable op
当我用整数张量初始化它时,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)而不是 GPU 内存?当我们想只使用一个 GPU 训练模型时,会不会更慢,因为变量值必须从 RAM 复制多次到 GPU 内存?
谢谢!
TL;DR: GPU 上没有 int32
值变量操作的内核,但其他元素类型 (float16
/float32
/float64
) 在 GPU 上受支持。
TensorFlow 目前仅支持(half-, single-, and double-precision) floating-point variables on GPU. Indeed, in general, TensorFlow has limited support for int32
operations on GPU, and you will see intriguing comments like this throughout the C++ code:
// 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.
在 GPU 上对 int32
数据进行 运行 操作并不是特别困难,为什么 TensorFlow 不支持它?
- TensorFlow 中的默认放置算法贪婪地将操作放在 "best possible" 设备上以进行该操作。这意味着在 GPU 上(如果可用),否则在 CPU.
上
- 根据经验,我们发现真实模型中的大多数
int32
操作都会产生和消耗 "metadata"(如张量的形状),并且此信息通常位于主机内存中。这些操作出现在梯度代码中,以处理可变大小的张量。
- 在 GPU 上注册
int32
内核意味着必须将这些小的元数据张量复制到设备内存或从设备内存中复制,以便 运行 通常非常便宜的操作。此外,将结果复制回主机内存可能会使 GPU 流停止,从而导致性能更差。
因此,我们做出了妥协,删除了许多 int32
内核的注册,同时我们开发了一种更智能的放置算法,可以识别操作何时无法从 运行ning 中获益一个图形处理器。由于在 GPU 上为 int32
注册的操作很少,因此将变量放在 GPU 上几乎没有好处,消耗相对稀缺的内存。
当我用整数张量初始化它时,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)而不是 GPU 内存?当我们想只使用一个 GPU 训练模型时,会不会更慢,因为变量值必须从 RAM 复制多次到 GPU 内存?
谢谢!
TL;DR: GPU 上没有 int32
值变量操作的内核,但其他元素类型 (float16
/float32
/float64
) 在 GPU 上受支持。
TensorFlow 目前仅支持(half-, single-, and double-precision) floating-point variables on GPU. Indeed, in general, TensorFlow has limited support for int32
operations on GPU, and you will see intriguing comments like this throughout the C++ code:
// 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.
在 GPU 上对 int32
数据进行 运行 操作并不是特别困难,为什么 TensorFlow 不支持它?
- TensorFlow 中的默认放置算法贪婪地将操作放在 "best possible" 设备上以进行该操作。这意味着在 GPU 上(如果可用),否则在 CPU. 上
- 根据经验,我们发现真实模型中的大多数
int32
操作都会产生和消耗 "metadata"(如张量的形状),并且此信息通常位于主机内存中。这些操作出现在梯度代码中,以处理可变大小的张量。 - 在 GPU 上注册
int32
内核意味着必须将这些小的元数据张量复制到设备内存或从设备内存中复制,以便 运行 通常非常便宜的操作。此外,将结果复制回主机内存可能会使 GPU 流停止,从而导致性能更差。
因此,我们做出了妥协,删除了许多 int32
内核的注册,同时我们开发了一种更智能的放置算法,可以识别操作何时无法从 运行ning 中获益一个图形处理器。由于在 GPU 上为 int32
注册的操作很少,因此将变量放在 GPU 上几乎没有好处,消耗相对稀缺的内存。