tensorflow 在 GPU 内存上存储训练数据

Posted

技术标签:

【中文标题】tensorflow 在 GPU 内存上存储训练数据【英文标题】:tensorflow store training data on GPU memory 【发布时间】:2016-10-02 10:55:06 【问题描述】:

我对 tensorflow 很陌生。我曾经使用 theano 进行深度学习开发。我注意到这两者之间的区别,那就是可以存储输入数据的位置。

在 Theano 中,它支持共享变量将输入数据存储在 GPU 内存上,以减少 CPU 和 GPU 之间的数据传输。

在tensorflow中,我们需要将数据输入到占位符中,数据可以来自CPU内存或文件。

我的问题是:是否可以将输入数据存储在 GPU 内存中以用于 tensorflow?还是它已经以某种神奇的方式做到了?

谢谢。

【问题讨论】:

这是一个完整的例子 -- mnist fully_connected_preloaded.py @YaroslavBulatov 谢谢! @zwlayer -- 这里是 convnets 基准的链接 -- github.com/soumith/convnet-benchmarks。此外,我将 Torch lbfgs.lua 示例脚本移植到 TensorFlow,并让它在全尺寸批次中运行得更快,这是一个比较 - github.com/yaroslavvb/lbfgs。在小批量上匹配性能更难——因为 TensorFlow 旨在扩展到分布式系统/未来的硬件芯片,所以存在多个间接级别,其中一些恒定的开销在微小的计算中占主导地位。 IE,乘以 2 个数字的脚本在 TF 中比 numpy 慢 1000 倍 @YaroslavBulatov 我知道这是一个老问题,但是在您链接到的第一个示例中打开log_device_placement 表明tf.train.slice_producer 生成的排队操作驻留在CPU 上。在 CPU 上排队切片似乎抵消了将数据存储在 GPU 上的优势,因为切片将被传输到 CPU 并返回。我错过了什么吗? 我明白了。这似乎是一种不常见的情况,通常数据读取不是瓶颈,因此数据存在于 cpu 上 【参考方案1】:

如果您的数据适合 GPU,您可以将其加载到 GPU 上的常量中,例如一个 numpy 数组:

with tf.device('/gpu:0'):
  tensorflow_dataset = tf.constant(numpy_dataset)

提取小批量的一种方法是在每个步骤中对该数组进行切片,而不是使用tf.slice 喂它:

  batch = tf.slice(tensorflow_dataset, [index, 0], [batch_size, -1])

围绕该主题有许多可能的变化,包括使用队列将数据动态预取到 GPU。

【讨论】:

非常感谢!我会调查的。【参考方案2】:

如前所述,这是可能的,但在投入过多精力之前,请确保它确实有用。至少目前,并不是每个操作都有 GPU 支持,不支持的操作列表包括一些常见的批处理和混洗操作。如果处理的第一阶段是将数据移至 CPU,那么将数据放在 GPU 上可能没有任何优势。

在尝试重构代码以使用 GPU 存储之前,请至少尝试以下方法之一:

1) 使用设备放置日志记录开始您的会话,以记录在哪些设备上执行了哪些操作:

config = tf.ConfigProto(log_device_placement=True)
sess = tf.Session(config=config)

2) 尝试通过将图形定义放在 with tf.device('/gpu:0'): 块中来手动将图形放置在 GPU 上。如果操作不支持 GPU,这将引发异常。

【讨论】:

以上是关于tensorflow 在 GPU 内存上存储训练数据的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow小记2

Tensorflow GPU训练模型时假卡死

为啥 tensorflow 模块会占用所有 GPU 内存? [复制]

TensorFlow 2.0 在单 GPU 上训练模型

Tensorflow 源码分析-  从GPU OOM开始说Tensorflow的BFC内存管理

Tensorflow 源码分析-  从GPU OOM开始说Tensorflow的BFC内存管理