在SLURM之外使用srun

3

我有一段代码通常在SLURM下运行。大致如下:

if ! lengthy_command
then
    echo "Error occured"
fi

出于会计目的,我想要将命令启动方式迁移到基于srun的启动方式。

if ! srun <srun params> lengthy_command
then
    echo "Error occured"
fi

但是更改了那行代码后,脚本将不再在交互式会话(SLURM之外)中运行。有没有办法使脚本通用,以便它可以在两种情况下运行?我在srun文档中看不到任何指向这个方向的内容。

1个回答

2

其中一种选择是使用变量,在作业中将其设置为 srun(例如,当设置了 $SLURM_JOBID 时),否则将其保留为空。

if [ -n $SLURM_JOBID ] ;  
then 
LAUNCH=srun <srun params>
else
LAUNCH=
fi

if ! $LAUNCH lengthy_command
then
    echo "Error occured"
fi

这种方法可以通过设置LAUNCHparallel <parallel options>来扩展,当使用GNU parallel时,或者在另一个调度程序的集群中运行时,可以设置为其他命令。
另一种选择是创建一个名为srun的Bash函数来封装逻辑(未经测试):
srun() {
if [ -n $SLURM_JOBID ] ;  
then 
command srun $@
else
$@
fi
}

这是一个不错的方法,但仍然有一些缺点。主要问题是srun参数在同一脚本的不同调用中会发生变化。而且,在每个命令之前添加条件语句使其与“插入式”替换相差甚远(如果srun不支持此类条件执行)。我正在准备一个bash函数来尝试解决这个问题,但仍然存在一些问题...新问题即将出现。 - Poshi
然后,您需要创建一个版本的srun,用于在Slurm运行时运行出错,使用Bash函数或具有优先级的脚本PATH超过实际的srun命令。 - damienfrancois
是的,我将使用bash函数方式:https://stackoverflow.com/questions/54217555/srun-drop-in-replacement - Poshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接