在并行R中运行多个并行进程

时间:2018-12-03 15:54:01

标签: r foreach parallel-processing runjags

我使用R中的runjags包在单独的处理节点上对每个链运行贝叶斯统计模型。我想一次使用{{ 1}}包。但是,这通常会导致错误消息,可能是因为run.jags循环不“知道”该循环内我正在调用其他并行进程,因此内核可能被双重分配了(或其他)。这是示例错误消息:

  

{中的错误:         任务2失败-“尝试运行JAGS模型时遇到以下错误:
         socketConnection(“ localhost”中的错误,端口=端口,服务器= TRUE,阻止= TRUE ,:         无法打开连接

这是一些示例代码,用于生成数据并适合两个模型,每个模型需要2个内核(总共需要4个内核,我在笔记本电脑上拥有)。我很想找到一个解决方案,使我可以并行运行多个并行JAGS模型。实际上,我一次在群集上运行5-10个模型,每个模型需要3个内核。

foreach

2 个答案:

答案 0 :(得分:1)

我无法运行您的示例,但是以下小插图应该可以帮助您。

您可能想尝试使用foreach嵌套运算符%:%

https://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf

foreach(i = 1:length(y.list)) %:% {
    #specify data object.
    jd <- list(y=y.list[[i]], N = length(y.list[[i]]))
    #fit model.
    jags.out <- run.jags(jags.model,
                         data=jd,
                         n.chains=2,
                         monitor=c('intercept','tau'),
                         method='rjparallel')
    #return output
    return(jags.out)
}

答案 1 :(得分:1)

这里有两件事要考虑-一般如何嵌套并行foreach()循环,以及如何解决此特定问题。

嵌套并行foreach()循环的解决方案来自@Carlos Santillan的以下回答,该解决方案基于可以发现here的小插图。可以说,我们有一个内部循环嵌套在一个外部循环中,类似于上面的问题,但是除了并行调用run.jags之外,我们还有一个并行foreach()调用:

outer_list <- list()
#begin outer loop:
outer_list <-
foreach(i = 1:length(some_index)) %:% {
    #grab something to feed next foreach loop.
    to_inner <- grab_data[[i]]

    #Do something in a nested foreach loop.
    inner_list <- list()
    #begin inner loop:
    inner_list <-
    foreach(k = 1:some_index) %dopar% {
      #do some other function.
      out_inner <- some_function(to_inner)
      return(out_inner)
      }
   out_outer <- some_function(out_inner)
   return(out_outer)
}

键在外部循环中使用%:%运算符,在内部循环中使用%dopar%运算符。

但是,由于它不是嵌套的run.jags()循环,因此无法解决上面的foreach()嵌套并行问题。为了解决这个特定的嵌套run.jags()问题,我将run.jags中的method设置更改为method=parallel而不是method=rjparallelrun.jags()有多种不同的并行实现,并且根据我的时序分析,这一特定实现似乎可以正常工作。希望将来,对于为什么可以有一个更明确的答案。我只知道它确实有效。