使用SLURM数组将R脚本划分为多个子任务?

时间:2019-04-12 11:50:45

标签: r parallel-processing slurm

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

1 个答案:

答案 0 :(得分:0)

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

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

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

是的,您可以这样做。虽然您可能想指定比较之一。

我真的不知道如何指定需要在哪个数组上进行计算的比较。

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

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

这是由于combs之后的subset的尺寸与索引之间的不匹配引起的。例如。您正在尝试访问不存在的梳子的位置。