我有一个包含许多内核的许多节点的集群,我只想运行数千个只需要一个CPU的作业。最好是sbatch
。经过几个小时的文档后,我仍然遇到问题。我目前的设置是:
#SBATCH --nodes=4
#SBATCH --tasks-per-node=25
#SBATCH --distribution=block
srun ./my_experiment
我用sbatch
启动其中的几个,它们似乎很好地排队。
此脚本启动100个my_experiment
的实例。不幸的是,即使99个实验已经结束,它们似乎占用了所有100个CPU的资源。我该如何缓解这种情况?
其次,他们似乎并不相互共享节点。即使节点有+40核心。
是否可以sbatch
执行大量任务并让他们单独释放资源?
答案 0 :(得分:1)
不幸的是,他们似乎占用了所有100个CPU的资源,即使这样 99个实验已经结束。
这是因为您创建了一个作业,跨越至少4个节点,每个节点请求25个CPU,用于25个任务。乔布斯在所有任务结束时释放他们的分配。
假设您的流程之间没有通信,您的工作流程似乎更适合job arrays。对于作业数组,我们的想法是创建许多独立但可以轻松管理的作业。
#SBATCH --ntasks=1
#SBATCH --array=1-100
srun ./my_experiment
你最终会有100个工作,独立开始和结束,但你可以用一个命令杀死它们。
如果您的计划my_experiment
使用了SLURM_PROC_ID
环境变量,则可以将其替换为SLURM_ARRAY_TASK_ID
。
其次,他们似乎没有彼此共享节点。即使 节点有+40个核心。
每个作业需要每个节点明确25个核心,因此如果核心数量不是至少50,则Slurm不能将两个此类作业放在同一节点上。如果核心数大于50,则可能是由于内存要求。