我已经在2节点群集上安装了Slurm。两个节点都是计算节点,一个也是控制器。我能够一次成功运行多个作业的srun
。我正在运行GPU作业,并确认我可以通过srun在多个GPU上运行多个作业,最多达到系统中GPU的数量。
但是,当我尝试使用相同的测试文件运行sbatch时,它将仅运行一个批处理作业,并且仅在也是控制器的计算节点上运行。其他失败,sacct
摘要中的退出代码为1:0。如果我尝试强制它在不是控制器的计算节点上运行,它将无法运行并显示1:0退出代码。但是,仅使用srun即可在任何计算节点上运行。
我确保/etc/slurm/slurm.conf文件与计算机的规格正确。这是我正在使用的sbatch .job文件:
#!/bin/bash
#SBATCH --job-name=tf_test1
#SBATCH --output=/storage/test.out
#SBATCH --error=/storage/test.err
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=2000
##SBATCH --mem=10gb
#SBATCH --gres=gpu:1
~/anaconda3/bin/python /storage/tf_test.py
也许我不知道的sbatch有一些限制?
答案 0 :(得分:1)
sbatch
创建工作分配并启动所谓的“批处理步骤”。
如果您不了解工作步骤是什么,建议您使用以下页面:https://slurm.schedmd.com/quickstart.html
批处理步骤运行从sbatch
传递给它的脚本。启动其他作业步骤的唯一方法是在批处理步骤中调用srun
。就您而言,应该是
srun ~/anaconda3/bin/python /storage/tf_test.py
这将在分配中的每个任务上创建一个运行tf_test.py
的作业步骤。请注意,尽管该命令与直接运行srun
时相同,但它会通过sbatch
中的环境变量来检测该命令是否在分配中。您可以通过运行srun
和类似-n[num tasks]
的标志来将分配分为多个工作步骤。即
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 something.py
srun --ntasks=1 somethingelse.py
我不知道您是否还有其他问题,因为您没有发布任何其他错误消息或日志。
答案 1 :(得分:1)
如果在第二个节点上使用srun
并在您提到的提交脚本中使用sbatch
且未写入任何输出而失败,则最可能的原因是/storage
不存在,或用户无法写在第二个节点上。
第二个节点上的slurmd
日志对此应该是明确的。默认位置为/var/log/slurm/slurmd.log
,但请检查scontrol show config| grep Log
的输出以获取确定的信息。
导致相同行为的另一个可能原因是用户未定义或在第二个节点上具有不同的UID(但是srun
也将失败)
答案 2 :(得分:0)
@damienfrancois的答案是最接近甚至正确的。确保/ storage位置在所有节点上均可用后,事情将以sbatch
运行。最大的问题是/存储位置是通过NFS共享的,但对于计算节点是只读的。必须在/ etc / exports中将其更改为更像:
/storage *(rw,sync,no_root_squash)
在旋转之前...
我拥有的有效工作文件也有所不同。这是当前的.job文件:
#!/bin/bash
#SBATCH -N 1 # nodes requested
#SBATCH --job-name=test
#SBATCH --output=/storage/test.out
#SBATCH --error=/storage/test.err
#SBATCH --time=2-00:00
#SBATCH --mem=36000
#SBATCH --qos=normal
#SBATCH --mail-type=ALL
#SBATCH --mail-user=$USER@nothing.com
#SBATCH --gres=gpu
srun ~/anaconda3/bin/python /storage/tf_test.py