Tensorflow TFRecord读取管道在预取样本后变慢

Tensorflow TFRecord读取管道在预取样本后变慢,tensorflow,tensorflow2.0,tensorflow-datasets,tf.keras,Tensorflow,Tensorflow2.0,Tensorflow Datasets,Tf.keras,我已将我的训练数据划分为多个tf记录文件,并使用以下代码读取它们: SHUFFLE_BUFFER = 64 PREFETCH = 256 dataset = tf.data.TFRecordDataset(filenames) dataset = dataset.shuffle(SHUFFLE_BUFFER) dataset = dataset.map(_parse_image_function, num_parallel_calls=tf.data.experimental.AUTOTUNE

我已将我的训练数据划分为多个tf记录文件,并使用以下代码读取它们:

SHUFFLE_BUFFER = 64
PREFETCH = 256
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.shuffle(SHUFFLE_BUFFER) 
dataset = dataset.map(_parse_image_function, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset = dataset.batch(BATCH_SIZE)
dataset = dataset.prefetch(PREFETCH)
dataset = dataset.repeat()
此数据集直接提供给model.fit(数据集)

第一批预取样本加载速度很快,GPU利用率始终保持在80%以上。然而,在这之后,快速读取似乎停止了,GPU利用率下降,训练时间大幅放缓。
有人知道可能出了什么问题吗?

如果不知道更多详细信息(存储后端、记录大小、每个文件的记录数、文件数、_parse_image_函数中的任何io操作等),就很难诊断出这一问题

我的第一个怀疑是tf.data.TFRecordDataset(文件名)——在下一个文件之后打开一个文件可能会导致延迟峰值,这可能会暂时耗尽数据集cpu管道。(多个较小的文件也可能从自动读取头中获益较少)

我将尝试在tf.data.TFRecordDataset(文件名)之后添加一个额外的预取,以解耦IO(并可能交错来自不同文件的记录(num_parallel_reads参数))

如果预取没有帮助,我会尝试硬编码num_parallel_调用(主要是因为我还没有读取自动调谐代码-如果管道需要的并行度超过默认并行度,可能会使用私有线程池)


取决于您的存储后端-一旦训练速度减慢(用于测试/优化数据集),重复训练就会重新启动,这可能只是从各种缓存中提取数据,并且一旦使用的数据集超过缓存,重复训练就会减慢。

。我建议您每晚安装tf,并使用该分析器查看代码中的瓶颈,然后集中精力减少这些瓶颈。非常感谢您的回答!我一直在玩弄你提出的建议,但要想为每件事找到合适的环境一直是一个挑战。最后,我使用iotop、htop和nvidia smi来发现可能的瓶颈,并使用这些来优化管道。您的答案中没有包括的另一个参数是启用tf记录压缩,它确实加快了我的数据传输速度:)您好@rmeertens,您能分享哪些参数帮助您改进了这个问题吗?我也面临着类似的问题。谢谢