我是使用MPI(mpi4py)和Slurm的新手。我需要运行大约50000个任务,所以为了遵守大约1000的管理员设置限制,我一直在运行它们:
sbrunner.sh:
#!/bin/bash
for i in {1..50}
do
sbatch m2slurm.sh $i
sleep 0.1
done
m2slurm.sh:
#!/bin/bash
#SBATCH --job-name=mpi
#SBATCH --output=mpi_50000.out
#SBATCH --time=0:10:00
#SBATCH --ntasks=1000
srun --mpi=pmi2 --output=mpi_50k${1}.out python par.py data_50000.pkl ${1} > ${1}py.out 2> ${1}.err
par.py(省略无关的东西):
offset = (int(sys.argv[2])-1)*1000
comm = MPI.COMM_WORLD
k = comm.Get_rank()
d = data[k+offset]
# ... do something with d ...
allresults = comm.gather(result, root=0)
comm.Barrier()
if k == 0:
print(allresults)
答案 0 :(得分:1)
我认为您需要让您的应用程序将工作分为1000个任务(MPI排名),然后使用MPI集体调用(即MPI_Reduce
或MPI_AllReduce
调用)合并结果。
尝试解决限制对你没有帮助,因为你开始的工作会一个接一个地排队。
作业数组将提供与您在所提供的批处理文件中执行的操作类似的行为。因此,您的应用程序必须能够处理仅给出N个任务(MPI等级)的所有数据项。
无需汇集以确保完成所有其他作业,请查看slurm作业依赖项参数 https://hpc.nih.gov/docs/job_dependencies.html
编辑:
您可以使用作业依赖项创建一个新作业,该作业将在所有其他作业完成后运行,此作业将收集结果并将它们合并为一个大文件。我仍然相信你已经在考虑明显的解决方案使得排名为0(主人收集所有结果并将其保存到磁盘)
答案 1 :(得分:0)
这看起来像job arrays的完美候选人。除了$ SLURM_ARRAY_TASK_ID环境变量之外,数组中的每个作业都是相同的。您可以使用与使用命令行变量相同的方式使用它。
(您需要检查系统管理员是否将MaxArraySize设置得足够高。检查scontrol show config | grep MaxArraySize
的输出)
答案 2 :(得分:0)
50000个任务是什么意思?
如果1),请咨询您的系统管理员。当然,您可以在多个SLURM作业中分配50000个插槽,手动等待它们全部同时运行,然后再mpirun
您的应用在之外的SLURM。这既丑陋又无效,如果这被视为企图规避系统限制,你可能会遇到麻烦。
如果2)或3),则作业数组是一个很好的候选者。如果我理解你的应用程序,你需要一个额外的后期处理步骤,以便在一个文件中连接/合并你的所有输出。
如果你选择3),你需要找到最佳位置 (一般来说,50000串行程序比50个1000个任务MPI作业或一个50000个任务MPI程序但合并50000文件效率低于合并50个文件(或者根本不合并任何东西)
如果您无法在前端节点上进行后处理,那么您可以使用作业依赖性来启动它 所有计算完成后