使用 SLURM 数组将 R 脚本划分为子作业?



我有一个 R 脚本,我想分成几个作业,每个作业都在群集的一个节点上。

res<-foreach(i = seq_len(nrow(combs))) %dopar% {
G1 <- split[[combs[i,1]]]
G2 <- split[[combs[i,2]]]
bind <- cbind(data[,G1], data[,G2])
rho.i <- cor_rho(bind)     #the function cor_rho I created  
}

这是我想并行化的代码。我将一个大矩阵划分为子矩阵,并计算这些子矩阵的每个组合之间的相关性:

子矩阵1 与子矩阵 2:节点 1 子矩阵 1 与子矩阵 3:节点 2 等。

我尝试了这样的事情(例如,如果我有 10 个组合要计算),我没有向您展示整个 SLURM 代码:

#SBATCH --array=1-10
Rscript my_R_script > my_output

它创建 10 个数组,但我想知道每个数组是否计算一个计算。换句话说,如果一个数组 = 一个节点 = 两个子矩阵之间的一个比较?

最佳

编辑:

这是combs的样子:

> combs
[,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    1    4
[4,]    1    5
[5,]    2    3
[6,]    2    4
[7,]    2    5
[8,]    3    4
[9,]    3    5
[10,]    4    5

combs <- combs[opt$subset,] #SLURM_ARRAY_TASK_ID
#The loop which computes each combination
res <- foreach(i = seq_len(nrow(combs))) %dopar% {
G1 <- split[[combs[i,1]]]
G2 <- split[[combs[i,2]]]
dat.i <- cbind(data[,G1], data[,G2])
rho <- cor_rho(dat.i)
}
#I fill my final matrix
resMAT <- matrix(0, ncol(data), ncol(data))
for(i in 1:nrow(combs)){
batch1 <- split[[combs[i,1]]]
batch2 <- split[[combs[i,2]]]
patch.i <- c(batch1, batch2)
resMAT[patch.i, patch.i] <- res[[i]]
}

然后,我的 SLURM 代码:

#!/bin/bash
#SBATCH -o slurmjob-%A-%a.out
#SBATCH --job-name=parallel_nodes
#SBATCH --partition=normal
#SBATCH --time=1-00:00:00
#SBATCH --array=1-10
#Set up whatever package we need to run with
module load gcc/8.1.0 openblas/0.3.3 R
# SET UP DIRECTORIES
OUTPUT="$HOME"/PROJET_M2/data/$(date +"%Y%m%d")_parallel_nodes
mkdir -p "$OUTPUT"
echo $SLURM_ARRAY_TASK_ID
subset=$((SLURM_ARRAY_TASK_ID))
Rscript my_R_code > "$OUTPUT"/"$SLURM_ARRAY_TASK_ID"

我用以下命令执行此脚本:

sbatch --partition normal --array 1-10 RHO_COR.sh

我收到一条消息错误:

Error in combs[i, 1] : index out of bounds

我想知道每个数组是否计算一次计算。

数组的每次运行都可以运行一个(或可能运行多个脚本)。

换句话说,如果一个数组 = 一个节点 = 两个子矩阵之间的一个比较?

是的,你可以这样做。尽管您可能希望指定比较中的哪一个。

我真的不知道如何指定我需要在哪个阵列上计算哪个比较。.

有许多方法可以指定需要在哪个阵列上计算哪个比较。例如,您可以使用数组编号作为选择的参数/条件。例如,您将有一个包含 n 个比较的列表和一个包含n个数组编号的列表,并且根据数组编号,您选择在列表中具有相同索引/位置的相应比较。注意:您可能还想适当地命名您的输出 - 否则您将尝试创建n 个具有相同名称的不同输出文件,如果它们位于同一位置,可能会导致麻烦。

我收到一条消息错误:Error in combs[i, 1] : index out of bounds

这是由于subsetcombs的维度与您的索引不匹配造成的。 例如,您正在尝试访问不存在的梳子位置。

最新更新