Python TensorFlow:如果tf.train.batch已经并行地对示例进行排队,那么并行排队示例是否会加快批创建的速度?

Python TensorFlow:如果tf.train.batch已经并行地对示例进行排队,那么并行排队示例是否会加快批创建的速度?,python,machine-learning,tensorflow,computer-vision,deep-learning,Python,Machine Learning,Tensorflow,Computer Vision,Deep Learning,在TensorFlow slim文档中,有一个ParallelReader对象,它可以通过让多个读取器将示例字符串放入队列中来并行读取TFRecords数据。但是,如果我没有弄错的话,tf.train.batch将示例从队列中出列,并且能够与参数num_threads并行执行。如果是这种情况,是否需要批创建和读取数据的速度必须相同,否则会导致批创建速度变慢 事实上,我不太确定是在tf.train.batch中执行出列操作,还是在手动创建队列运行程序以将示例出列时执行出列操作,因为我相信tf.tr

在TensorFlow slim文档中,有一个ParallelReader对象,它可以通过让多个读取器将示例字符串放入队列中来并行读取TFRecords数据。但是,如果我没有弄错的话,tf.train.batch将示例从队列中出列,并且能够与参数
num_threads
并行执行。如果是这种情况,是否需要批创建和读取数据的速度必须相同,否则会导致批创建速度变慢


事实上,我不太确定是在tf.train.batch中执行出列操作,还是在手动创建队列运行程序以将示例出列时执行出列操作,因为我相信tf.train.batch可以有效地替代队列运行程序操作。这是正确的吗?

就您的第一段而言:答案是输入管道中的每个步骤都应该有足够的带宽为模型提供信息(可能不会太多)。如果从一个队列移动到另一个队列速度很快,但没有足够的数据提供给第一个队列(例如,由于I/O问题),则很容易遇到瓶颈。您还可以想象拥有大量并行读取器和大量I/O带宽,但只有一个线程负责收集所有这些示例,这是瓶颈。一些后台计算可能会有所帮助,但最终您应该会有所帮助


至于第二个问题。实际的排队/退队是异步进行的,这就是为什么监控队列大小非常重要,以确保培训消耗数据的速度不会超过输入管道生成数据的速度。

谢谢您的回答!当我使用主管进行培训时,我意识到TensorBoard中有一个名为batch/queue/batch/fifo_queue/fraction_of_8_full`的摘要。这是要监控的正确指标吗?特别是,我是否应该监控队列中的此度量是否始终为满,如果队列始终低于满,我是否应该增加
tf.train.batch
中的
num_threads
参数?目前,我看到一个队列偶尔是满的,有时几乎是空的(我每10步做一次计算总结)。在这个例子中推荐什么?另外,一般来说,
tf.train.batch
中的线程数应该等于并行读卡器的数量吗?拥有尽可能多的读卡器和
num_线程
是否有一个折衷办法?如果队列容量有时满,有时空(假设内存可用),您可能只想增加队列容量。输入管道中的更多线程可能不会有太多开销,但您很快就会受到从哪个物理设备读取的限制。如果是这样,您可以考虑在多台机器之间划分数据集。