我想知道是否可以在5或6个核心的JAGS中细分3个链。这是我的代码:
library(parallel)
# There is no progression bar using parallel
jags.parallel(data = d$data,
inits = d$inits,
parameters.to.save = d$params,
model.file = model.jags,
n.chains = 3,
n.thin = 10,
n.iter = 9000,
n.burnin = 3000,
working.directory = NULL,
n.cluster = 3) ## the number of cluster it’s taking
正如您所看到的,这是默认值,此处的链数(nc
,在我的情况下为3)等于所使用的核心数。
Error in res[[ch]] : subscript out of bounds
。为什么? 我的电脑有16个内核,所以我在内核数量上有灵活性(还有64 GB的RAM和3 GHz的Intel Xeon E5处理器)。
答案 0 :(得分:6)
将3条链拆分为多个核心是不可能的。在并行运行JAGS时,实际上会发生这种情况:
为每个链执行指定的刻录。在您的示例中,三个链将运行模型3000步而不存储该信息。
一旦每条链都有适当的燃烧时间,你想从后验分布中得到的样本数量在每条链上均分。在您的示例中,每个链将运行采样器600步((n.iter -n.thin)/n.chains
)。
所以,让我们继续你的问题(上面解释了#1)。
答案取决于您当时在该计算机上做了什么。您永远不想在计算机的所有K核上运行它,因为它将占用您的大部分计算能力。我通常在K-1核心上运行K-1链以获得更大的型号。对于简单的模型,它并不重要。
您可以在较少的内核上运行多个链,但是由于核心上的每个链都必须按顺序计算,因此您的速度会降低。相反,将更少的链分配到多个核心上是行不通的。如果您有x
个链,则不应该> x cores
。
这可以通过问题2和3来解答。更多的链应该增加计算,但没有更多链的更多核不会。
如果不看你的模特,这真的无法回答。