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

Har*_*ula 8 distributed-computing dask dask-distributed

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

MRo*_*lin 11

这取决于你的工作量

默认情况下,Dask创建的单个进程的线程数与计算机上具有逻辑核心的线程数相同(由确定multiprocessing.cpu_count())。

dask-worker ... --nprocs 1 --nthreads 8  # assuming you have eight cores
dask-worker ...                          # this is actually the default setting
Run Code Online (Sandbox Code Playgroud)

如果您主要处理数字工作负载(例如,在Numpy,Pandas和Scikit-Learn代码中很常见),而这不受Python的全局解释器锁(GIL)的影响,那么使用很少的进程和每个进程使用多个线程是很好的。

但是,如果您花费大量的计算时间来处理诸如字符串或字典之类的纯Python对象,那么您可能希望避免GIL问题,因为要有更多的进程,每个进程具有更少的线程

dask-worker ... --nprocs 8 --nthreads 1
Run Code Online (Sandbox Code Playgroud)

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

dask-worker ... --nprocs 4 --nthreads 2
Run Code Online (Sandbox Code Playgroud)

使用更多的流程可以避免GIL问题,但是由于流程间的通信会增加成本。如果您的计算需要大量的跨工作人员沟通,您将希望避免很多过程。