设置敏捷工作者数量的最佳做法

时间:2018-06-29 10:28:04

标签: dask dask-distributed

在集群上设置工作者时,dask和dask.distributed中使用的不同术语让我有些困惑。

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

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

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

还有其他建议吗?

1 个答案:

答案 0 :(得分:10)

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

通常,如果将较大的节点分成几个进程,每个进程都有多个线程,则它们在大型节点(例如36个内核)上的工作效果最佳。您希望进程数乘以线程数等于核心数。因此,例如,您可以对36核计算机执行以下操作:

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

通常,根据工作负载在这些选择之间做出选择。此处的差异是由于Python的Global Interpreter Lock,它限制了某些数据的并行性。如果您主要使用Python中的Numpy,Pandas,Scikit-Learn或其他数字编程库工作,则无需担心GIL,并且您可能希望更喜欢每个线程数很多的进程。这有帮助,因为它允许数据在内核之间自由移动,因为它们都生活在同一进程中。但是,如果您主要执行纯Python编程,例如处理文本数据,字典/列表/集合,并使用紧密的Python for loops进行大部分计算,那么您将希望拥有许多每个线程数很少的进程。这会产生额外的通信成本,但可以让您绕过GIL。

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