【问题标题】:Is it possible to run multiple chains with JAGS on multiple cores (subdividing chains)是否可以在多个核心上使用 JAGS 运行多个链(细分链)
【发布时间】:2016-05-24 15:50:42
【问题描述】:

例如,我想知道是否可以在 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 处理器)。

【问题讨论】:

  • 你不能将一条链拆分到多个核心,因为链的每次迭代都依赖于上一次迭代。

标签: r parallel-processing bayesian mcmc jags


【解决方案1】:

不可能将 3 个链拆分到多个核心上。当并行运行 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. 如果不查看您的模型,这确实无法回答。

【讨论】:

  • (n.iter - n.burnin)/n.thin 的样本取自每个链(不是 n.iter * n.thin/n.chains)。因此对于 OP 的示例,每个链将返回 600 次迭代 ((9000-6000)/10)。
  • rjags 是这样的吗?我主要使用runjags,它会根据变薄的程度增加迭代次数。我会相应地编辑答案。
  • 我很确定jags.parallel 来自R2jags,它按照我的描述计算它(我很确定......)。不确定rjags - 我以为是一样的。
  • 有人告诉我,使用这个包可以在更多内核上运行 3 个链:cran.r-project.org/web/packages/Rmpi/index.html。但是我必须添加很多代码。
猜你喜欢
  • 2011-05-19
  • 2022-01-16
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多