10

我在多节点 Linux 集群上运行 R。我想使用脚本或批处理模式在 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

4

3 回答 3

2

这是一个 PBS 问题。我通常制作一个 R 脚本(在 #! 之后带有 Rscript 路径)并使其收集一个参数(使用commandArgs函数)来控制当前实例应该执行的“工作的一部分”。因为我使用multicore了很多,所以我通常只需要使用 3-4 个节点,所以我只需提交一些作业,使用每个可能的控制参数值调用这个 R 脚本。
另一方面,您的使用pbsdsh应该完成它的工作......然后PBS_TASKNUM可以将值用作控制参数。

于 2010-06-29T21:48:07.567 回答
1

这是对相关问题的回答 - 但它也是对上述评论的回答(也是)。

对于我们的大部分工作,我们确实使用 qsub(而不是)并行运行多个 R 会话。

如果是针对多个文件,我通常会这样做:

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
...

分析文件.R:

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

然后我把所有的输出组合起来......

于 2013-04-11T11:20:58.853 回答
1

这个问题似乎非常适合使用 GNU 并行。GNU 并行在这里有一个很好的教程。我不熟悉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选项。(请参阅我的相关问题。)

于 2014-03-06T21:49:30.583 回答