在设置Dask工作进程数量方面的最佳实践

28

在设置集群上的工作节点时,我对Dask和Dask.distributed中使用的不同术语感到有些困惑。

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

我的问题是如何设置每个工作节点的数量以及它们之间是否存在严格或建议的关系。例如:

  • 每个节点一个工作节点,n个进程用于节点上的n个核心
  • 线程和进程是相同的概念吗?在dask-mpi中,我必须设置nthreads,但它们显示为客户端中的进程

还有其他建议吗?

1个回答

39

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

通常情况下,在更大的节点上运行会更好(例如36个核心的节点),如果您将它们分解成几个进程,每个进程都有多个线程。您希望进程数乘以线程数等于核心数。因此,例如对于36个核心的计算机,您可能会执行以下操作:

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

通常根据工作负载来决定这些选择。这里的差别是由于Python的全局解释器锁(GIL),它限制了某些数据类型的并行性。如果您主要使用Python中的Numpy、Pandas、Scikit-Learn或其他数值编程库,则无需担心GIL,而且可能更喜欢少量进程和每个线程都有很多个线程。这有助于因为它允许数据在您的核之间自由移动,因为它们都存在同一进程中。然而,如果您大部分时间都在进行纯Python编程,比如处理文本数据、字典/列表/集合,并在紧密的Python for循环中进行大部分计算,则需要更喜欢具有较少线程的多个进程。这会产生额外的通信成本,但可以让您绕过GIL。

简而言之,如果您主要使用numpy/pandas样式的数据,请尝试在一个进程中获得至少八个线程。否则,可以在一个进程中仅采用两个线程。


我所说的节点是指HPC上的计算节点。对于我的特定情况,一个节点有16个核心和1个GPU。我想要运行的程序是OpenMM,这是一个用C++编写的分子动力学模拟引擎,并带有Python绑定(因此我假设没有GIL问题)。每个模拟都需要一个GPU,因此每个节点只能进行1个模拟。因此,我应该使用每个节点1个工作进程和16个线程的方式,并使用“--resources"GPU=1"`参数? - kristofarkas
是的,利用工作资源似乎是一个明智的选择。 - MRocklin
如果答案包括“LocalClient”和远程客户端(例如“YarnCluster”)的定义,那将非常有用。我们正在使用一个小集群(6个节点),每个节点都有64个VCores和300GB RAM。但我无法配置“YarnCluster”以使每个“vcore”作为“worker”运行。 - skibee
我有6台拥有12个“逻辑处理器”的“核心”机器。我应该瞄准6或12这个神奇数字吗? - sameagol
这完全取决于您想要运行的计算。这不是关于Dask的问题,而是关于您的代码如何并行运行的问题。例如,NumPy在这里的行为可能与Pandas不同。 - MRocklin
显示剩余2条评论

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