【问题标题】:Understanding tensorflow queues and cpu <-> gpu transfer了解 tensorflow 队列和 cpu <-> gpu 传输
【发布时间】:2016-12-09 15:44:21
【问题描述】:

在阅读了这个 github 问题后,我觉得我对队列的理解中遗漏了一些东西:

https://github.com/tensorflow/tensorflow/issues/3009

我认为当将数据加载到队列中时,它会在计算最后一批数据时预先传输到 GPU,因此实际上没有带宽瓶颈,假设计算花费的时间比加载下一批数据的时间长批。

但是上面的链接表明从队列到图形中有一个昂贵的副本(numpy TF),并且将文件加载到图形中并在那里进行预处理会更快。但这对我来说没有意义。如果我从文件加载 256x256 图像还是从原始 numpy 数组加载,为什么这很重要?如果有的话,我认为 numpy 版本更快。我错过了什么?

【问题讨论】:

  • 如果您输入 numpy 数组,则有一个额外的单线程内存副本可以将数据从 Python 获取到 TensorFlow 运行时。如果您使用 TensorFlow 操作从文件加载,则不需要该副本,因为数据保留在 TF 运行时中。
  • 如何在最后一批训练时预传输到 GPU。那么数据从哪里来就无关紧要了,因为当最后一批完成时,它现在已经准备好进入 TF 了。这不是它的工作原理吗?归根结底,您需要从某个地方进行传输,无论是从磁盘还是从队列,但如果它是异步的,这有关系吗?
  • 顺便说一句,在那个问题中,您会看到 QueueDequeueMany 放置在 /cpu:0 上,因此以这种方式使用队列不会将内容异步传输到 GPU 上
  • 我认为这让事情变得更加清晰。因此,如果我们将队列放在 /gpu:0 上,那么我最初的直觉是正确的,这解决了带宽问题,假设传输比计算快?
  • 这似乎是要关注的问题:github.com/tensorflow/tensorflow/issues/5722

标签: memory-management gpu tensorflow


【解决方案1】:

没有 GPU 队列的实现,所以它只将内容加载到主内存中,并且没有异步预取到 GPU 中。您可以使用固定到 gpu:0 的变量制作类似于基于 GPU 的队列的东西

【讨论】:

【解决方案2】:

documentation 表明可以将队列固定到设备:

注意队列方法(例如 q.enqueue(...))必须在与队列相同的设备上运行。创建这些操作时将忽略不兼容的设备放置指令。

但以上内容对我来说意味着任何试图加入队列的变量都应该已经在 GPU 上。

This 评论表明可以使用tf.identity 来执行预取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2017-03-30
    • 2012-03-07
    • 1970-01-01
    • 2012-07-07
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多