我想在大量不同的输入文件上运行相同的程序。我可以将每个作为单独的 Slurm 提交提交,但我不想通过一次在队列上倾倒 1000 个作业来淹没队列。我一直在试图弄清楚如何通过先创建分配来处理相同数量的文件,然后在该分配中使用 srun 循环遍历所有文件,从分配中为每个调用提供一个核心。问题是无论我做什么,一次都只运行一个作业步骤。我能想到的最简单的测试用例是:
#!/usr/bin/env bash
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
wait
Run Code Online (Sandbox Code Playgroud)
我分配多少核并不重要:
time salloc -n 1 test
time salloc -n 2 test
time salloc -n 4 test
Run Code Online (Sandbox Code Playgroud)
它总是需要 4 秒。是否不可能并行执行多个作业步骤?
事实证明,每个 cpu 的默认内存没有定义,因此即使是单核作业也是通过保留所有节点的 RAM 来运行的。
设置 DefMemPerCPU 或指定显式 RAM 预留就可以解决问题。
请注意,在这种情况下,您将测量运行时间和等待时间。您的提交脚本应如下所示:
#!/usr/bin/env bash
time {
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
wait
}
Run Code Online (Sandbox Code Playgroud)
并简单地提交
salloc -n 1 test
salloc -n 2 test
salloc -n 4 test
Run Code Online (Sandbox Code Playgroud)
然后,您应该观察差异以及诸如srun: Job step creation temporarily disabled, retrying使用时等消息n<4。