【发布时间】: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