如何在Dask.array中指定worker的数量

时间:2017-02-24 15:50:27

标签: python dask

假设您要在Dask.array中指定工作人员数量,如Dask documentation所示,您可以设置:

dask.set_options(pool=ThreadPool(num_workers)) 

这对我运行的一些模拟非常有效,例如montecarlo,但是通过一些线性代数运算,似乎Dask会覆盖用户指定的配置,例如:

import dask.array as da
import dask
from multiprocessing.pool import ThreadPool

dask.set_options(pool=ThreadPool(num_workers))
mat1 = da.random.random((size, size) chunks=chunk_size)
mat2 = da.random.random((size, size) chunks=chunk_size)
mat3 = mat1.dot(mat2)
mat3.compute()

如果我使用较小的矩阵大小运行该程序,它显然只使用num_workers个工作程序,但如果我增加矩阵大小,突然它会创建十几个工作者,如图所示。 enter image description here

那么,我如何只使用num_workers工作人员请求Dask解决问题?

1 个答案:

答案 0 :(得分:0)

使用线程调度程序时,Dask不会生成任何新进程。相反,它会在您的主要流程中运行所有内容。

但是,这并不会阻止您的函数自己生成进程。正如Mike Graham在评论中指出的那样,你应该注意混合像Dask这样的并行解决方案以及像MKL或OpenBLAS这样的并行BLAS实现。这可能会损害性能。通常最好将两个库中的一个设置为每次调用使用一个线程。

我仍然感到困惑,为什么你会看到多个python进程。据我所知,线程Dask和MKL都没有创建新的计算过程。但是,鉴于MKL线程的数量限制你的积极结果,也许MKL自我上次检查以来已经发生了变化。