Использование массивов SLURM для разделения сценария R на подзадачи? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть 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 массивов, но мне интересно, если каждый массив вычисляет одинвычисление.Другими словами, если один массив = один узел = одно сравнение между двумя подматрицами?

Bests

Редактировать:

Так выглядит 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 голосов
/ 12 апреля 2019

Интересно, вычисляет ли каждый массив одно вычисление.

Каждый запуск массива может выполнять один (или, возможно, несколько сценариев).

Другими словами, если один массив = один узел = одно сравнение между двумя подматрицами?

Да, вы можете сделать это следующим образом.Хотя вы, вероятно, хотите указать, какое из сравнений.

Я действительно не знаю, как я могу указать, какое сравнение мне нужно вычислить, для какого массива ..

Есть много способов указать, какое сравнение вам нужновычислить, на каком массиве.Например, вы можете использовать номер массива в качестве аргумента / критерия для выбора.Например, у вас будет список n сравнений и список n номеров массивов, и на основе номера массива вы выбираете соответствующее сравнение, которое имеет тот же индекс / позицию в списке.NB. Возможно, вы также захотите назвать свои выходные данные соответствующим образом - в противном случае вы попытаетесь создать n разных выходных файлов с одинаковым именем, что может вызвать проблемы, если они находятся в одном месте.

И я получаю сообщение об ошибке: Error in combs[i, 1] : index out of bounds

Это вызвано несоответствием между размерами combs после subset и вашими индексами.Например, вы пытаетесь получить доступ к позиции расчески, которая не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...