如何在Keras的fit_generator()函数中定义最大队列大小、工作线程数和是否使用多进程?

68

我正在使用 GPU 版本的 Keras 对一个预训练的网络进行迁移学习。我不理解如何定义参数max_queue_sizeworkersuse_multiprocessing。如果我更改这些参数(主要是为了加速学习),我不确定每个 epoch 是否仍然会看到所有数据。

max_queue_size

  • 内部训练队列的最大大小,用于“预缓存”来自生成器的样本

  • 问题:这是指在 CPU 上准备多少批次?它与 workers 如何相关?如何最优地定义它?

workers

  • 并行生成批次的线程数。批次在 CPU 上并行计算,然后即时传递到 GPU 进行神经网络计算

  • 问题:如何找出我的 CPU 可以/应该生成多少个批次并行处理?

use_multiprocessing

  • 是否使用基于进程的线程

  • 问题:如果我更改了 workers,是否必须将此参数设置为 true?它与 CPU 使用率有关吗?

相关问题 可在以下链接中找到:

我正在使用以下代码调用 fit_generator()

    history = model.fit_generator(generator=trainGenerator,
                                  steps_per_epoch=trainGenerator.samples//nBatches,     # total number of steps (batches of samples)
                                  epochs=nEpochs,                   # number of epochs to train the model
                                  verbose=2,                        # verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch
                                  callbacks=callback,               # keras.callbacks.Callback instances to apply during training
                                  validation_data=valGenerator,     # generator or tuple on which to evaluate the loss and any model metrics at the end of each epoch
                                  validation_steps=
                                  valGenerator.samples//nBatches,   # number of steps (batches of samples) to yield from validation_data generator before stopping at the end of every epoch
                                  class_weight=classWeights,                # optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function
                                  max_queue_size=10,                # maximum size for the generator queue
                                  workers=1,                        # maximum number of processes to spin up when using process-based threading
                                  use_multiprocessing=False,        # whether to use process-based threading
                                  shuffle=True,                     # whether to shuffle the order of the batches at the beginning of each epoch
                                  initial_epoch=0)   

我的机器规格是:

CPU : 2xXeon E5-2260 2.6 GHz
Cores: 10
Graphic card: Titan X, Maxwell, GM200
RAM: 128 GB
HDD: 4TB
SSD: 512 GB
1个回答

66

Q_0:

问题:这是否指的是在CPU上准备了多少批次?与工人有什么关系?如何最优地定义它?

从您发布的链接中,您可以了解到,您的CPU会不断创建批次,直到队列达到最大队列大小或到达停止点。您想要为GPU“准备”批次,以使GPU无需等待CPU。 理想的队列大小值应该足够大,以使您的GPU始终接近最大运行速度,并且永远不必等待CPU准备新的批次。

Q_1:

问题:如何找出我的CPU可以/应该并行生成多少个批处理?

如果您发现您的GPU处于闲置状态并正在等待批次,请尝试增加工作人员的数量,也可能增加队列大小。

Q_2:

如果我更改了工作者,我是否必须将此参数设置为true?它是否与CPU使用率有关?

这里是关于在Keras中将其设置为TrueFalse时会发生什么的实际分析。这里建议将其设置为False以防止冻结(在我的设置中,True可以正常工作而不会冻结)。也许其他人可以增进我们对该主题的理解。

总之:

尽量避免顺序设置,尝试使CPU能够提供足够的数据给GPU使用。

另外:下一次您可以创建几个问题,这样回答起来会更容易。


29
非常有帮助,但我不同意问题的提问者应该单独提出这些问题。这些问题是相关的,这一点可以通过你在贡献结尾处进行一句话总结来证明。 - boomkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接