【问题标题】:slurm - sbatch job array for parallel execution of serial jobs filling each node using wrap commandslurm - sbatch 作业数组,用于使用 wrap 命令并行执行填充每个节点的串行作业
【发布时间】:2021-06-25 21:48:48
【问题描述】:

我有一个文件,每行一个命令,例如:

myprog.sh <args abc>
myprog.sh <args def>

我正在尝试将这些作为作业提交到数组中。该阵列应使用 1 台主机,以及该主机上的所有 CPU。相反,每个阵列使用 2 台主机,并在两台主机上执行这两个命令。

我想要什么:

host1
  - myprog.sh <args abc> slurm-1_1.out
  - myprog.sh <args def> slurm-1_2.out

slurm-1_1.out 将具有来自作业 1 的标准输出,而 slurm1_2.out 将具有来自作业 2 的标准输出。相反,正在发生的事情是这样的:

host1
  - myprog.sh <args abc> slurm-1_1.out
  - myprog.sh <args def> slurm-1_1.out
host2
  - myprog.sh <args abc> slurm-1_2.out
  - myprog.sh <args def> slurm-1_2.out

所以每个作业都在每个主机上重复。

我的 sbatch 命令如下所示:

sbatch -p small --nodes=1 -w host1 --cpus-per-task=1 --mem-per-cpu=3G --array=1-2 --wrap="myprog.sh <args abc> & myprog.sh <args def> & wait"

任何帮助将不胜感激!

【问题讨论】:

    标签: arrays slurm


    【解决方案1】:

    阵列作业适用于完全独立的工作负载。您希望作业在同一台机器上同时运行,因此数组不适合这种情况。不过,您可以只做一份工作并完成两项任务:

    #SBATCH -p small
    #SBATCH --nodes=1
    #SBATCH --ntasks=2
    #If you want access to all CPU and memory:
    #SBATCH --exclusive
    
    srun -n 1 myprog.sh <args abc> > first.out & 
    srun -n 1 myprog.sh <args def> > second.out &
    wait
    

    根据您的集群设置,您可能需要--exact 标志和更多srun 的内存规格。这在最近的版本中有所改变。您应该也可以使用 wrap 命令在一行中执行此操作,但由于这不是真正可读的,我更喜欢编写作业脚本。

    【讨论】:

    • 我明白了。这对我来说很奇怪,因为完全独立的工作负载可以在同一台机器上运行,这就是拥有 64 核机器的意义:D。我正在从 LSF 切换过来,这在 LSF 中是微不足道的。如果看起来可以解决问题,我会尝试并回帖。
    • 这个的主要问题是它创造了一份工作。一项工作应该是一项独立的任务。无论如何,我感谢您的帮助。
    • 如果它们是独立的,为什么它们必须在同一个主机上?
    • 因为主机要花钱,而且始终未充分利用主机上的内核对业务不利。如果我想每台机器使用 1 个核心,我会购买几台单核机器。没有几台大核机,每台只用1个核。有意义吗?
    • 并非如此。您的节点一次只用于一项工作吗?意味着一个核心作业会阻塞整个节点?
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2019-05-25
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多