dask worker 在线程调度程序中使用多少个线程?
How many threads does a dask worker use in a threaded scheduler?
当 运行 一个带有 dask 的测试用例时,我看到 400%+ CPU 使用率,即使我以多种方式指定 1 个工人。在 OSX 中的 Activity 监视器上,我看到 2 个进程,一个有 1 个线程,另一个有 8 个线程和 ThreadPool。我看到 2 个进程、1 个线程和 4 个线程 single-threaded
。知道所有这些线程的用途吗?
相关:
import dask
import dask.array as da
from dask.diagnostics import Profiler, ResourceProfiler, CacheProfiler, visualize
from multiprocessing.pool import ThreadPool
def main():
a = da.random.random(size=(20000, 1000), chunks=(1000, 1000))
q, r = da.linalg.qr(a)
a2 = q.dot(r)
out = a2.compute()
if __name__ == "__main__":
with Profiler() as prof, ResourceProfiler(dt=0.25) as rprof:
#with dask.config.set(pool=ThreadPool(1)):
#with dask.config.set(num_workers=1): # 1 worker, 400% usage
#with dask.config.set(num_workers=1, scheduler='single-threaded'): # 1 worker, 400% usage
with dask.config.set(pool=ThreadPool(1)): # 1 worker, 400% usage
main()
visualize([prof, rprof])
编辑:如果我注释掉探查器和 ThreadPool 导入,我在指定 num_workers=1, scheduler='single-threaded'
后得到 1 个进程和 4 个线程。
Dask 一次只能 运行 一个任务,但这些任务可以在内部使用多个线程。在您的情况下,这可能是因为您的 BLAS/LAPACK 实现是多线程的。
您可能可以使用 OMP_NUM_THREADS=1
等环境变量来控制它。根据您的 BLAS 实现,还有更具体的环境变量。
当 运行 一个带有 dask 的测试用例时,我看到 400%+ CPU 使用率,即使我以多种方式指定 1 个工人。在 OSX 中的 Activity 监视器上,我看到 2 个进程,一个有 1 个线程,另一个有 8 个线程和 ThreadPool。我看到 2 个进程、1 个线程和 4 个线程 single-threaded
。知道所有这些线程的用途吗?
相关:
import dask
import dask.array as da
from dask.diagnostics import Profiler, ResourceProfiler, CacheProfiler, visualize
from multiprocessing.pool import ThreadPool
def main():
a = da.random.random(size=(20000, 1000), chunks=(1000, 1000))
q, r = da.linalg.qr(a)
a2 = q.dot(r)
out = a2.compute()
if __name__ == "__main__":
with Profiler() as prof, ResourceProfiler(dt=0.25) as rprof:
#with dask.config.set(pool=ThreadPool(1)):
#with dask.config.set(num_workers=1): # 1 worker, 400% usage
#with dask.config.set(num_workers=1, scheduler='single-threaded'): # 1 worker, 400% usage
with dask.config.set(pool=ThreadPool(1)): # 1 worker, 400% usage
main()
visualize([prof, rprof])
编辑:如果我注释掉探查器和 ThreadPool 导入,我在指定 num_workers=1, scheduler='single-threaded'
后得到 1 个进程和 4 个线程。
Dask 一次只能 运行 一个任务,但这些任务可以在内部使用多个线程。在您的情况下,这可能是因为您的 BLAS/LAPACK 实现是多线程的。
您可能可以使用 OMP_NUM_THREADS=1
等环境变量来控制它。根据您的 BLAS 实现,还有更具体的环境变量。