Python 如何指定Dask.array中的工作进程数
假设要指定Dask.array中的工作进程数,如图所示,可以设置:Python 如何指定Dask.array中的工作进程数,python,dask,Python,Dask,假设要指定Dask.array中的工作进程数,如图所示,可以设置: 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=Th
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
workers,但是如果我增加矩阵大小,它会突然创建十几个worker,如图所示
那么,我如何才能请求Dask仅使用
num_workers
workers来解决问题呢?使用线程调度程序时,Dask不会产生任何新进程。相反,它运行主进程中的所有内容
但是,这并不能阻止函数本身生成进程。正如Mike Graham在评论中指出的那样,在混合使用诸如Dask之类的并行解决方案和诸如MKL或OpenBLAS之类的并行BLAS实现时应该小心。这可能会损害性能。通常最好将两个库中的一个设置为每次调用使用一个线程
我仍然不明白为什么会看到多个python进程。就我所知,线程Dask和MKL都没有创建新的计算过程。但是,鉴于您限制MKL线程数量的积极结果,自我上次使用MKL签入以来,MKL可能已经发生了变化。您是否针对线程BLAS编译numpy?如果是这样,每个dask工作者可能会产生自己的工作者
pstree
可能会帮助您更好地了解生成层次结构。是的!我用的是Intelpython,所以numpy链接到MKL,你是对的!我限制了MKL线程的数量,如中所示,问题就解决了。非常感谢你!