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

how do we choose --nthreads and --nprocs per worker in dask distributed?

我们如何在 Dask 分布式中为每个工人选择 --nthreads--nprocs?我有 3 个工作人员,2 个工作人员有 4 个内核,每个内核有一个线程,1 个工作人员有 8 个内核(根据每个工作人员 lscpu Linux 命令的输出)。

这取决于你的工作量

默认情况下,Dask 创建一个进程,其线程数与计算机上的逻辑核心数一样多(由 multiprocessing.cpu_count() 确定)。

dask-worker ... --nprocs 1 --nthreads 8  # assuming you have eight cores
dask-worker ...                          # this is actually the default setting

如果您主要处理 数字 工作负载,例如在 Numpy、Pandas 和 Scikit-Learn 代码,它不受 Python 的全局解释器锁 (GIL) 的影响。

但是,如果您将大部分计算时间花在操纵纯 Python 对象(例如字符串或字典)上,那么您可能希望通过使用更多进程和更少的线程来避免 GIL 问题

dask-worker ... --nprocs 8 --nthreads 1

根据基准测试,您可能会发现更平衡的分配更好

dask-worker ... --nprocs 4 --nthreads 2

使用更多进程可避免 GIL 问题,但会因 inter-process 通信而增加成本。如果您的计算需要大量 inter-worker 通信,您会希望避免许多进程..