【发布时间】: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