5

我可以访问一个强大的大型集群。我是一名中规中矩的 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 的编写良好的手册/参考的建议也将受到欢迎。不幸的是,我找到的文件并不是特别容易理解。

提前致谢!

4

3 回答 3

5

您可以plyrdoMC包(即包的并行后端foreach)结合,如下所示:

require(plyr)
require(doMC)
registerDoMC(20) # for 20 processors

llply(1:1000, function(idx) {
    out <- my.function(.)
}, .parallel = TRUE)

编辑:如果您正在谈论提交同时工作,那么您没有LSF 许可证吗?然后,您可以根据bsub需要提交尽可能多的作业,并且它还负责负载平衡等等......!

编辑 2:关于负载平衡的小说明(使用 LSF 的示例bsub):

您提到的内容类似于我在这里写的内容 => LSF。可以jobs分批提交。例如:使用 inLSF您可以使用bsub向集群提交作业,如下所示:

bsub -m <nodes> -q <queue> -n <processors> -o <output.log> 
     -e <error.log> Rscript myscript.R

这会将您置于队列中并为您分配处理器数量(如果可用),您的作业将开始运行(取决于资源)。你可以pause,你restartsuspend工作.. 以及更多..qsub类似于这个概念。学习曲线可能有点陡峭,但值得。

于 2013-01-27T23:05:06.460 回答
5

我们在 Journal of Statistical Software(开放期刊)上写了一篇关于R 并行计算技术现状的调查论文。您可能会发现这作为介绍很有用。

于 2013-01-27T23:19:35.197 回答
2

消息传递接口做你想做的事,而且很容易做到。编译后,你需要运行:

mpirun -np [no.of.process] [executable]

您可以使用带有主机 ip 字段的简单文本文件选择在何处运行它,例如:

node01   192.168.0.1
node02   192.168.0.2
node03   192.168.0.3

这里有更多 MPI 的例子。

于 2013-01-27T23:11:32.323 回答