我在Slurm超级计算机上使用Dask Jobequeue。我的工作负载包括线程(即numpy)和python工作负载的混合,因此我认为线程和进程的平衡对于我的部署(这是默认行为)是最好的。但是,为了运行作业,我需要使用以下基本配置:
cluster = SLURMCluster(cores=20,
processes=1,
memory="60GB",
walltime='12:00:00',
...
)
cluster.adapt(minimum=0, maximum=20)
client = Client(cluster)
这是完全线程化的。这些任务所花费的时间似乎比我天真地预期的要长(其中很大一部分是大量的文件读/写)。切换到纯流程,即
cluster = SLURMCluster(cores=20,
processes=20,
memory="60GB",
walltime='12:00:00',
...
)
结果是slurm作业在启动时会立即被slurm杀死,其输出如下:
slurmstepd: error: *** JOB 11116133 ON nid00201 CANCELLED AT 2021-04-29T17:23:25 ***
选择平衡配置(即默认配置)
cluster = SLURMCluster(cores=20,
memory="60GB",
walltime='12:00:00',
...
)
导致一种奇怪的中间行为。任务将在接近完成时运行(即900/1000个工作任务),然后一些工人将被杀死,进度将下降到400/1000个任务
你有什么想法吗
在这台特定的机器上,系统管理员告诉我,对于多核(非MPI,例如python多处理),应该使用
srun -n 1 -c 20 python ...
否则,进程将在单个内核上运行。所以在我的集群配置中
cluster = SLURMCluster(
...
python='srun -n 1 -c 20 python',
...
)
我的猜测是,使用dask线程/进程之间的差异应该会影响这一点,因为我们仍然希望将所有20个内核分配给该作业
此外,我需要加载一个模块,该模块使许多编译工具可用,但不幸的是还更改了PYTHONPATH
。我(根本不是理想的)解决方法是:
cluster = SLURMCluster(
...
env_extra=[
'module load mymodule',
'unset PYTHONPATH',
'source /home/$(whoami)/.bashrc',
'conda activate mycondaenv'
],
...
)
这似乎成功地确保了上面调用的python
与我用来启动dask作业的mycondaenv
环境相同
编辑:
按照@SultanOrazbayev的建议,我查看了失败作业ID的Slurm作业信息。它们都导致:
slurm_load_jobs error: Invalid job id specified
此外,我发现使用cluster.scale
而不是cluster.adapt
会导致工作的成功运行。也许这里的问题是adapt
是如何试图扩大就业数量的
一个可能的原因是由于不兼容的资源请求而取消了作业。解决此问题的最简单方法是检查
print(cluster.job_script())
并将其显示给系统管理员或者,检查集群上的错误日志。运行
scontrol show jobid 1234
(其中1234是作业id)应该会向您指出取消的原因和相关日志相关问题 更多 >
编程相关推荐