R-программирование - отправка заданий в многоузловом кластере Linux с использованием PBS - PullRequest
10 голосов
/ 30 июня 2010

Я использую R в многоузловом кластере Linux. Я хотел бы провести анализ R с использованием сценариев или пакетного режима без использования параллельных вычислительных программ, таких как MPI или snow.

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

Мой вопрос: как мне это сделать? Я не уверен, как я должен кодировать свои сценарии. Пример был бы очень полезен!

Я до сих пор выполнял свои сценарии с использованием PBS, но кажется, что он запускается только на одном узле, поскольку R является однопоточной программой. Следовательно, мне нужно выяснить, как настроить мой код так, чтобы он распределял труд на все узлы.

Вот что я делал до сих пор:

1) командная строка:

> qsub myjobs.pbs

2) myjobs.pbs:

> #!/bin/sh
> #PBS -l nodes=6:ppn=2
> #PBS -l walltime=00:05:00
> #PBS -l arch=x86_64
> 
> pbsdsh -v $PBS_O_WORKDIR/myscript.sh

3) myscript.sh:

#!/bin/sh
cd $PBS_O_WORKDIR
R CMD BATCH --no-save my_script.R

4) my_script.R:

> library(survival)
> ...
> write.table(test,"TESTER.csv",
> sep=",", row.names=F, quote=F)

Любые предложения будут оценены! Спасибо!

-CC

Ответы [ 3 ]

2 голосов
/ 30 июня 2010

Это скорее вопрос PBS;Я обычно делаю R-скрипт (с путем Rscript после #!) И собираю в нем параметр (используя функцию commandArgs), который контролирует, какую «часть работы» должен выполнять этот текущий экземпляр.Поскольку я часто использую multicore, мне обычно приходится использовать только 3-4 узла, поэтому я просто отправляю несколько заданий, вызывающих этот скрипт R, с каждым из возможных значений аргумента управления.
С другой стороны, вы используете pbsdsh должен выполнить свою работу ... Тогда значение PBS_TASKNUM можно использовать в качестве управляющего параметра.

1 голос
/ 07 марта 2014

Эта проблема, кажется, очень хорошо подходит для параллельного использования GNU. GNU Parallels имеет отличный учебник здесь . Я не знаком с pbsdsh, и я новичок в HPC, но мне кажется, что pbsdsh служит аналогично GNU parallel. Я также не знаком с запуском R из командной строки с аргументами, но вот мое предположение о том, как будет выглядеть ваш файл PBS:

#!/bin/sh
#PBS -l nodes=6:ppn=2
#PBS -l walltime=00:05:00
#PBS -l arch=x86_64
...
parallel -j2 --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
  Rscript myscript.R {} :::: infilelist.txt

где infilelist.txt перечисляет файлы данных, которые вы хотите обработать, например ::

inputdata01.dat
inputdata02.dat
...
inputdata12.dat

Ваш myscript.R получит доступ к аргументу командной строки для загрузки и обработки указанного входного файла.

Моя основная цель в этом ответе - указать на наличие параллели GNU, появившейся после публикации исходного вопроса. Надеюсь, кто-то еще может привести более осязаемый пример. Кроме того, я все еще колеблюсь с моим использованием parallel, например, я не уверен в опции -j2. (См. Мой связанный вопрос .)

1 голос
/ 11 апреля 2013

Это был ответ на связанный вопрос, но также и ответ на комментарий выше (также).

Для большей части нашей работы мы выполняем несколько сеансов R параллельно, используя qsub (вместо этого).

Если это для нескольких файлов, я обычно делаю:

while read infile rest
do
qsub -v infile=$infile call_r.pbs 
done < list_of_infiles.txt

call_r.pbs:

...
R --vanilla -f analyse_file.R $infile
...

analyse_file.R:

args <- commandArgs()
infile=args[5]
outfile=paste(infile,".out",sep="")...

Затем я объединяю все выходные данные ...

...