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

Posted

技术标签:

【中文标题】我们如何在 dask 分布式中为每个工作人员选择 --nthreads 和 --nprocs?【英文标题】:how do we choose --nthreads and --nprocs per worker in dask distributed? 【发布时间】:2018-08-30 14:40:42 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这取决于你的工作量

默认情况下,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 的 Global解释器锁 (GIL)。

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

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

基于基准测试,您可能会发现更平衡的拆分更好

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

使用更多进程可以避免 GIL 问题,但会因进程间通信而增加成本。如果您的计算需要大量的工作间通信,您可能希望避免许多进程。

【讨论】:

以上是关于我们如何在 dask 分布式中为每个工作人员选择 --nthreads 和 --nprocs?的主要内容,如果未能解决你的问题,请参考以下文章

Dask Worker 进程内存不断增长

如何在 Dask 中停止正在运行的任务?

Dask分布式中如何高效提交大参数任务?

如何使用分布式 Dask 和预训练的 Keras 模型进行模型预测?

dask分布式数据帧上的慢len函数

在 dask 产生的进程中调用 dask