是否可以在多个核心(细分链)上使用JAGS运行多个链

时间:2016-05-24 15:50:43

标签: r parallel-processing bayesian mcmc jags

我想知道是否可以在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)等于所使用的核心数。

  1. 这对MCMC的采样方式有何影响?
  2. 并行运行MCMC链时,是否有与R一起使用的最佳核心数?
  3. 我看到如果我有3个链子,我就不能进入3个核心。它给了我errorError in res[[ch]] : subscript out of bounds。为什么?
  4. 如果我增加内核数量,则需要更长的时间(相比之下,12个内核需要比3个内核多7.2个时间)!不应该是相反的吗?
  5. 如何在不删除迭代,老化或添加细化(更多核心?,更改RAM?)的情况下更快地编写脚本?
  6. 我的电脑有16个内核,所以我在内核数量上有灵活性(还有64 GB的RAM和3 GHz的Intel Xeon E5处理器)。

1 个答案:

答案 0 :(得分:6)

将3条链拆分为多个核心是不可能的。在并行运行JAGS时,实际上会发生这种情况:

  1. 为每个链执行指定的刻录。在您的示例中,三个链将运行模型3000步而不存储该信息。

  2. 一旦每条链都有适当的燃烧时间,你想从后验分布中得到的样本数量在每条链上均分。在您的示例中,每个链将运行采样器600步((n.iter -n.thin)/n.chains)。

  3. 所以,让我们继续你的问题(上面解释了#1)。

    1. 答案取决于您当时在该计算机上做了什么。您永远不想在计算机的所有K核上运行它,因为它将占用您的大部分计算能力。我通常在K-1核心上运行K-1链以获得更大的型号。对于简单的模型,它并不重要。

    2. 您可以在较少的内核上运行多个链,但是由于核心上的每个链都必须按顺序计算,因此您的速度会降低。相反,将更少的链分配到多个核心上是行不通的。如果您有x个链,则不应该> x cores

    3. 这可以通过问题2和3来解答。更多的链应该增加计算,但没有更多链的更多核不会。

    4. 如果不看你的模特,这真的无法回答。