【发布时间】:2022-01-12 18:38:35
【问题描述】:
我正在尝试按照Better performance with the tf.data API 指南提高我的模型训练性能。但是,我观察到,与没有.cache() 的相同设置相比,使用.cache() 的性能几乎相同甚至更差。
datafile_list = load_my_files()
RAW_BYTES = 403*4
BATCH_SIZE = 32
raw_dataset = tf.data.FixedLengthRecordDataset(filenames=datafile_list, record_bytes=RAW_BYTES, num_parallel_reads=10, buffer_size=1024*RAW_BYTES)
raw_dataset = raw_dataset.map(tf.autograph.experimental.do_not_convert(decode_and_prepare),
num_parallel_calls=tf.data.AUTOTUNE)
raw_dataset = raw_dataset.cache()
raw_dataset = raw_dataset.shuffle(buffer_size=1024)
raw_dataset = raw_dataset.batch(BATCH_SIZE)
raw_dataset = raw_dataset.prefetch(tf.data.AUTOTUNE)
datafile_list 中的数据为 9.92GB,相当适合系统可用的总物理 RAM (100GB)。系统交换已禁用。
通过使用数据集训练模型:
model = build_model()
model.fit(raw_dataset, epochs=5, verbose=2)
结果:
Epoch 1/5
206247/206247 - 126s - loss: 0.0043 - mae: 0.0494 - mse: 0.0043
Epoch 2/5
206247/206247 - 125s - loss: 0.0029 - mae: 0.0415 - mse: 0.0029
Epoch 3/5
206247/206247 - 129s - loss: 0.0027 - mae: 0.0397 - mse: 0.0027
Epoch 4/5
206247/206247 - 125s - loss: 0.0025 - mae: 0.0386 - mse: 0.0025
Epoch 5/5
206247/206247 - 125s - loss: 0.0024 - mae: 0.0379 - mse: 0.0024
这个结果令人沮丧。由docs:
第一次迭代数据集时,其元素将缓存在指定文件或内存中。后续迭代将使用缓存的数据。
来自this guide:
当迭代这个数据集时,由于缓存,第二次迭代将比第一次快得多。
但是,所有 epoch 所用的时间几乎相同。此外,在训练期间,CPU 和 GPU 的使用率都非常低(见下图)。
通过注释掉raw_dataset = raw_dataset.cache() 行,结果没有显示出任何显着差异:
Epoch 1/5
206067/206067 - 129s - loss: 0.0042 - mae: 0.0492 - mse: 0.0042
Epoch 2/5
206067/206067 - 127s - loss: 0.0028 - mae: 0.0412 - mse: 0.0028
Epoch 3/5
206067/206067 - 134s - loss: 0.0026 - mae: 0.0393 - mse: 0.0026
Epoch 4/5
206067/206067 - 127s - loss: 0.0024 - mae: 0.0383 - mse: 0.0024
Epoch 5/5
206067/206067 - 126s - loss: 0.0023 - mae: 0.0376 - mse: 0.0023
正如文档中所指出的,我的期望是使用缓存会导致训练时间大大加快。我想知道我做错了什么。
附件
使用缓存进行训练期间的 GPU 使用情况:
在没有缓存的情况下训练期间的 GPU 使用情况:
使用缓存进行训练期间的系统统计信息(内存、CPU 等):
无缓存训练期间的系统统计信息(内存、CPU 等):
【问题讨论】:
-
cache只有在读取和处理数据成为训练瓶颈时才会有所作为。如果数据在没有缓存的情况下已经足够快地提供给模型,那么它不会有任何影响。
标签: python tensorflow tensorflow2.0 tensorflow-datasets