设置 dask worker 数量的最佳实践

Best practices in setting number of dask workers

我对 dask 和 dask.distributed 在集群上设置 workers 时使用的不同术语感到有点困惑。

我遇到的术语是:线程、进程、处理器、节点、工作程序、调度程序。

我的问题是如何设置每个的数量,以及它们之间是否存在严格或推荐关系。例如:

还有其他建议吗?

"node" 人们通常指的是物理机或虚拟机。该节点可以同时 运行 多个程序或进程(就像我的计算机可以同时 运行 网络浏览器和文本编辑器一样)。每个进程都可以在自身内部与许多线程并行化。进程具有独立的内存环境,这意味着在进程内共享数据是免费的,而在进程之间共享数据是昂贵的。

通常情况下,如果您将大型节点(如 36 核)分成几个进程,每个进程都有多个线程,那么事情在较大的节点上运行得最好。您希望进程数乘以线程数等于核心数。因此,例如,您可以对 36 核机器执行类似以下操作:

  • 四个进程,每个进程九个线程
  • 十二个进程,每个进程三个线程
  • 一个进程有三十六个线程

通常,人们会根据工作量在这些选择之间做出决定。这里的区别是由于 Python 的全局解释器锁,它限制了某些类型数据的并行性。如果您主要使用 Numpy、Pandas、Scikit-Learn 或 Python 中的其他数值编程库,那么您无需担心 GIL,并且您可能希望使用的进程较少每个都有很多线程。这很有帮助,因为它允许数据在您的核心之间自由移动,因为它们都存在于同一个进程中。但是,如果您主要进行纯 Python 编程,例如处理文本数据,dictionaries/lists/sets,并在紧凑的 Python for 循环中进行大部分计算,那么您会更喜欢有很多进程,每个进程很少线程。这会产生额外的通信成本,但可以绕过 GIL。

简而言之,如果您主要使用 numpy/pandas-style 数据,请尝试在一个进程中获得至少八个线程左右。否则,可能只在一个进程中使用两个线程。