PyTorch - 33 - PyTorch DataLoader Num_workers - 深度学习速度限制增加

Speeding Up The Training Process

为了加快培训过程,我们将使用DataLoader类的num_workers可选属性。

num_workers属性告诉数据加载器实例要用于数据加载的子进程数。 默认情况下,num_workers值设置为零,零值告诉加载程序在主进程内部加载数据。

这意味着培训过程将在主要过程中按顺序进行。 在训练过程中使用了一批并且需要另一批之后,我们从磁盘读取了批数据。

现在,如果我们有一个工作进程,我们就可以利用我们的机器具有多个内核的事实。 这意味着在主流程准备好另一个批次时,已经可以加载下一个批次并准备好运行。 这就是速度的来源。 批处理使用其他工作进程加载,并在内存中排队。

Optimal Value For The num_workers Attribute

随之而来的自然问题是,我们应该添加多少个工人流程? 这里有很多因素会影响最佳数量,因此找出答案的最佳方法是进行测试。

Testing Values For The num_workers Attribute

要设置此测试,我们将创建一个num_workers值列表以进行尝试。 我们将尝试以下值:

  1. 0(默认)
  2. 1
  3. 2
  4. 4
  5. 8
  6. 16

对于这些值中的每一个,我们将通过尝试以下值来更改批量大小:

  1. 100
  2. 1000
  3. 10000

对于学习率,对于所有运行,我们将其保持在.01的恒定值。

关于此设置的最后一件事要提到的事实是,对于每个运行,我们仅执行一个时期。

好吧,让我们看看我们得到了什么。

Different num_workers Values: Results

好了,我们可以在下面看到我们得到的结果。 我们总共完成了18次运行。 我们有三组不同的批处理大小,并且在每组中,我们都更改了工作进程的数量。
在这里插入图片描述
从这些结果中得出的主要结论是,在所有三个批处理量中,除主要流程外还具有单个工作流程使速度提高了约20%。

快20%!

此外,在第一个工作进程之后添加其他工作进程并没有真正显示出任何进一步的改进。

Interpreting The Results

在添加单个工作进程之后,我们看到的20%的加速是有意义的,因为主进程要做的工作较少。

当主进程忙于执行向前和向后传递时,工作进程正在加载下一批。当主进程准备好进行另一批处理时,工作进程已经在内存中排队了。

结果,主进程不必从磁盘读取数据。相反,数据已经在内存中,这使我们的速度提高了20%。

现在,为什么在增加更多的工人之后我们看不到额外的提速?

Make It Go Faster With More Workers?

如果一个工作人员足以让队列中的主进程充满数据,那么我们将向队列中添加更多批数据将无济于事。我认为这就是我们在这里看到的。

仅仅因为我们将更多批次添加到队列中并不意味着这些批次的处理速度更快。因此,我们受限于向前和向后传播给定批次所需的时间。

我们甚至可以看到,当我们有16个工人时,事情开始陷入困境。

希望这可以帮助您加快速度!

猜你喜欢

转载自blog.csdn.net/weixin_48367136/article/details/112559761