A3C中增加和减少worker进程的数量有什么好处和坏处?

人工智能 强化学习 深度学习 超参数优化 超参数 a3c
2021-10-26 18:27:51

在 A3C 中,有几个子进程和一个主进程。子进程计算损失和反向传播,如果我理解正确,主进程将它们汇总并更新参数。

但我想知道我应该如何决定要实现的子进程的数量。我认为子进程越多,解开样本之间的相关性越好,但我不确定设置大量子进程有什么弊端。

可能子进程越多,梯度的方差越大,导致学习的不稳定?还是有其他原因?

最后,我应该如何决定子进程的数量?

1个回答

子进程的正确数量取决于您可用的硬件。

简化一点,子进程可以处于两种状态之一:等待内存或磁盘访问,或正在运行。

如果您的问题非常适合您的计算机内存,那么进程将花费几乎所有时间运行。如果它对内存来说太大,他们将需要定期等待磁盘。

每个 CPU 核心应该使用大约 1 个子进程。如果您在 GPU 上进行训练,则取决于该进程是否可以一次使用整个 GPU(在这种情况下,只使用 1 个),或者“进程”是否真的更像一个 CUDA 线程(其中如果您希望每个 CUDA 核心有一个)。

如果您认为您的进程将等待磁盘,请为每个内核使用多个。大约增加 50% 是一个很好的起点。您可以使用top之类的程序来监控 CPU 使用率并相应地调整进程数。

要更明确地回答您的问题:

  • 拥有更多的子进程(在某种程度上,如上所述)将提高硬件利用率,并使您的训练运行得更快。例如,使用 Core i7 CPU,您一次可以运行 8 或 16 个子进程,因此您的训练速度将提高 8-16 倍。
  • 拥有比处理单元(CPU 核心、CUDA 核心)更多的子进程将开始导致频繁的上下文切换,其中处理单元必须暂停以在不同的作业之间进行更改。换工作非常昂贵,最终,您的程序无法比使用所有可用硬件更快地训练。如果您的进程多于处理单元,则减少数量应该会使您的程序训练更快。