我使用R中的runjags
包在单独的处理节点上对每个链运行贝叶斯统计模型。我想一次使用{{ 1}}包。但是,这通常会导致错误消息,可能是因为run.jags
循环不“知道”该循环内我正在调用其他并行进程,因此内核可能被双重分配了(或其他)。这是示例错误消息:
{中的错误: 任务2失败-“尝试运行JAGS模型时遇到以下错误:
socketConnection(“ localhost”中的错误,端口=端口,服务器= TRUE,阻止= TRUE ,: 无法打开连接
这是一些示例代码,用于生成数据并适合两个模型,每个模型需要2个内核(总共需要4个内核,我在笔记本电脑上拥有)。我很想找到一个解决方案,使我可以并行运行多个并行JAGS模型。实际上,我一次在群集上运行5-10个模型,每个模型需要3个内核。
foreach
答案 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=rjparallel
。 run.jags()
有多种不同的并行实现,并且根据我的时序分析,这一特定实现似乎可以正常工作。希望将来,对于为什么可以有一个更明确的答案。我只知道它确实有效。