【问题标题】:Tensorflow Dataset API shuffle hurts performance by 9xTensorflow Dataset API shuffle 将性能降低 9 倍
【发布时间】:2018-12-02 23:31:58
【问题描述】:

我正在使用 Tensorflow 数据集 API 来获取一堆文件名;打乱文件名;执行 python 函数来加载图像文件,对其进行预处理,并将它们转换为张量;然后缓存、重复和批处理它们。到目前为止,一切顺利。

当我向张量添加 shuffle() 时,性能会下降 9 倍。同样,当我做self.dataset.apply(tf.data.experimental.shuffle_and_repeat(16384)).

为什么shuffle 会严重影响性能,我该如何解决?

代码:

filenames = tf.data.Dataset.list_files(self.FILE_PATTERN).shuffle(buffer_size=16384)
dataset = filenames.map(lambda filename: self.pp(filename), 
num_parallel_calls=self.N_CPUS)
dataset = dataset.cache("./cachefile")
# The line below (shuffle_and_repeat) made performance very bad (1s/step without, 9s/step with)
# dataset = dataset.apply(tf.data.experimental.shuffle_and_repeat(16384))
# This too:
# dataset = dataset.repeat().shuffle(16384)
# This works fine, but doesn't shuffle:
dataset = dataset.repeat()
dataset = dataset.batch(self.BATCH_SIZE)
dataset = dataset.prefetch(4)

【问题讨论】:

  • 既然你已经洗过一次了,有什么特别的理由要再次洗牌吗?
  • 对于 SGD,我希望它在每个时期都洗牌;也就是说,在repeat之后洗牌。
  • 我认为问题可能是缓存将数据溢出到磁盘而不是内存中。所以它可能会读取缓存文件并将其再次加载到内存中,然后随机播放并重复?您是否尝试过洗牌然后重复而不是重复然后洗牌,尽管融合的操作应该做同样的事情?
  • 您好,这个有答案吗?我在这里遇到了同样的问题。

标签: python performance tensorflow tensorflow-datasets


【解决方案1】:

尝试更改预取参数 buffer_size=2

dataset = dataset.prefetch(2)

prefetch 是一个性能标志,在后台读取下一个数据集以进行下一次迭代。如果 prefetch 的 buffer_size 很大,那么它会创建大量的数据集进行迭代,并且可能由于内存不足而变慢。

【讨论】:

    猜你喜欢
    • 2019-01-28
    • 2023-04-11
    • 2022-11-16
    • 2012-03-08
    • 2020-06-02
    • 2021-01-29
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多