【问题标题】:Parallelizing on a supercomputer and then combining the parallel results (R)在超级计算机上并行化,然后合并并行结果 (R)
【发布时间】:2013-01-27 23:02:27
【问题描述】:

我可以访问一个强大的大型集群。我是一名中规中矩的 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。不幸的是,我找到的文件并不是特别容易理解。

提前致谢!

【问题讨论】:

  • 检查parallel 包。
  • 如果您使用的是超级计算机,它可能会使用OpenMPI 或类似的东西。如果是这种情况,您必须直接使用 snow 之类的东西(尽管新的并行库可能支持 MPI)。我有关于如何设置 R 以在俄亥俄超级计算机 here 上使用的说明以及对雪的简单介绍 here
  • @ACD 如果您能提供有关您使用的系统类型和运行的软件的更多信息,这将有助于我们回答您的问题。

标签: r bash statistics cluster-computing


【解决方案1】:

您可以将plyrdoMC 包(即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 的示例):

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

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

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

【讨论】:

  • 这行得通,谢谢!至于 LSF 和 bsub,我不知道你在说什么,到目前为止,我无法理解维基百科的链接。还是个大菜鸟!但比我几天前少了。
  • 嗯,实际上,我赞成你的回答,因为它是一个直接的帮助。但事实证明还有更多。显然我需要弄清楚如何使用称为“PBS”的东西和一些称为“qsub”的命令将我的 R 脚本变成“作业”。 doMC 并没有真正让我到达那里,而且似乎计算机管理员已经限制了我?昨天更快了。
  • @ACD 另请查看我在对您的问题的评论中提供的链接。我有关于如何为运行 MPI 的超级计算机设置 PBS 文件等的说明。
【解决方案2】:

我们在 Journal of Statistical Software(开放期刊)上写了一篇关于 State of of the Art in Parallel Computing with R 的调查论文。作为介绍,您可能会发现这很有用。

【讨论】:

    【解决方案3】:

    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 示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-09
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多