我在工作站上安装了 slurm,它似乎可以工作,我可以使用 slurm 命令,srun 也可以工作。但是,当我尝试使用脚本从脚本启动作业时,sbatch test.sh出现以下错误:批处理作业提交失败:将脚本/环境写入文件时发生 I/O 错误,即使脚本是最简单的,例如
#!/bin/bash
srun hostname
我正在尝试与一个 Slurm 批处理脚本并行运行多个 python 脚本。看一下下面的例子:
#!/bin/bash
#
#SBATCH --job-name=test
#SBATCH --output=/dev/null
#SBATCH --error=/dev/null
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=1G
#SBATCH --partition=All
#SBATCH --time=5:00
srun sleep 60
srun sleep 60
wait
Run Code Online (Sandbox Code Playgroud)
如何调整脚本以便执行仅需 60 秒(而不是 120 秒)?将脚本拆分为两个脚本不是一个选项。
这是[如何使用一个 slurm 批处理脚本并行运行作业?] 的后续问题。目标是创建一个 SBatch 脚本,它可以启动多个进程并并行运行它们。damienfrancois给出的答案 非常详细,看起来像这样。
#!/bin/bash
#
#SBATCH --job-name=test
#SBATCH --output=/dev/null
#SBATCH --error=/dev/null
#SBATCH --partition=All
srun -n 1 -c 1 --exclusive sleep 60 &
srun -n 1 -c 1 --exclusive sleep 60 &
....
wait
Run Code Online (Sandbox Code Playgroud)
但是,我无法理解Exclusive关键字。如果我使用该关键字,则会选择集群的一个节点,并在那里启动所有进程。但是,我希望 Slurm 将 [“sleeps”/steps] 分布在整个集群上。
那么关键字Exclusive是如何工作的呢?根据Slurm 文档,不应发生对一个节点的限制,因为该关键字是在一步分配中使用的。
[我是 Slurm 新手]
我试图弄清楚“任务”的概念在 SLURM 中意味着什么。我在 SO 上找到了这个答案,它建议我使用以下作业脚本:
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 sleep 10 &
srun --ntasks=1 sleep 12 &
wait
Run Code Online (Sandbox Code Playgroud)
作者说这项工作总共需要 12 秒才能运行,因为这两个步骤sleep 10是sleep 12并行运行的,但我无法重现这一点。
如果我将上述文件另存为slurm-test并运行
sbatch -o slurm.out slurm-test,
Run Code Online (Sandbox Code Playgroud)
我看到我的作业运行了 23 秒。
这是以下的输出sacct --format=JobID,Start,End,Elapsed,NCPUS -S now-2minutes:
JobID Start End Elapsed NCPUS
------------ ------------------- ------------------- ---------- ----------
645514 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.batch 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.exte+ 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.0 2021-06-30T11:05:38 2021-06-30T11:05:48 00:00:10 2
645514.1 2021-06-30T11:05:48 2021-06-30T11:06:00 00:00:12 …Run Code Online (Sandbox Code Playgroud) 当我提交 1 个 cpu 核心作业时,作业信息显示 NumCPUs=2。
为什么它显示的不是 NumCPUs=1 而是 NumCPUs=2
这是对的吗?
子目录
#!/bin/bash
# Parameters
#SBATCH --error=%j_0_log.err
#SBATCH --job-name=test
#SBATCH -c 1
#SBATCH --output=%j_0_log.out
#SBATCH --partition=dev
#SBATCH --time=4
# command
srun echo "hello world"
Run Code Online (Sandbox Code Playgroud)
职位信息如下所示
scontrol 显示作业 915246
...
...
JobId=915246 JobName=test
...
NumNodes=1 NumCPUs=2 NumTasks=0 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=2,node=1,billing=2
...
Run Code Online (Sandbox Code Playgroud) 我正在使用带有 Open MPI 的 HPC slurm 集群。管理员希望每个人都使用srun而不是mpirun. 我已经使用了mpirun很多年,几乎所有关于使用 R 和 MPI 的在线讨论都使用mpirun而不是srun. srun使用 R代替有什么缺点吗mpirun?我需要调整代码吗?不幸的是,与我一起工作的集群管理员并不知道这一点,因为他们没有 R 经验。
这是一个mpirun示例,我在 R 外部设置并行进程,然后使用Rmpi包附加到它。
作业脚本:
#!/bin/bash
#SBATCH --job-name=Example
#SBATCH --partition=Something
#SBATCH --nodes=2
#SBATCH --tasks-per-node=30
#SBATCH --time=24:00:00
#SBATCH --mail-user=example@example.com
#SBATCH --mail-type=END,FAIL
#SBATCH --export=NONE
module load openmpi
module load r/4.2.2
mpirun Rscript --no-save --no-restore $HOME/Example.R
Run Code Online (Sandbox Code Playgroud)
R脚本:
if(!is.loaded("mpi_initialize")) {
library("doMPI")
}
cl <- startMPIcluster(comm = 0)
registerDoMPI(cl)
.Last <- function() { …Run Code Online (Sandbox Code Playgroud) 我正在使用SLURM运行批处理作业.我在作业文件中开始的过程是迭代的.在每次迭代之后,可以通过创建名为stop的文件轻轻地杀死程序.我希望这个停止命令能够在工作被限制前一小时自动发出.
我正在提交一份 slurm 玩具阵列作业。我的命令行是
$ sbatch -p development -t 0:30:0 -n 1 -a 1-2 j1
Run Code Online (Sandbox Code Playgroud)
其中 j1 是脚本:
#!/bin/bash
echo job id is $SLURM_JOB_ID
echo array job id is $SLURM_ARRAY_JOB_ID
echo task id id $SLURM_ARRAY_TASK_ID
Run Code Online (Sandbox Code Playgroud)
当我提交这个时,我收到一个错误:
--> Verifying valid submit host (login1)...OK
--> Verifying valid jobname...OK
--> Enforcing max jobs per user...OK
--> Verifying availability of your home dir (/home1/03400/myname)...OK
--> Verifying availability of your work dir (/work/03400/myname)...OK
--> Verifying availability of your scratch dir (/scratch/03400/myname)...OK
--> Verifying valid ssh keys...OK …Run Code Online (Sandbox Code Playgroud) 我有一个4 * 64 CPU集群。我安装了SLURM,它似乎正在工作,好像我打电话给sbatch我一样,得到了正确的分配和排队。但是,如果我使用64个以上的内核(基本上是1个以上的节点),则它会完美分配正确数量的节点,但是如果我ssh将这些内核分配到分配的节点中,则只能看到其中一个的实际工作。其余的只是坐在那里什么都不做。
我的代码很复杂,并且使用multiprocessing。我打电话给有300名工人的游泳池,所以我想这应该不是问题。
我想实现的目标是调用sbatch myscript.py200个内核,而SLURM应该在这200个内核上分配我的运行,而不仅仅是分配正确数量的节点,而实际上只使用一个。
我的python脚本的标头如下所示:
#!/usr/bin/python3
#SBATCH --output=SLURM_%j.log
#SBATCH --partition=part
#SBATCH -n 200
Run Code Online (Sandbox Code Playgroud)
我用调用脚本sbatch myscript.py。
我有一个问题,我需要启动相同的脚本但具有不同的输入参数.
假设我有一个脚本myscript.py -p <par_Val> -i <num_trial>,我需要考虑每个值的N不同par_values(之间x0和x1)和M个试验par_values.
M的每次试验几乎都达到我正在进行的集群的时间限制(我没有权利改变它).所以在实践中我需要NxM独立完成工作.
因为每个批处理作业具有相同的节点/ cpu配置,并且调用相同的python脚本,除了更改输入参数外,原则上,在伪语言中我应该有一个sbatch脚本应该执行以下操作:
#!/bin/bash
#SBATCH --job-name=cv_01
#SBATCH --output=cv_analysis_eis-%j.out
#SBATCH --error=cv_analysis_eis-%j.err
#SBATCH --partition=gpu2
#SBATCH --nodes=1
#SBATCH --cpus-per-task=4
for p1 in 0.05 0.075 0.1 0.25 0.5
do
for i in {0..150..5}
do
python myscript.py -p p1 -v i
done
done
Run Code Online (Sandbox Code Playgroud)
每次调用脚本本身就是一个批处理作业.看看sbatch doc,这个-a --array选项看起来很有希望.但在我的情况下,我需要更改我的每个脚本的输入参数NxM.我怎样才能做到这一点?我不想编写NxM批处理脚本,然后txt按照这篇文章的建议将它们列在一个文件中.这里提出的解决方案似乎也不是理想的,因为这是工作阵列的情况.此外,我想确保所有NxM脚本同时启动,并且调用上面的脚本立即终止,这样它就不会与时间限制冲突,我的整个工作将被系统和保持不完整(然而,由于每个NxM …
slurm ×10
sbatch ×2
arrays ×1
jobs ×1
mpi ×1
openmpi ×1
python ×1
python-3.x ×1
r ×1
submission ×1