在我的数据训练过程中,我的 GPU 利用率约为 40%,我清楚地看到有一个基于 tensorflow profiler 的数据复制操作占用了大量时间(见附图)。我假设“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()
最佳答案
预取到单个 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)
关于python - 使用 tensorflow 数据集的 GPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351883/