使用 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来提高运算速度