tensorflow - PREFETCH 样本后 TFRecord 读取管道速度减慢

标签 tensorflow tensorflow2.0 tensorflow-datasets tf.keras

我已将训练数据分成多个 tf-record 文件,并使用这段代码读取它们:

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(dataset)。

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

最佳答案

如果不了解更多详细信息(存储后端、记录大小、每个文件的记录数、文件数、_parse_image_function 中的任何 io 操作?,...),这有点难以诊断

我的第一个怀疑是 tf.data.TFRecordDataset(filenames) - 在下一个文件之后打开一个文件可能会导致延迟峰值,从而可能暂时导致数据集 CPU 管道不足。 (多个较小的文件从自动预读中获得的好处也可能较低)

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

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

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

关于tensorflow - PREFETCH 样本后 TFRecord 读取管道速度减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60754151/

相关文章:

tensorflow - 为什么在layers.Embedding中需要input_length在keras tensorflow中?

tensorflow - 在 tensorflow 2 中,什么成为图形的一部分,什么不是?

图模式的 TensorFlow 2 文档

python - 如何将检查点转换为.pb模型以进行模型部署?

machine-learning - Tensorflow 在文本生成期间更改 RNN 的批量大小

tensorflow - 将模型保存在 gpflow 2 中

tensorflow - Keras image_dataset_from_directory 未找到图像

python - 如何将 jpeg 数据加载、标记和馈送到 Tensorflow 中?

python - tf.data 内存泄漏

python - 将迭代器馈送到 Tensorflow Graph