我正在运行贝叶斯MCMC概率模型,我正在尝试并行实现它。在比较并行和串行时,我的机器性能令人困惑。我没有很多做并行处理的经验,所以我可能做得不对。
我在MCMCprobit
包中使用MCMCpack
作为probit模型,对于并行处理,我在parLapply
包中使用parallel
。
以下是我的串行运行代码以及system.time
的结果:
system.time(serial<-MCMCprobit(formula=econ_model,data=mydata,mcmc=10000,burnin=100))
user system elapsed
657.36 73.69 737.82
这是我的并行运行代码:
#Setting up the functions for parLapply:
probit_modeling <- function(...) {
args <- list(...)
library(MCMCpack)
MCMCprobit(formula=args$model, data=args$data, burnin=args$burnin, mcmc=args$mcmc, thin=1)
}
probit_Parallel <- function(mc, model, data,burnin,mcmc) {
cl <- makeCluster(mc)
## To make this reproducible:
clusterSetRNGStream(cl, 123)
library(MCMCpack) # needed for c() method on master
probit.res <- do.call(c, parLapply(cl, seq_len(mc), probit_modeling, model=model, data=data,
mcmc=mcmc,burnin=burnin))
stopCluster(cl)
return(probit.res)
}
system.time(test<-probit_Parallel(model=econ_model,data=mydata,mcmc=10000,burnin=100,mc=2))
来自system.time
的结果:
user system elapsed
0.26 0.53 1097.25
任何想法为什么用户和系统时间对于并行进程来说会短得多,但是经过的时间要长得多?我在较短的MCMC运行(100和1000)上尝试了它,故事是一样的。我假设我在某个地方犯了错误。
以下是我的电脑规格:
答案 0 :(得分:2)
在我看来,两个工作人员所做的工作与顺序版本中的工作量相同。工作人员应该只执行总工作的一小部分,以便比代码的顺序版本执行得更快。这可以通过将mcmc
除以此示例中的工作人员数量来实现,尽管这可能不是您真正想做的事情。
我认为这解释了system.time
报告的漫长时间。 &#34;用户&#34;和&#34;系统&#34;时间很短,因为它们是主进程的时间,在执行parLapply
时使用非常少的CPU时间:system.time
报告的工作人员使用的是真正的CPU时间。 / p>