dask - 设置 Dask Worker 数量的最佳实践

标签 dask dask-distributed

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

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

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

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

还有其他建议吗?

最佳答案

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

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

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

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

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

关于dask - 设置 Dask Worker 数量的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51099685/

相关文章:

python - 我可以在 Dask/Distributed 中使用从 .py 文件导入的函数吗?

python - 从 Dask DataFrame 中删除列数不相等的行

python - Dask bag 到 Dataframe 问题

Dask Distributed - 相同的持久数据多个客户端

dask - 添加/启用时间戳到 Dask 调度程序/工作人员控制台日志

distributed-computing - 我们如何在 dask 分布式中为每个工作人员选择 --nthreads 和 --nprocs?

python - 多列 Groupby 大小的 Dask 过滤器数据框

python - 如何让自适应 dask worker 在启动时运行一些代码?

dask - 本地 Dask worker 无法连接到本地调度程序

python-3.6 - 使用 xarray dask apply_ufunc 时避免内存溢出