如何使用slum将输出文件保存在集群的存储磁盘上



我有一个Fortran代码,必须在带有slurm的集群上运行。我已经在主目录(安装在所有集群节点中(中编译了代码,并始终在其上运行。然而,安装家庭的分区只有250 GB左右。我必须运行许多不同的模拟,生成许多输出文件,因此它们很容易变得沉重,我和我的同事总是面临内存问题(我们必须停止模拟,手动移动文件并重新启动它们(。我们将它们移动到具有5 TB内存的辅助磁盘中。

我想知道是否有一种方法可以在主目录上使用sbatch运行模拟,并将所有输出文件保存在辅助磁盘中(不是在所有节点之间共享(。我尝试使用--output标志,但它不起作用。

我用sbatch运行的bash脚本很简单,如下所示:

#!/bin/bash
#SBATCH --partition=cpu
#SBATCH --job-name=k1_01
#SBATCH --mem=16G
#SBATCH --time=90-0:0
#SBATCH --output=output.log
#SBATCH --nodelist=node13
./program < input.in

FYI程序生成了许多输出文件:有些文件在代码内主循环的每次迭代中都会更新,有些则是新生成的,每个步骤一个(我有2000个步骤(。

感谢您的帮助

如果对program进行了编码,以便将临时文件写入当前工作目录,则只需使用cd命令即可更改目录。

假设辅助磁盘安装在/scratch中的计算节点上(您的集群可能会定义一个指向正确位置的环境变量,例如$LOCALSRACCH、$TMP、$TMPDIR等。在这种情况下,请在下面的脚本中将/scratch替换为该变量(

然后你的提交脚本可能看起来像这样:

#!/bin/bash
#SBATCH --partition=cpu
#SBATCH --job-name=k1_01
#SBATCH --mem=16G
#SBATCH --time=90-0:0
#SBATCH --output=output.log
#SBATCH --nodelist=node13
SCRATCH=/scratch/$USER/$SLURM_JOBID
mkdir -p $SCRATCH && cd $SCRATCH
$SLURM_SUBMIT_DIR/program < input.in
cp output.log final.res $SLURM_SUBMIT_DIR && rm -rf $SCRATCH

该脚本首先根据您的用户名和Slurm当前的JobID定义一个$SCRATCH变量。计算将在位于辅助磁盘上的目录中进行。(如果磁盘安装在/scratch以外的其他地方,请将该部件更换到正确的位置(

然后,它创建变量引用的目录,并更改那里的工作目录。通过这种方式,数据可以在临时磁盘中正确组织

当我们更改目录时,program必须由一个绝对路径引用。$SLURM_SUBMIT_DIR变量保存运行sbatch命令的路径。因此,只要您在与提交脚本和program软件所在的目录相同的目录中运行sbatch,$SLURM_SUBMIT_DIR/programe就应该正确指向它。

然后,您需要再次使用$SLURM_SUBMIT_DIR变量将输出和结果(我发明了一个名为final.res的结果文件,当然要确保用需要保留的文件列表替换它(复制回主目录。

最后,注意rm -rf $SCRATCH部分;它将删除辅助磁盘中与当前作业相关的文件,以便正确清理。如果您希望文件保留在那里,可以将其删除。

最新更新