是否可以 运行 多个链与多个核心上的 JAGS(细分链)

Is it possible to run multiple chains with JAGS on multiple cores (subdividing chains)

我想知道是否可以在 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?)的情况下使脚本更快?

我的电脑有 16 个内核,所以我可以灵活选择内核数量(还有 64 GB RAM 和 3 GHz Intel Xeon E5 处理器)。

不可能将 3 个链拆分到多个核心上。当 运行ning JAGS 在此处并行时实际上发生了什么:

  1. 对每个链进行指定的老化。在您的示例中,三个链将 运行 3000 步的模型并且不存储该信息。

  2. 一旦每条链都及时进行了适当的燃烧,您希望从后验分布中获得的样本数量就会平均分配到每条链上。在您的示例中,每个链将 运行 采样器进行 600 步 ((n.iter -n.thin)/n.chains)。

那么,让我们继续回答您的问题(#1 已在上面进行了解释)。

  1. 这个问题的答案将取决于您当时在那台计算机上还做了什么。你永远不想 运行 它在你计算机的所有 K 核上,因为它会占用你的大部分计算能力。对于较大的模型,我通常 运行 K-1 链在 K-1 核心上。对于简单的模型,这并不重要。

  2. 您可以在更少的核心上拥有多个链 运行,但是您会减慢速度,因为核心上的每个链都必须按顺序计算。相反,将更少的链外包到多个核心上是行不通的。如果你有 x 链,你不应该有 > x cores.

  3. 这通过问题 2 和 3 得到了回答。更多的链应该增加计算,但是没有更多链的更多核心不会。

  4. 如果不看你的模型,这个问题真的无法回答。