关于 运行 4 个并行作业的替代方法的问题
Questions on alternative ways to run 4 parallel jobs
下面是三个不同的 sbatch
脚本,它们产生的结果大致相似。
(我只展示了脚本不同的部分;##
前缀表示将脚本提交到sbatch
得到的输出。)
脚本 0
#SBATCH -n 4
srun -l hostname -s
## ==> slurm-7613732.out <==
## 0: node-73
## 1: node-73
## 2: node-73
## 3: node-73
脚本 1
#SBATCH -n 1
#SBATCH -a 1-4
srun hostname -s
## ==> slurm-7613733_1.out <==
## node-72
##
## ==> slurm-7613733_2.out <==
## node-73
##
## ==> slurm-7613733_3.out <==
## node-72
##
## ==> slurm-7613733_4.out <==
## node-73
脚本 2
#SBATCH -N 4
srun -l -n 4 hostname -s
## ==> slurm-7613738.out <==
## 0: node-74
## 2: node-76
## 1: node-75
## 3: node-77
问:为什么人们会选择其中一种方法而不是其他方法?
(我看到脚本 0 生成的作业全部 运行 在同一个节点上,但我不知道这是不是巧合。)
此外,脚本 2 的以下变体(唯一的区别是 -N 2
而不是 -N 4
)失败了:
脚本 3
#SBATCH -N 2
srun -l -n 4 hostname -s
## ==> slurm-7614825.out <==
## srun: error: Unable to create job step: More processors requested than permitted
脚本 2 的以下变体也是如此(这与脚本 3 之间的唯一区别是这里 srun
也有标志 -c 2
):
脚本 4
#SBATCH -N 2
srun -l -n 4 -c 2 hostname -s
## ==> slurm-7614827.out <==
## srun: error: Unable to create job step: More processors requested than permitted
问题: 我在脚本 3 和脚本 4 中遇到的错误是由于错误的语法、错误的语义或特定于站点的配置造成的吗? IOW,这些脚本是否存在固有错误(这会导致它们在任何 SLURM 实例下失败),或者这些错误仅仅是由于违反了我提交作业的特定 SLURM 实例所施加的限制?如果是后者,我该如何查明导致错误的配置?
Q: Why would one choose one such approach over the others?
脚本 0:您请求 4 个任务,同时分配给一个作业,没有关于如何将这些任务分配给节点的其他规范。典型用法:MPI program.
脚本 1:您请求 4 个作业,每个作业有 1 个任务。这些作业将彼此独立安排。典型用途:Embarrassingly parallel 个职位。
脚本2:你请求4个节点,每个节点一个任务。它类似于脚本 0,只是您请求将任务分配给四个不同的节点。典型用途:例如在本地磁盘上有很多 IOs 的 MPI 程序。
所有作业都分配到相同的第一个节点是因为 Slurm 总是以相同的顺序分配节点,您可能 运行 所有测试一个接一个地开始,所以另一个开始在上一个刚刚释放的资源上。
脚本 3:你请求两个节点,隐含地,每个节点 1 个任务,所以你被分配了两个任务,但是你尝试使用 4 个任务 s运行。你应该把它改成
#SBATCH -N 2
#SBATCH --tasks-per-node 2
srun -l -n 4 hostname -s
每个节点两个请求两个任务,或者
#SBATCH -N 2
#SBATCH -n 4
srun -l -n 4 hostname -s
请求四个任务,对跨节点的任务分配没有额外限制。
脚本 4:您请求两个节点,隐含地,每个节点 1 个任务,并且隐含地,每个任务一个 CPU,因此您被分配了两个CPUs,但随后您尝试使用 4 个任务和 s运行,每个任务有 2 CPUS,所以总共 8 个。你应该把它改成
#SBATCH -N 2
#SBATCH --tasks-per-node 2
#SBATCH --cpus-per-task 2
srun -l -n 4 -c 2 hostname -s
或者,
#SBATCH -N 2
#SBATCH -n 4
#SBATCH --cpus-per-task 2
srun -l -n 4 -c 2 hostname -s
底线:在提交脚本中,您使用 #SBATCH
指令请求资源,并且您使用的资源不能超过对 srun
.
的后续调用
下面是三个不同的 sbatch
脚本,它们产生的结果大致相似。
(我只展示了脚本不同的部分;##
前缀表示将脚本提交到sbatch
得到的输出。)
脚本 0
#SBATCH -n 4
srun -l hostname -s
## ==> slurm-7613732.out <==
## 0: node-73
## 1: node-73
## 2: node-73
## 3: node-73
脚本 1
#SBATCH -n 1
#SBATCH -a 1-4
srun hostname -s
## ==> slurm-7613733_1.out <==
## node-72
##
## ==> slurm-7613733_2.out <==
## node-73
##
## ==> slurm-7613733_3.out <==
## node-72
##
## ==> slurm-7613733_4.out <==
## node-73
脚本 2
#SBATCH -N 4
srun -l -n 4 hostname -s
## ==> slurm-7613738.out <==
## 0: node-74
## 2: node-76
## 1: node-75
## 3: node-77
问:为什么人们会选择其中一种方法而不是其他方法?
(我看到脚本 0 生成的作业全部 运行 在同一个节点上,但我不知道这是不是巧合。)
此外,脚本 2 的以下变体(唯一的区别是 -N 2
而不是 -N 4
)失败了:
脚本 3
#SBATCH -N 2
srun -l -n 4 hostname -s
## ==> slurm-7614825.out <==
## srun: error: Unable to create job step: More processors requested than permitted
脚本 2 的以下变体也是如此(这与脚本 3 之间的唯一区别是这里 srun
也有标志 -c 2
):
脚本 4
#SBATCH -N 2
srun -l -n 4 -c 2 hostname -s
## ==> slurm-7614827.out <==
## srun: error: Unable to create job step: More processors requested than permitted
问题: 我在脚本 3 和脚本 4 中遇到的错误是由于错误的语法、错误的语义或特定于站点的配置造成的吗? IOW,这些脚本是否存在固有错误(这会导致它们在任何 SLURM 实例下失败),或者这些错误仅仅是由于违反了我提交作业的特定 SLURM 实例所施加的限制?如果是后者,我该如何查明导致错误的配置?
Q: Why would one choose one such approach over the others?
脚本 0:您请求 4 个任务,同时分配给一个作业,没有关于如何将这些任务分配给节点的其他规范。典型用法:MPI program.
脚本 1:您请求 4 个作业,每个作业有 1 个任务。这些作业将彼此独立安排。典型用途:Embarrassingly parallel 个职位。
脚本2:你请求4个节点,每个节点一个任务。它类似于脚本 0,只是您请求将任务分配给四个不同的节点。典型用途:例如在本地磁盘上有很多 IOs 的 MPI 程序。
所有作业都分配到相同的第一个节点是因为 Slurm 总是以相同的顺序分配节点,您可能 运行 所有测试一个接一个地开始,所以另一个开始在上一个刚刚释放的资源上。
脚本 3:你请求两个节点,隐含地,每个节点 1 个任务,所以你被分配了两个任务,但是你尝试使用 4 个任务 s运行。你应该把它改成
#SBATCH -N 2
#SBATCH --tasks-per-node 2
srun -l -n 4 hostname -s
每个节点两个请求两个任务,或者
#SBATCH -N 2
#SBATCH -n 4
srun -l -n 4 hostname -s
请求四个任务,对跨节点的任务分配没有额外限制。
脚本 4:您请求两个节点,隐含地,每个节点 1 个任务,并且隐含地,每个任务一个 CPU,因此您被分配了两个CPUs,但随后您尝试使用 4 个任务和 s运行,每个任务有 2 CPUS,所以总共 8 个。你应该把它改成
#SBATCH -N 2
#SBATCH --tasks-per-node 2
#SBATCH --cpus-per-task 2
srun -l -n 4 -c 2 hostname -s
或者,
#SBATCH -N 2
#SBATCH -n 4
#SBATCH --cpus-per-task 2
srun -l -n 4 -c 2 hostname -s
底线:在提交脚本中,您使用 #SBATCH
指令请求资源,并且您使用的资源不能超过对 srun
.