[英]libraries mkl_rt, openblas, lapack not found while installing scipy - How to change flags for libraries
[英]How do Dask threads interact with OpenBLAS/MKL/…?
根据Dask Workers 有哪些线程处于活动状态? , 一个 dask 工人有
在其中运行任务的线程池。
文档说
如果您的计算本质上主要是数字(例如 NumPy 和 Pandas 计算)并完全释放 GIL,那么建议运行具有多个线程和一个进程的 dask-worker 进程。 这降低了通信成本并且通常简化了部署。
NumPy 的内部使用 MKL 或 OpenBLAS,当代码正常执行时,线程数等于环境变量OPENBLAS_NUM_THREADS
或MKL_NUM_THREADS
。
这些参数和 dask 的计算线程如何协同工作?
糟糕
默认情况下,大多数现代BLAS / LAPACK实现使用与逻辑核心一样多的线程。 Dask也会这样做(假设默认配置)。 如果您正在进行L3 BLAS操作,那么这可能会导致比您拥有内核更多的活动线程,以及性能的普遍降级。
我通常设置XXX_NUM_THREADS=1
并且在将两者结合使用时依赖Dask进行并行操作。
没有回答 dask 线程如何与 BLAS 交互,而是跟进 MRocklin 的回答, threadpoolctl提供了一个很好的接口来控制 BLAS 使用的线程数,并且似乎与 dask 工作人员一起工作得很好。 你可以试试:
import dask.array as da
from threadpoolctl import threadpool_limits
x = da.random.random((1000000,2000), chunks=(5000, -1))
xtx = x.T @ x
with threadpool_limits(limits=1, user_api='blas'):
xtx.compute()
对我来说,使用限制器时速度大约快 15-20%。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.