我有一个 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