设置dask员工数量的最佳实践

设置dask员工数量的最佳实践,dask,dask-distributed,Dask,Dask Distributed,在集群上设置worker时,dask和dask.distributed中使用的不同术语让我有点困惑 我遇到的术语是:线程、进程、处理器、节点、工作者、调度器 我的问题是如何设置每个的数量,以及它们之间是否存在严格的或推荐的关系。例如: 每个节点1个工作进程,节点上的n个核有n个进程 线程和进程是同一个概念吗?在dask mpi中,我必须设置nthreads,但它们在客户机中显示为进程 还有其他建议吗?“节点”通常指的是物理或虚拟机。该节点可以同时运行多个程序或进程(就像我的计算机可以同时运行

在集群上设置worker时,dask和dask.distributed中使用的不同术语让我有点困惑

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

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

  • 每个节点1个工作进程,节点上的n个核有n个进程
  • 线程和进程是同一个概念吗?在dask mpi中,我必须设置nthreads,但它们在客户机中显示为进程
还有其他建议吗?

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

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

  • 四个进程,每个进程有九个线程
  • 十二个进程,每个进程有三个线程
  • 一个进程有三十六个线程
通常,根据工作负载在这些选择之间做出决定。这里的区别是由于Python的全局解释器锁,它限制了某些类型数据的并行性。如果您主要使用Numpy、Pandas、Scikit Learn或Python中的其他数值编程库,那么您不必担心GIL,并且您可能希望选择几个进程,每个进程都有许多线程。这很有帮助,因为它允许数据在核心之间自由移动,因为它们都生活在同一个过程中。然而,如果您主要是在进行纯Python编程,比如处理文本数据、字典/列表/集合,以及在紧凑的Python for循环中进行大部分计算,那么您会希望拥有多个进程,每个进程的线程数较少。这会产生额外的通信成本,但可以绕过GIL


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

我所说的节点是指HPC上的计算节点。对于我的特殊情况,一个节点有16个内核和1个GPU。我想运行的程序是OpenMM,一个用C++编写的分子动力学模拟引擎,用Python绑定(因此我假设没有吉尔问题)。每个模拟都需要一个GPU,因此每个节点需要一个模拟。因此,我应该在
--resources“GPU=1”
中使用每个节点1个进程和16个线程的工作线程?是的,使用工作线程资源似乎是一个明智的选择如果答案包括
LocalClient
和远程客户端(例如
Yancluster
)的定义,它将非常有用。我们使用的是一个小型集群(有6个节点),而每个节点有64个vCore和300GB RAM。我无法配置
yancluster
worker
的身份运行每个
vcore
。我有6台带有12个“逻辑处理器”的“核心”计算机。我应该为神奇的数字6还是12而努力吗?这完全取决于你想要运行的计算。这不是关于达斯克的问题。这是一个关于代码如何并行运行的问题。例如,努比在这里的行为可能与熊猫不同。