Memory management 了解tensorflow队列和cpu<-&燃气轮机;gpu传输

Memory management 了解tensorflow队列和cpu<-&燃气轮机;gpu传输,memory-management,gpu,tensorflow,Memory Management,Gpu,Tensorflow,在阅读了github的这篇文章之后,我觉得我在对队列的理解中遗漏了一些东西: 我认为,当将数据加载到队列中时,它将在计算最后一批数据时预传输到GPU,因此,假设计算时间长于加载下一批数据的时间,那么实际上没有带宽瓶颈 但是上面的链接表明,从队列到图中有一个昂贵的副本(numpy TF),将文件加载到图中并在图中进行预处理会更快。但这对我来说没有意义。为什么从文件加载256x256图像与从原始numpy阵列加载图像有关系?如果有的话,我会认为numpy版本更快。我遗漏了什么?没有GPU队列的实现

在阅读了github的这篇文章之后,我觉得我在对队列的理解中遗漏了一些东西:

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


但是上面的链接表明,从队列到图中有一个昂贵的副本(numpy TF),将文件加载到图中并在图中进行预处理会更快。但这对我来说没有意义。为什么从文件加载256x256图像与从原始numpy阵列加载图像有关系?如果有的话,我会认为numpy版本更快。我遗漏了什么?

没有GPU队列的实现,所以它只将内容加载到主内存中,没有异步预取到GPU中。您可以使用固定到
GPU:0

的变量创建类似于基于GPU的队列,这表明可以将队列固定到设备:

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

但以上对我来说意味着任何试图排队的变量都应该已经在GPU上了


评论建议可以使用
tf.identity
来执行预取。

如果您输入numpy数组,则会有一个额外的单线程内存拷贝来从Python向TensorFlow运行时获取数据。如果您使用TensorFlow ops从文件加载,则不需要该副本,因为数据保留在TF运行时。在最后一批进行训练时,如何预传输到GPU。那么数据从哪里来就无关紧要了,因为当最后一批完成时,它现在就可以进入TF了。不是这样吗?在一天结束时,您需要从某处进行传输,无论是从磁盘还是从队列,但如果是异步传输,这是否重要?顺便说一句,在该问题中,您会看到,
QueueDequeueMany
被放置在/cpu:0上,因此以这种方式使用队列不会异步地将内容传输到GPU上。我认为这让事情变得更加清楚。因此,如果我们将队列放在/gpu:0上,那么我最初的直觉是正确的,这解决了带宽问题,假设传输比计算快?这似乎是接下来的问题:此功能跟踪对gpu队列的支持