【问题标题】:Tensorflow data pipeline with from_generator is not producing data fast enough带有 from_generator 的 TensorFlow 数据管道生成数据的速度不够快
【发布时间】:2020-01-02 16:14:23
【问题描述】:

我正在使用 tf.data.Dataset 构建训练管道,但我似乎无法获得速度。我在管道中使用 from_generator (见下文),我怀疑 python 全局锁是问题的一部分。我正在努力找出一种可以加快速度的设计。我在交错中尝试了 num_parallel_calls、cycle_length、block_length 的不同变体,但它们似乎都没有帮助。欣赏任何见解。

Tensorflow 2.0,默认 Eager 模式。

管道 - 读取 TFRecords 并将数据提供给训练

我有两个生成器函数,我覆盖它们以分散工作负载。

  • generator_step1 - 加载 tf_record 文件,使用 map 解析数据
  • generator_step2 - 处理数据并产生批量数据

管道伪代码

dataset = tf.data.Dataset.from_tensor_slices(tf_records_files_list)

dataset = dataset.interleave(lambda x: tf.data.Dataset.from_generator(generator_step1, 
                                output_types=(tf.string, tf.float32), args=(x,batch_size,)),
                                cycle_length=2,
                                block_length=1)

dataset = dataset.interleave(lambda arg1, arg2: tf.data.Dataset.from_generator(generator_step2, 
                                output_types=(tf.float32, tf.int16), args=(arg1, arg2,)),
                                cycle_length=2,
                                block_length=1)

dataset = dataset.prefetch(5)


这在一台功能强大的机器上运行,我认为 I/O 或 CPU 不是瓶颈。关于如何进一步改进或优化这一点的任何想法?欣赏任何见解。

【问题讨论】:

  • 如果您有足够的 RAM,您可以使用ds.cache 将数据加载到 RAM 中或将其缓存到文件中。
  • 我有足够的 RAM,但不足以缓存所有数据。我有 128GB 的​​ RAM,数据是数百 GB,所以这不是一个选择。我希望可以以最小的延迟设计管道,但我无法让它提供一致的速度。

标签: tensorflow tensorflow-datasets


【解决方案1】:

好的,我认为你的设计不是最优的。首先创建一个tf.dataset,然后为每个批次创建另一个tf.dataset,这会产生大量开销。而不是interleave,我建议使用.map。因此,您必须将生成器重写为一次返回 一个 样本的函数。之后你应该通过tf.data 进行批处理。此外,您应该在映射函数中使用 tensorflow 函数(例如 tf.image.decode_iamge)。

dataset = tf.data.Dataset.from_tensor_slices(tf_records_files_list)

dataset = dataset.map(load_func, num_parralel_calls=24)   

dataset = dataset.map(preprocess_func, num_parralel_calls=24)

dataset = dataset.batch(batch_size).prefetch(5)

这应该可以完成工作。

【讨论】:

  • 非常感谢。我会试试这个。在我的映射函数中,我需要修剪/处理大型数组以创建批处理。它不是图像数据,而是多维离散数据。一旦我将它们移动到地图上,我将尝试查看是否有任何我可以利用的 tf 函数。如果您有任何指示,请告诉我。感谢您的帮助。
  • 请更详细地描述您的数据,并提供示例实现。此外,如果对您有所帮助,请不要忘记将答案标记为正确。
  • 我试图创建一个示例实现,但它变得太复杂了。我遇到的麻烦是在可以生成多个批次的函数上使用 map。我们的 tfrecords 中有多个样本,因此在我们的处理函数中,我们根据训练标准创建批量数据。一个 TFRecord 文件可以创建多个批次,我们使用生成器来做到这一点。但是对于地图,我们不能使用生成器。关于如何看待它的任何想法? TFFile 有多个样本(每个样本为 2048x100x500 ) load_fn 加载 TFRecord 文件 process_fn - 数组的基本操作,创建多个批次
猜你喜欢
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2020-07-26
  • 2019-02-06
相关资源
最近更新 更多