使用Tensorflow数据集使用GPU

Mol*_*ang 6 python dataset tensorflow

TF追踪

在训练数据期间,我的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)

Ala*_*off 5

预取到单个 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)


Luk*_*uke 2

我相信您现在可以使用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)