如何使用 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 集群上的多个节点运行 MPI Python 脚本?错误:警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为 1