使用 tensorflow 和 keras 并行化数据准备
Parallelize data preparation with tensorflow and keras
我正在使用 Tensorflow Keras 在 GPU 上训练 LSTM 模型。在调用 model.fit()
开始训练之前,大约需要 30 分钟才能开始训练过程。我认为在这一时期它使用 CPU 的一个核心来准备数据。我对么?如果是,我如何使用多核并行化此数据准备过程?
如果您使用 tf.data.Dataset()
准备数据,则可以在准备数据集时利用一些参数。
- 例如,在你的
.map()
函数中,将num_parallel_calls
参数设置为num_parallel_calls=tf.data.experimental.AUTOTUNE
;通过这种方式,它将允许您的程序自动选择 CPU 个核心数来准备数据集。
- 如果使用
.batch().shuffle()
也可以提高速度
按照这个顺序,而不是 shuffle().batch()
这个顺序。在第一种情况下,你拿了一批数据集并打乱了其中的元素;在第二种情况下,在对整个数据集进行洗牌后,您 batch()
在您的数据集上。人们可以很容易地看出,对一个巨大的数据集进行洗牌会导致花费更多的时间,而不是按此顺序进行批处理和洗牌。
- 让我们再看一个案例(与实际训练过程相关)(不是你的案例,因为数据集准备是
在您的情况下非常耗时):
prefetch()
操作。
在这种情况下,GPU 在等待 CPU
获取另一批数据。实际上,当反向传播
完成一批后的权重更新,GPU立即
消耗另一批数据。为简单起见,还将其值设置为 tf.data.experimental.AUTOTUNE
.
我正在使用 Tensorflow Keras 在 GPU 上训练 LSTM 模型。在调用 model.fit()
开始训练之前,大约需要 30 分钟才能开始训练过程。我认为在这一时期它使用 CPU 的一个核心来准备数据。我对么?如果是,我如何使用多核并行化此数据准备过程?
如果您使用 tf.data.Dataset()
准备数据,则可以在准备数据集时利用一些参数。
- 例如,在你的
.map()
函数中,将num_parallel_calls
参数设置为num_parallel_calls=tf.data.experimental.AUTOTUNE
;通过这种方式,它将允许您的程序自动选择 CPU 个核心数来准备数据集。 - 如果使用
.batch().shuffle()
也可以提高速度 按照这个顺序,而不是shuffle().batch()
这个顺序。在第一种情况下,你拿了一批数据集并打乱了其中的元素;在第二种情况下,在对整个数据集进行洗牌后,您batch()
在您的数据集上。人们可以很容易地看出,对一个巨大的数据集进行洗牌会导致花费更多的时间,而不是按此顺序进行批处理和洗牌。 - 让我们再看一个案例(与实际训练过程相关)(不是你的案例,因为数据集准备是
在您的情况下非常耗时):
prefetch()
操作。 在这种情况下,GPU 在等待 CPU 获取另一批数据。实际上,当反向传播 完成一批后的权重更新,GPU立即 消耗另一批数据。为简单起见,还将其值设置为tf.data.experimental.AUTOTUNE
.