当使用dask运行一个测试用例时,我看到400%以上的CPU使用率,即使我以多种方式指定了1个worker。在OSX的活动监视器上,我看到两个进程,一个有1个线程,另一个有8个线程和线程池。我看到2个进程,1个线程和4个线程,single-threaded
。你知道这些线是用来干什么的吗?在
相关:What threads do Dask Workers have active?
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])
Edit:如果我注释掉profilers和ThreadPool导入,那么在指定num_workers=1, scheduler='single-threaded'
之后,我得到了一个有4个线程的进程。在
Dask一次只运行一个任务,但这些任务可以在内部使用多个线程。在您的例子中,这可能是因为BLAS/LAPACK实现是多线程的。在
您可能可以使用
OMP_NUM_THREADS=1
之类的环境变量来控制这一点。根据您的BLAS实现,有更多特定的环境变量。在相关问题 更多 >
编程相关推荐