Dask 线程如何与 OpenBLAS/MKL/... 交互?
How do Dask threads interact with OpenBLAS/MKL/…?
根据 ,一个 dask worker
A pool of threads in which to run tasks.
If your computations are mostly numeric in nature (for example NumPy and Pandas computations) and release the GIL entirely then it is advisable to run dask-worker processes with many threads and one process. This reduces communication costs and generally simplifies deployment.
NumPy内部使用MKL或OpenBLAS,正常执行代码时线程数等于env变量OPENBLAS_NUM_THREADS
或MKL_NUM_THREADS
这些参数和 dask 的计算线程如何协同工作?
简答
差
更长的答案
默认情况下,大多数现代 BLAS/LAPACK 实现使用与逻辑内核一样多的线程。 Dask 会做同样的事情(假设默认配置)。如果您正在执行 L3 BLAS 操作,那么这可能会导致比您拥有的内核更多的活动线程,以及性能的普遍下降。
我通常设置 XXX_NUM_THREADS=1
并在同时使用两者时依靠 Dask 实现并行性。
没有回答 如何 dask 线程与 BLAS 交互,但跟进 MRocklin 的回答,threadpoolctl 提供了一个很好的接口来控制 BLAS 使用的线程数,并且似乎与 dask worker 一起工作得很好。你可以试试:
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%。
根据
A pool of threads in which to run tasks.
If your computations are mostly numeric in nature (for example NumPy and Pandas computations) and release the GIL entirely then it is advisable to run dask-worker processes with many threads and one process. This reduces communication costs and generally simplifies deployment.
NumPy内部使用MKL或OpenBLAS,正常执行代码时线程数等于env变量OPENBLAS_NUM_THREADS
或MKL_NUM_THREADS
这些参数和 dask 的计算线程如何协同工作?
简答
差
更长的答案
默认情况下,大多数现代 BLAS/LAPACK 实现使用与逻辑内核一样多的线程。 Dask 会做同样的事情(假设默认配置)。如果您正在执行 L3 BLAS 操作,那么这可能会导致比您拥有的内核更多的活动线程,以及性能的普遍下降。
我通常设置 XXX_NUM_THREADS=1
并在同时使用两者时依靠 Dask 实现并行性。
没有回答 如何 dask 线程与 BLAS 交互,但跟进 MRocklin 的回答,threadpoolctl 提供了一个很好的接口来控制 BLAS 使用的线程数,并且似乎与 dask worker 一起工作得很好。你可以试试:
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%。