Stan 是Gelman 等人的新贝叶斯分析软件。
我猜,RStan 是一种从 R 中调用 Stan 的方法。
Stan / RStan 是否会在具有 Linux 操作系统的超级计算机上运行,如果可以,它能否利用超级计算机的多处理器?我被告知 WinBUGS 不会在 Linux 机器上运行和/或不能利用超级计算机的多处理器。
我正在寻找一种方法来加快贝叶斯分析 - 从几周到几天/几小时。
Stan 和 rstan 应该在支持依赖项的 Linux、Mac 或 Windows 上运行。我们尚未在 BSD 或 Oracle 上进行测试,但我们希望它们可以与 g++ 或 clang 编译器一起使用(尽管不是 Oracle 编译器)。
Stan 或 rstan 中没有明确的并行代码,但也没有任何代码可以阻止二进制文件同时被多个进程执行。例如,如果您在 bash shell 的命令行中使用 Stan,您可以执行类似的操作
./my_model --data=my_data.dump --seed=12345 --chain_id=1 --samples=samples_1.csv &
./my_model --data=my_data.dump --seed=12345 --chain_id=2 --samples=samples_2.csv &
等等,你喜欢多少链子都行。并行执行时使用相同的种子但不同的chain_id很重要。
如果您使用的是 rstan 包,则可以stan()
使用 R 和您的操作系统支持的任何并行引擎调用 main 函数。同样,最好传递相同的种子和不同的chain_id。截至rstan v1.0.3
(尚未发布),有一个函数调用,它获取可能已并行生成sflist2stanfit()
的对象列表,并将它们组合成单个对象以进行分析。stanfit
stanfit
有关更多信息,请参阅专门用于并行执行的线程
https://groups.google.com/d/topic/stan-users/3goteHAsJGs/discussion
我写道,我会发布我学到的东西。
大学超级计算中心相信 RStan 将在他们的机器上运行。但是,我必须申请一个帐户,这可能需要一些时间。因此,我不确定 RStan 是否会在这些机器上运行一段时间。他们设施的正式名称是“北极地区超级计算中心”。
我在桌面上安装 RStan 时遇到了麻烦,不得不寻求 OIT 的帮助。所以,这里是我使用的步骤和 OIT 绅士使用的代码。我有一个 Windows 7 Professional 操作系统。
我不得不使用 R 2.15.1
我将 R 安装在目录 'C:\R\R-2.15.1' 中,因此目录名称中不会有空格
我必须安装 Rtools。
我在目录“C:\Rtools”中安装了 Rtools
确保 Rtools 出现在路径中,以便 R 可以在 Rtools 中找到 C++ 编译器
去检查:
计算机,属性,高级系统设置,环境变量,路径。
我想我应该同时包括:'c:\Rtools\bin' 和:'c:\Rtools\gcc-4.6.3\bin'
打开 R
这是要键入的 R 代码(此代码出现在此处: http ://code.google.com/p/stan/wiki/RStanGettingStarted ):
install.packages('内联')
install.packages('Rcpp')
install.packages('RcppEigen')
选项(repos = c(getOption("repos"), rstan = "http://wiki.stan.googlecode.com/git/R"))
install.packages('rstan', type = 'source')
图书馆(斯坦)
然后我从这里运行了学校的例子:
http://code.google.com/p/stan/wiki/RStanGettingStarted
上周,我一直在尝试使用 pdf 文件“stan-reference-1.0.2”中包含的说明来安装 STAN,而不是上面链接中的说明。
我希望这对其他人有帮助。如果当我知道 RStan 是否肯定会在 Supercomputing Center 机器上运行时,我会在这里发布我学到的东西。
我没有卸载 STAN 来测试上述过程。希望我在上述步骤中没有犯任何错误。
这是一个将源代码作为文本的具体并行化函数:
library(rstan)
library(parallel)
parallel_stan <- function(code, data, cores=detectCores(), chains=8, iter=2000, seed=1234) {
cat("parallel_stan: cores=", cores, ", chains=", chains, ", iter=", iter, ", seed=", seed, "\n", sep="")
cat("--- Step 1: compile the model (and run it once, very briefly, ignoring its output)\n")
f1 = stan(model_code = code, data = data, iter = 1, seed = seed, chains = 1, chain_id = 1)
cat("--- Step 2: run more chains in parallel\n")
sflist <- mclapply(
1:chains
, mc.cores = cores
, function(i) stan(fit = f1, data = data, iter = iter, seed = seed, chains = 1, chain_id = i)
)
# ... passing the same seed to all chains follows example(sflist2stanfit)
# ... important to use the same seed but different chain_id when executing in parallel
cat("--- Finished.\n")
return(sflist2stanfit(sflist))
}
RSeek 搜索(对于:Rstan gelman)的第一次点击在点击一个链接后产生了这个:
https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started
它还没有在 CRAN 上。
这是关于贝叶斯 MCMC 计算的一般性评论。
通常超级计算机运行服务器级处理器而不是桌面级。Stan 和其他 MCMC 程序几乎总是在每个链的基础上非常严格地串行,也就是说,你很少有可能通过拥有多个处理器来获得单个链的加速。我们有一个小型集群,其中有一台双至强级服务器和几台普通台式机作为工作站。只要您保持在 16GB RAM 的限制 范围内,工作站中的 Core-i7s 处理器在进行实际计算时通常比服务器快40% 左右。
进行此类计算的最快机器可能是具有水冷 CPU 的超频定制游戏机。
也就是说,您当然可以像上面指出的那样并行运行不同的链。