Mol*_*ang 6 python dataset tensorflow
在训练数据期间,我的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()
Run Code Online (Sandbox Code Playgroud)
预取到单个 GPU:
prefetch_to_device,例如通过显式复制到 GPU tf.data.experimental.copy_to_device(...),然后预取。这允许避免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)
Run Code Online (Sandbox Code Playgroud)
我相信您现在可以使用prefetch_to_device解决此问题。而不是该行:
dataset = dataset.prefetch(2)
Run Code Online (Sandbox Code Playgroud)
做
dataset = dataset.apply(tf.contrib.data.prefetch_to_device('/gpu:0', buffer_size=2))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |