我试图了解SLURM srun
和sbatch
命令之间的区别.我会对一般性解释感到满意,而不是对以下问题的具体答案,但这里有一些具体的混淆点,可以作为一个起点,并让我知道我在寻找什么.
根据文件,srun
是提交工作,sbatch
是为了提交工作以供以后执行,但实际差异对我来说不清楚,他们的行为似乎是一样的.例如,我有一个包含2个节点的集群,每个节点有2个CPU.如果我srun testjob.sh &
连续执行5x,它将很好地排队第五个作业,直到CPU变为可用,就像执行一样sbatch testjob.sh
.
为了使问题更具体,我认为一个好的起点可能是:我可以用一个我不能用另一个做的事情做什么,为什么?
两个命令的许多参数都是相同的.似乎最相关的那些是--ntasks
,--nodes
,--cpus-per-task
,--ntasks-per-node
.这些是如何相互关联的,它们对于srun
vs有sbatch
什么不同?
一个特别不同的是,srun
将导致一个错误,如果testjob.sh
没有执行权限,即chmod +x testjob.sh
而sbatch
会开心地运行它."引擎盖下"发生了什么导致情况如此?
该文档还提到srun
了sbatch
脚本中常用的文档.这导致了一个问题:它们如何相互作用,以及它们之间的"规范"用例是什么?具体来说,我会独自使用srun
吗?
我有几千个工作要在一个有16个节点的slurm集群上运行.这些作业应仅在大小为7的可用节点的子集上运行.某些任务是并行化的,因此使用单个节点的所有CPU功率,而其他任务是单线程的.因此,多个作业应该在单个节点上同时运行.任何任务都不应该在多个节点上产生.
目前我提交的每个职位都包括:
sbatch --nodelist=myCluster[10-16] myScript.sh
Run Code Online (Sandbox Code Playgroud)
但是这个参数让slurm等到提交的作业终止,因此完全不使用3个节点,并且根据任务(多线程或单线程),当前活动节点在CPU能力方面也可能处于低负载状态.
sbatch
在指定节点上同时运行多个作业的强制slurm 的最佳参数是什么?
为我提供了两个要提交和运行的 sbatch 脚本。第二个的输入基于第一个的输出。我需要执行此操作的作业只是告诉我们每隔几个小时左右检查第一个作业,然后在完成后提交第二个作业,但是有没有办法自动执行该操作,以便第二个作业在第一个作业之后立即运行做完了?我已经提交了第一个,目前正在队列中。
当我将带有选项 --gres=gpu:1 的 SLURM 作业提交到具有两个 GPU 的节点时,如何获取分配给该作业的 GPU 的 ID?是否有用于此目的的环境变量?我使用的 GPU 都是 nvidia GPU。谢谢。
通过 SBATCH,您可以使用以下语法在自动生成的输出文件中使用作业 ID %j
:
#!/bin/bash
# omitting some other sbatch commands here ...
#SBATCH -o slurm-%j.out-%N # name of the stdout, using the job number (%j) and the first node (%N)
#SBATCH -e slurm-%j.err-%N # name of the stderr, using job and first node values
Run Code Online (Sandbox Code Playgroud)
我一直在寻找类似的语法来使用作业名称而不是作业 ID。有谁知道样式%j
语法中可以引用哪些其他 slurm/sbatch 值?
我试图在后台运行带有srun的slurm作业。不幸的是,由于现在我不得不通过docker运行某些东西,因此使用sbatch有点烦人,所以我试图找出是否可以完全避免。
根据我的观察,每当我运行srun时,请说:
srun docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)
并关闭我正在运行命令的窗口(以避免接收所有打印语句),并打开另一个终端窗口以查看命令是否仍在运行,看来我的运行脚本由于某种原因被取消了。由于它不是通过sbatch进行的,因此不会向我发送带有错误日志的文件(据我所知),所以我不知道为什么它会关闭。
我也尝试过:
srun docker image my_job_script.py &
Run Code Online (Sandbox Code Playgroud)
在终端将控制权还给我。不幸的是,如果我这样做,它仍然会继续在终端屏幕上打印内容,这是我试图避免的。
本质上,我通过ssh登录到远程计算机,然后执行srun命令,但是似乎如果我终止ssh连接的通信,则srun命令会自动终止。有办法阻止这种情况吗?
理想情况下,我基本上希望发送脚本以使其运行,并且不要由于任何原因取消该脚本,除非我将其取消,并且该脚本scancel
不应打印到屏幕上。所以我理想的解决方案是:
这将是我的想法解决方案。
对于想了解sbatch问题的好奇人群,我希望能够这样做(这是理想的解决方案):
sbatch docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)
但是,人们会知道它是行不通的,因为sbatch接收到了不是“ batch”脚本的命令docker。本质上,一个简单的解决方案(实际上不适用于我的情况)是将docker命令包装在批处理脚本中:
#!/usr/bin/sh
docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)
不幸的是,我实际上是在使用批处理脚本来编码我正在运行的任务的很多信息(类似于配置文件)。因此这样做可能会影响我所做的工作,因为其基础文件正在更改。通过将作业直接发送到sbatch可以避免这种情况,因为它实际上创建了批处理脚本的副本(如本问题所述:在运行期间更改发送给sbatch的bash脚本运行时是一个坏主意吗?)。因此,解决我的问题的真正方法是使批处理脚本包含我的脚本所需的所有信息,然后在python中以某种方式呼叫docker并同时传递所有信息。不幸的是,其中一些信息是函数指针和对象,因此我什至不知道如何将此类信息传递给在python中运行的docker命令。
或者也许能够直接运行docker进行分批处理,而不是使用批处理脚本来解决问题。
我创建了一些 slurm 脚本,然后尝试使用 sbatch 执行它们。但是输出文件更新不频繁(可能每分钟更新一次)。
有没有办法改变 sbatch 中的输出缓冲延迟?我知道在这种情况下会使用 stdbuf,但我无法使其与 sbatch 一起使用。
使用 PBS 调度程序可以通过以下方式启动没有脚本的批处理命令:
qsub -l select=1:ncpus=12:mem=112GB -l walltime=00:30:00 -- /usr/bin/bash -c "mpirun -np 12 sleep 10"
是否可以在 Slurm 中使用 sbatch 来实现?
我正在整理一个 Snakemake slurm 工作流程,但我的工作目录因 slurm 输出文件变得混乱而遇到麻烦。我希望我的工作流程至少将这些文件定向到我的工作目录内的“slurm”目录。我目前的工作流程设置如下:
配置.yaml:
reads:
1:
2:
samples:
15FL1-2: /datasets/work/AF_CROWN_RUST_WORK/2020-02-28_GWAS/data/15FL1-2
15Fl1-4: /datasets/work/AF_CROWN_RUST_WORK/2020-02-28_GWAS/data/15Fl1-4
Run Code Online (Sandbox Code Playgroud)
集群.yaml:
localrules: all
__default__:
time: 0:5:0
mem: 1G
output: _{rule}_{wildcards.sample}_%A.slurm
fastqc_raw:
job_name: sm_fastqc_raw
time: 0:10:0
mem: 1G
output: slurm/_{rule}_{wildcards.sample}_{wildcards.read}_%A.slurm
Run Code Online (Sandbox Code Playgroud)
蛇文件:
configfile: "config.yaml"
workdir: config["work"]
rule all:
input:
expand("analysis/fastqc_raw/{sample}_R{read}_fastqc.html", sample=config["samples"],read=config["reads"])
rule clean:
shell:
"rm -rf analysis logs"
rule fastqc_raw:
input:
'data/{sample}_R{read}.fastq.gz'
output:
'analysis/fastqc_raw/{sample}_R{read}_fastqc.html'
log:
err = 'logs/fastqc_raw/{sample}_R{read}.out',
out = 'logs/fastqc_raw/{sample}_R{read}.err'
shell:
"""
fastqc {input} --noextract --outdir 'analysis/fastqc_raw' 2> {log.err} > {log.out}
"""
Run Code Online (Sandbox Code Playgroud)
然后我打电话:
snakemake --jobs 4 …
Run Code Online (Sandbox Code Playgroud) 我在工作站上安装了 slurm,它似乎可以工作,我可以使用 slurm 命令,srun 也可以工作。但是,当我尝试使用脚本从脚本启动作业时,sbatch test.sh
出现以下错误:批处理作业提交失败:将脚本/环境写入文件时发生 I/O 错误,即使脚本是最简单的,例如
#!/bin/bash
srun hostname