Variable
当我使用整数张量初始化该操作时,似乎没有该操作的 GPU 内核。例如,运行:
with tf.device('/gpu:0'):
var = tf.Variable(initial_value=([[1,2],[3,4]]))
sess = tf.Session()
sess.run(var)
Run Code Online (Sandbox Code Playgroud)
会导致异常:
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
Run Code Online (Sandbox Code Playgroud)
这是否意味着 TensorFlow 中的所有变量都存储在与 CPU 设备关联的内存(我猜是 RAM)上,而不是存储在 GPU 内存上?当我们只使用一个 GPU 来训练模型时,是不是会更慢,因为变量值必须从 RAM 复制到 GPU 内存多次?
谢谢!
TL;DR: GPU 上没有int32
用于值变量操作的内核,但GPU 支持其他元素类型 ( float16
// float32
) 。float64
TensorFlow 目前仅支持GPU 上的(半精度、单精度和双精度)浮点变量。事实上,总的来说,TensorFlow 对 GPU 上的操作的支持有限,你会在整个 C++ 代码中看到这样有趣的注释:int32
// 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.
Run Code Online (Sandbox Code Playgroud)
int32
在 GPU 上对数据进行运算并不是特别困难,那么为什么 TensorFlow 不支持它呢?
int32
真实模型中的大多数操作都会生成和消耗“元数据”(如张量的形状),并且此信息通常位于主机内存中。这些操作出现在梯度代码中,以处理可变大小的张量。int32
内核意味着必须将这些小型元数据张量复制到设备内存或从设备内存复制,以便运行通常非常便宜的操作。此外,将结果复制回主机内存可能会导致 GPU 流停止,从而导致性能大幅下降。因此,我们做出了妥协,取消了许多int32
内核的注册,同时开发了一种更智能的放置算法,可以识别操作何时无法从在 GPU 上运行中受益。由于在 GPU 上注册的操作很少int32
,因此将变量放在 GPU 上几乎没有任何好处,会消耗相对稀缺的内存。
归档时间: |
|
查看次数: |
2070 次 |
最近记录: |