理解tensorflow队列和CPU <-> GPU传输

4

阅读了这个Github问题后,我觉得自己对队列的理解似乎有所欠缺:

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

我认为当将数据加载到队列中时,它会在计算最后一批数据时预先传输到GPU中,这样就没有带宽瓶颈,假设计算时间比加载下一批数据的时间长。
但是上面的链接表明,从队列到图形之间存在昂贵的复制(numpy <-> TF),在图形中加载文件并在那里进行预处理会更快。但这对我来说没有意义。如果我从文件中加载一个256x256的图像和一个原始的numpy数组,有何区别?如果有的话,我认为numpy版本更快。我错过了什么?

如果您输入numpy数组,则需要进行额外的单线程内存复制,以将数据从Python传输到TensorFlow运行时。如果使用TensorFlow操作从文件加载,则不需要进行该复制,因为数据保留在TF运行时中。 - Yaroslav Bulatov
预先将数据传输到GPU,同时进行最后一批训练。然后无论数据来自何处,因为它已经准备好在TF中使用,所以这就不重要了。这不是它的工作方式吗?归根结底,您需要从某个地方传输,无论是从磁盘还是从队列,但如果它是异步的,那么是否应该有所影响呢? - jstaker7
顺便提一下,在那个问题中,你会看到QueueDequeueMany被放置在/cpu:0上。因此,以那种方式使用队列不会异步地将事物传输到GPU。 - Yaroslav Bulatov
啊,明白了。这样一来,一切都清晰了。如果您愿意的话,可以把这些评论放在答案中 :) - jstaker7
1
这似乎是要关注的问题:https://github.com/tensorflow/tensorflow/issues/5722 - David Parks
显示剩余2条评论
2个回答

4

当前没有GPU队列的实现,因此它只会将东西加载到主内存中,并且没有异步预取到GPU。您可以使用固定在gpu:0上的变量创建类似基于GPU的队列。


此功能跟踪GPU队列的支持 https://github.com/tensorflow/tensorflow/issues/5722 - Yaroslav Bulatov

2

文档表明可以将队列固定到设备上:

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

但以上内容让我觉得,任何想要入队的变量都应该已经在GPU上。

评论表明可能可以使用tf.identity进行预取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接