如何使用 SLURM 提交并行作业步骤?

Posted

技术标签:

【中文标题】如何使用 SLURM 提交并行作业步骤?【英文标题】:How to submit parallel job steps with SLURM? 【发布时间】:2018-09-20 15:53:18 【问题描述】:

我有以下名为 gzip2zipslurm.sh 的 SLURM 作业脚本:

#!/bin/bash
#SBATCH --mem 70G
#SBATCH --ntasks 4
echo "Task 1"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.A-B.xml.tar.gz  &
echo "Task 2"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.C-H.xml.tar.gz  &
echo "Task 3"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.I-N.xml.tar.gz  &
echo "Task 4"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.O-Z.xml.tar.gz  &
echo "Waiting for job steps to end"
wait
echo "Script complete"

我通过sbatch gzip2zipslurm.sh 将其提交给 SLURM。 当我这样做时,SLURM 日志文件的输出是

Task 1
Task 2
Task 3
Task 4
Waiting for job steps to end

tar2zip 程序读取给定的tar.gz 文件并将其重新打包为ZIP 文件。

问题:只有一个 CPU(空闲节点上 16 个可用的 CPU)在做任何工作。使用top,我可以看到总共有5 个srun 命令已启动(我猜4 个用于我的任务,1 个用于sbatch 作业)但只有一个Java 进程。我也可以在正在处理的文件上看到它,只写了一个。

如何管理所有 4 个任务实际上是并行执行的?

感谢任何提示!

【问题讨论】:

【参考方案1】:

问题可能与内存预留有关。在提交脚本中,你设置--mem=70GB,即job的全局内存使用量。

在提交脚本中使用srun 时,它会从sbatch 继承参数,包括--mem=70GB。所以你实际上隐式运行了以下内容。

srun --mem 70G -n1 java -Xmx10g -jar ...

尝试将内存显式声明为 70GB/4:

srun --mem 17G -n1 java -Xmx10g -jar ...

此外,根据文档,您应该在这种情况下使用 --exclusivesrun

srun --exclusive --mem 17G -n1 java -Xmx10g -jar ...

启动多个作业步骤时也可以使用此选项 在现有资源分配中,您希望在其中单独 专用于每个作业步骤的处理器。如果有足够的处理器 无法启动作业步骤,它将被推迟。这 可以被认为是提供一种资源管理机制 在其分配范围内的工作。

【讨论】:

啊当然。我有点傻。我猜仍然在“工作”、“步骤”和“任务”上苦苦挣扎;-) 非常感谢。我还阅读了有关--exclusive 开关的信息。我把它排除在外是为了避免更复杂。但是现在我按照您的建议使用它并且它工作正常。谢谢!

以上是关于如何使用 SLURM 提交并行作业步骤?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SLURM 停止计算节点?

超算平台 SLURM 作业调度系统使用

如何在多个 GPU 节点上获取分配给 SLURM 作业的 GPU ID?

使用批处理脚本提交作业 Slurm

Slurm 作业数组提交严重未充分利用可用资源

在 Slurm 中,如何批量提交多个实验运行,并一个接一个地连续执行?