【问题标题】:Is Tensorflow Dataset API slower than Queues?Tensorflow 数据集 API 是否比队列慢?
【发布时间】:2017-11-21 00:32:37
【问题描述】:

我将项目中的 CIFAR-10 预处理管道替换为 Dataset API 方法,导致性能下降约 10-20%。

预处理是相当标准的: - 从磁盘读取图像 - 随机/裁剪和翻转 - 洗牌,批量 - 喂给模型

总的来说,我发现批处理现在快了 15%,但每隔一段时间(或者更准确地说,每当我重新初始化数据帧或期望重新洗牌时)批处理都会被阻塞很长时间(30 秒),总计以较慢的 epoch-per-epoch 处理速度。

这种行为似乎与内部散列有关。如果我在 ds.shuffle(buffer_size=N) 中减少 N 延迟会更短,但成比例地更频繁。将所有结果中的 shuffle 移除以延迟,就像将 buffer_size 设置为数据集大小一样。

在读取/缓存方面,有人可以解释 Dataset API 的内部逻辑吗?是否有任何理由期望 Dataset API 比手动创建的队列工作得更快?

我正在使用 TF 1.3。

【问题讨论】:

    标签: performance tensorflow tensorflow-datasets


    【解决方案1】:

    如果您使用tf.data.Dataset API 并使用队列实现相同管道,Dataset 版本的性能应该优于基于队列的版本。

    但是,为了获得最佳性能,需要遵守一些性能最佳做法。我们在performance guide for tf.data 中收集了这些信息。以下是主要问题:

    • 预取很重要:基于队列的管道默认预取,而数据集管道不预取。将dataset.prefetch(1) 添加到管道的末尾将为您提供预取的大部分好处,但您可能需要进一步调整。

    • shuffle 运算符在开始时有一个延迟,同时它会填充其缓冲区。基于队列的管道对所有 epoch 的串联进行混洗,这意味着缓冲区只被填充一次。在数据集管道中,这相当于dataset.repeat(NUM_EPOCHS).shuffle(N)。相比之下,你也可以写dataset.shuffle(N).repeat(NUM_EPOCHS),但这需要在每个epoch中重新开始洗牌。后一种方法更可取(例如,更符合 SGD 的定义),但如果您的数据集很大,则差异可能不会很明显。

      我们正在添加一个不会导致延迟的 shuffle-and-repeat 的融合版本,并且每晚构建的 TensorFlow 将包括自定义的 tf.contrib.data.shuffle_and_repeat() 转换,它等效于 dataset.shuffle(N).repeat(NUM_EPOCHS),但不会受到每个 epoch 开始时的延迟。

    话虽如此,如果您的管道在使用tf.data 时比使用队列慢得多,请将详细信息提交给GitHub issue,我们会看看!

    【讨论】:

      【解决方案2】:

      建议的事情在过去并没有解决我的问题,但我想为那些不想了解队列但仍要充分利用 TF 数据管道的人添加一些建议:

      .

      files = tf.data.Dataset.list_files(data_dir)
      ds = tf.data.TFRecordDataset(files, num_parallel_reads=32)
      ds = (ds.shuffle(10000)
          .repeat(EPOCHS)
          .map(parser_fn, num_parallel_calls=64)
          .batch(batch_size)
      )
      dataset = dataset.prefetch(2)
      

      你必须注意的3个主要组成部分:

      • num_parallel_read=32 并行化磁盘 IO 操作
      • num_parallel_calls=64 并行调用解析器函数
      • prefetch(2)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 2019-12-10
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 2018-06-05
        • 1970-01-01
        相关资源
        最近更新 更多