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 模块会占用所有 GPU 内存? [复制]