设置dask worker数量的最佳实践

kri*_*kas 14 dask dask-distributed

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

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

我的问题是如何设置每个的数量,以及其中任何一个之间是否存在严格或建议的关系.例如:

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

还有其他建议吗?

MRo*_*lin 14

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

通常情况下,如果将它们切割成几个进程,每个进程都有多个线程,那么它们在较大的节点(如36个核心)上效果最佳.您希望进程数乘以线程数等于核心数.例如,对于36核机器,您可能会执行以下操作:

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

通常,根据工作负载决定这些选择.这里的不同之处在于Python的Global Interpreter Lock,它限制了某些类型数据的并行性.如果您主要使用Numpy,Pandas,Scikit-Learn或Python中的其他数值编程库,那么您不需要担心GIL,并且您可能希望优先选择几个具有多个线程的进程.这有帮助,因为它允许数据在您的内核之间自由移动,因为它们都在同一个进程中.但是,如果您正在进行大多数纯Python编程,例如处理文本数据,字典/列表/集合,以及在紧密的Python for循环中执行大部分计算,那么您将希望拥有许多每个线程很少的进程.这会产生额外的通信费用,但允许您绕过GIL.

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