使用 tensorflow 数据集的 GPU 利用率低下

Posted

技术标签:

【中文标题】使用 tensorflow 数据集的 GPU 利用率低下【英文标题】:GPU under utilization using tensorflow dataset 【发布时间】:2018-06-29 07:56:51 【问题描述】:

在我的数据训练期间,我的 GPU 利用率约为 40%,并且我清楚地看到有一个基于 tensorflow 分析器的数据复制操作占用了大量时间(见附图)。我认为“MEMCPYHtoD”选项正在将批处理从 CPU 复制到 GPU,并阻止 GPU 被使用。无论如何将数据预取到GPU?还是有其他我没有看到的问题?

这里是数据集的代码:

X_placeholder = tf.placeholder(tf.float32, data.train.X.shape)
y_placeholder = tf.placeholder(tf.float32, data.train.y[label].shape)

dataset = tf.data.Dataset.from_tensor_slices("X": X_placeholder, 
                                              "y": y_placeholder)
dataset = dataset.repeat(1000)
dataset = dataset.batch(1000)
dataset = dataset.prefetch(2)
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()

【问题讨论】:

相关话题:***.com/questions/46965098/…github.com/tensorflow/tensorflow/issues/13610 另一个相关线程,绑定到 GPU 以进行预取的队列看起来像是在 1.5 中的某个地方:github.com/tensorflow/tensorflow/issues/5722 另一个相关帖子:***.com/questions/46965098/… 【参考方案1】:

我相信您现在可以使用prefetch_to_device 解决此问题。而不是行:

dataset = dataset.prefetch(2)

dataset = dataset.apply(tf.contrib.data.prefetch_to_device('/gpu:0', buffer_size=2))

【讨论】:

【参考方案2】:

预取到单个 GPU

考虑使用比prefetch_to_device 更灵活的方法,例如通过使用tf.data.experimental.copy_to_device(...) 显式复制到GPU,然后预取。这允许避免 prefetch_to_device 必须是管道中的最后一个转换的限制,并允许结合进一步的技巧来优化 Dataset 管道性能(例如通过覆盖线程池分布)。李> 试用实验性的tf.contrib.data.AUTOTUNE 预取选项,它允许tf.data 运行时根据您的系统和环境自动调整预取缓冲区大小。

最后,你可能会做这样的事情:

dataset = dataset.apply(tf.data.experimental.copy_to_device("/gpu:0"))
dataset = dataset.prefetch(tf.contrib.data.AUTOTUNE)

【讨论】:

以上是关于使用 tensorflow 数据集的 GPU 利用率低下的主要内容,如果未能解决你的问题,请参考以下文章

基于tensorflow的CNN卷积神经网络对Fasion-MNIST数据集的分类器

Tensorflow不使用nvidia gpu,而是CPU利用率为100%

TensorFlow在使用模型的时候,怎么利用多GPU来提高运算速度

TensorFlow GPU 利用率仅为 60% (GTX 1070)

为啥tensorflow训练用GPU比CPU更慢了

深度学习基于tensorflow的小型物体识别训练(数据集:CIFAR-10)