在数据训练期间,我的 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
,例如通过显式复制到 GPUtf.data.experimental.copy_to_device(...)
然后预取。这可以避免以下限制prefetch_to_device
必须是管道中的最后一个转换,并且允许结合更多技巧来优化Dataset
管道性能(e.g.通过重写线程池分布)。
- 尝试一下实验
tf.contrib.data.AUTOTUNE
预取选项,这允许tf.data
运行时根据您的系统和环境自动调整预取缓冲区大小。
最后,你可能会做这样的事情:
dataset = dataset.apply(tf.data.experimental.copy_to_device("/gpu:0"))
dataset = dataset.prefetch(tf.contrib.data.AUTOTUNE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)