Dask.distributed集群中每个节点仅占用1核问题求助
解决Dask分布式在Slurm集群中每个节点仅用1核的问题
我来帮你分析下这个问题——这其实是Slurm和Dask Worker默认配置不匹配导致的常见坑,咱们一步步拆解解决:
问题根源
你当前用srun启动Dask Worker时,没有指定资源分配参数,也没有配置Worker的并行度:
- Slurm默认行为:
srun默认每个任务只分配1个CPU核心。 - Dask Worker默认行为:默认只启动1个工作进程(
--nworkers=1)且每个进程仅用1个线程(--nthreads=1)。
两者叠加下来,每个节点自然只会用到1核。
而单节点用dask.threaded时,这个调度器默认会创建和CPU核数一致的线程数,所以能充分利用多核——这和分布式Worker的配置逻辑是完全分开的,和GIL关系不大(毕竟你是用subprocess调用外部C++程序,Python线程会释放GIL,不会阻塞并行)。
解决方案:匹配Slurm资源与Dask Worker配置
你需要明确告诉Slurm分配多少核心给每个Worker,同时让Dask Worker启动对应数量的工作进程/线程。根据你的20核节点,推荐两种配置方式:
方式1:单Worker进程+多线程(适合IO/外部调用场景)
让Slurm分配20核,同时Dask Worker启动20个线程:
# 先启动调度器(分开两个screen命令,避免原命令的语法问题) screen -d -m dask-scheduler --scheduler-file scheduler.json # 启动Worker,指定Slurm资源和Dask线程数 screen -d -m srun --cpus-per-task=20 dask-worker --scheduler-file scheduler.json --nthreads 20
方式2:多Worker进程+单线程(适合CPU密集型外部程序)
让Slurm分配20核,Dask Worker启动20个独立进程,每个进程用1线程:
screen -d -m dask-scheduler --scheduler-file scheduler.json screen -d -m srun --cpus-per-task=20 dask-worker --scheduler-file scheduler.json --nworkers 20 --nthreads 1
额外建议
- 检查Worker日志:启动后可以查看Worker的日志输出,确认是否显示
nthreads=20或nworkers=20,验证配置是否生效。 - 避免命令语法问题:原命令把
scheduler和srun worker放在同一个screen命令里,这会导致第二个命令在调度器启动后才执行,但最好分开成两个独立的screen -d -m命令,避免意外。 - 指定临时目录:如果Slurm节点的临时空间有限,可以给Worker加上
--local-directory /path/to/your/tmp参数,避免临时文件溢出。
内容的提问来源于stack exchange,提问作者Aratz
相关产品推荐
相关产品推荐

