如何使用 Slurm 在多个节点上发送循环?

Posted

技术标签:

【中文标题】如何使用 Slurm 在多个节点上发送循环?【英文标题】:How to send a loop on several nodes with Slurm? 【发布时间】:2019-10-07 04:52:03 【问题描述】:

我有一个想要在多个节点上执行的 R 脚本。我展示了我的 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/$(date +"%Y%m%d")_parallel_nodes_test
mkdir -p "$OUTPUT"

export FILENAME=~/PROJET_M2/bin/RHO_COR.R

echo "Start job :"`date`

for i in $(seq 100)
do
   srun Rscript my_scrit.R --subset $i  
done

echo "Stop job :"`date`

我基本上执行这个

sbatch my_script.sh 

这是我的 R 代码中出现--subset $i 的循环:

res <- foreach(i = opt$subset) %dopar%       #without argument, that gives
 G1 <- split[[combs[i,1]]]                    i=seq_len(nrow(combs))
 G2 <- split[[combs[i,2]]]                    combs is a vector with several
 dat.i <- cbind(data[,G1], data[,G2])         rows, according to my input 
 rho.i <- cor_rho(dat.i)                      file

我想在多个节点上执行i 的不同值。此代码仅在一个节点上执行。在多个节点上运行此代码是否有问题?

谢谢

【问题讨论】:

你能给我们看完整的 SLURM 脚本吗?您如何将其发送到队列? 您是否还希望我向您展示我的 R 代码循环,其中出现了参数 subset 【参考方案1】:

在您当前的状态下,您要求 SLURM 为该任务提供单个节点、单个任务和 32 个内核。如果你想使用多个节点,你应该告诉 SLURM:

#SBATCH --nodes=10

稍后,在实际的脚本启动中,您应该告诉srun 在单个节点中启动该脚本:

srun --nodes 1 --exclusive Rscript my_scrit.R --subset $i &

如果要在第一个迭代仍在运行时开始下一个迭代,则需要将脚本置于后台。您还需要 --exclusive 标志以避免在已分配的资源上启动额外的脚本。

【讨论】:

好的,我知道你的意思。我想知道我是否创建了一个执行我的 script.sh 的外部 bash 循环可能是一个解决方案?我的意思是,我在 script.sh 中设置了一个具有 32CPU 和 124Go 的节点,执行的作业与循环中的迭代一样多? 是的,这也可能是一个解决方案,只要您设法为每个提交提供适当的子集参数。如果你这样做,我建议你使用作业数组,它们会简化你手头的任务。 我尝试使用作业数组,但它在集群上无法正常工作。你能帮我给每个提交的propr子集参数吗?此参数应取 1 到 X 之间的值(X 是可以根据我的代码 R 中的输入文件更改的数字)。我真的不知道如何创建它.. 您可以为要启动的每个作业创建一个带有适当参数的提交脚本。这将是作业数组的手动方法,分别发送所有这些。 我明白你的意思。我的问题是我不知道如何在我的 slurm 代码中建立我的论点 --subset $i 之间的联系,以及如何增加这个论点,这要归功于循环:for i in ? ; do sbatch slurm_code.sh $i ; done

以上是关于如何使用 Slurm 在多个节点上发送循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SLURM 中的节点列表向任何 [子集] 节点提交作业?

如何使用 SLURM 停止计算节点?

如何跨 Slurm 集群上的多个节点运行 MPI Python 脚本?错误:警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为 1

如何在节点上平均分配 slurm 任务?

SLURM 是不是支持同时在一个节点上运行多个作业?

Slurm无法运行多个sbatch任务