如何使用Slurm在多个节点上执行脚本?

如何使用Slurm在多个节点上执行脚本?

我有一个 R 代码,我想使用 Slurm 在多个节点上执行,我的参数的每次迭代都会在一个节点上执行。这是我的 Slurm 代码:

#!/bin/bash
#SBATCH -o job-%A_task.out
#SBATCH --job-name=paral_cor
#SBATCH --partition=normal
#SBATCH --time=1-00:00:00
#SBATCH --mem=124G                #I want to use 124Go / node
#SBATCH --cpus-per-task=32        #and 32CPUs / node 
#SBATCH --exclude=hpcsmp01


module load gcc/8.1.0 openblas/0.3.3 R

OUTPUT="$HOME"/PROJET_M2/data/$parallel_nodes_test
mkdir -p "$OUTPUT"


echo "Start job :"`date`


Rscript my_scrit.R --subset $i --file $1 > "$OUTPUT"


echo "Stop job :"`date`

参数--subset $i的值从 1 到 X(X 取决于我的 R 代码中的输入文件)。然后,对于 的每次迭代i,我希望在节点 上执行一个脚本。例如,--subset 1->一个节点,--subset 2-->另一个节点...直到--subset X->最后一个节点

我不想使用作业数组,因为它在我的集群上无法正常工作。所以,我想创建一个 bash 循环,如下所示:

for i in ?
 sbatch slurm_code.sh $i 
done

我不知道如何在参数之间建立链接--subset $i以及如何在for循环中将其从 1 增加到 X。

答案1

您希望srun在 for 循环中包含一个 for 循环,以便在脚本中请求节点。如果我们假设您有五个子集,您可以使用以下内容:

for i in `seq 1 5`; do
  srun \
    -N1 \
    --mem=124G \
    --cpus-per-task=32 \
    Rscript my_script.R --subset $i --file $1 > "$OUTPUT-$i" &
done

wait

请注意&以及wait命令。这将允许这些进程并行运行,并且 SLURM 将等待 for 循环中的所有内容完成。

如果您选择此路线,您还需要确保可以并行写入输出文件规范。上面我向您的变量添加了一个指示符$OUTPUT,该指示符将为每个子集提供不同的文件。您必须在wait命令后添加一些代码才能将输出重新组合到一个大文件中。

我相信您还想--nodes在文件中指定一个值sbatch,指示您的作业将使用的节点总数。

另一种选择是将所有作业代码包含在采用命令行参数的 shell 脚本中,并在文件srun中使用 for 循环调用它sbatch。前任。

for i in `seq 1 5`; do
  srun -N1 --mem=124G --cpus-per-task=32 bash runAnalysis.sh --subset $i &
done

wait

相关内容