我可以访问一个强大的群集。我是一个不错的R程序员,但对于shell命令(以及终端命令,除了使用ubuntu需要做的基本事情之外)都是全新的。
我想使用这个集群在R中运行一堆并行进程,然后我想将它们组合起来。具体来说,我有类似的问题:
my.function <-function(data,otherdata,N){
mod = lm(y~x, data=data)
a = predict(mod,newdata = otherdata,se.fit=TRUE)
b = rnorm(N,a$fit,a$se.fit)
b
}
r1 = my.function
r2 = my.function
r3 = my.function
r4 = my.function
...
r1000 = my.function
results = list(r1,r2,r3,r4, ... r1000)
以上只是一个愚蠢的例子,但基本上我想要并行执行1000次,然后对1000个流程的所有结果做一些事情。
如何同时向群集提交1000个作业,然后合并所有结果,如代码的最后一行?
我也欢迎任何有关编写RTFM的精心编写的手册/参考资料的建议。不幸的是,我发现的文件并不是特别容易理解。
提前致谢!
答案 0 :(得分:5)
您可以将plyr
与doMC
包(即foreach
包的并行后端)结合使用,如下所示:
require(plyr)
require(doMC)
registerDoMC(20) # for 20 processors
llply(1:1000, function(idx) {
out <- my.function(.)
}, .parallel = TRUE)
修改:如果您正在谈论提交同时发布的作业,那么您是否拥有LSF license?然后,您可以使用bsub
根据需要提交任意数量的作业,它还可以处理负载平衡以及什么不是......!
编辑2:关于负载平衡的一个小注释(例如使用LSF的bsub
):
你提到的是类似于我在这里写的东西=&gt; LSF
。您可以批量提交jobs
。例如:在LSF
中使用,您可以使用bsub
将作业提交到群集,如下所示:
bsub -m <nodes> -q <queue> -n <processors> -o <output.log>
-e <error.log> Rscript myscript.R
这将使您进入队列并为您分配您的作业将开始运行的处理器数量(如果可用)(取决于资源)。您可以pause
,restart
,suspend
您的工作......以及更多...... qsub
与此概念类似。学习曲线可能有点陡峭,但值得。
答案 1 :(得分:5)
我们在“统计软件期刊”(一份公开期刊)上撰写了一篇关于State of of the Art in Parallel Computing with R的调查报告。您可能会发现这对介绍很有用。
答案 2 :(得分:2)
Message Passing Interface做你想做的事情,并且很容易做到。编译后,你需要运行:
mpirun -np [no.of.process] [executable]
您可以使用包含以下主机IP字段的简单文本文件选择运行它的位置:
node01 192.168.0.1
node02 192.168.0.2
node03 192.168.0.3
here更多MPI的例子。