假设您要在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
个工作程序,但如果我增加矩阵大小,突然它会创建十几个工作者,如图所示。
那么,我如何只使用num_workers
工作人员请求Dask解决问题?
答案 0 :(得分:0)
使用线程调度程序时,Dask不会生成任何新进程。相反,它会在您的主要流程中运行所有内容。
但是,这并不会阻止您的函数自己生成进程。正如Mike Graham在评论中指出的那样,你应该注意混合像Dask这样的并行解决方案以及像MKL或OpenBLAS这样的并行BLAS实现。这可能会损害性能。通常最好将两个库中的一个设置为每次调用使用一个线程。
我仍然感到困惑,为什么你会看到多个python进程。据我所知,线程Dask和MKL都没有创建新的计算过程。但是,鉴于MKL线程的数量限制你的积极结果,也许MKL自我上次检查以来已经发生了变化。