繁体   English   中英

Dask 线程如何与 OpenBLAS/MKL/...交互?

[英]How do Dask threads interact with OpenBLAS/MKL/…?

根据Dask Workers 有哪些线程处于活动状态? , 一个 dask 工人有

在其中运行任务的线程池。

文档

如果您的计算本质上主要是数字(例如 NumPy 和 Pandas 计算)并完全释放 GIL,那么建议运行具有多个线程和一个进程的 dask-worker 进程。 这降低了通信成本并且通常简化了部署。

NumPy 的内部使用 MKL 或 OpenBLAS,当代码正常执行时,线程数等于环境变量OPENBLAS_NUM_THREADSMKL_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM