如果有多个内核可用,某些R软件包具有可以并行工作的功能 - 例如,rstan
软件包可以并行运行多个MCMC链。当我使用例如doSNOW
和foreach
并行运行多个Stan进程时,我希望我的代码在两个级别并行运行*。取而代之的是,Stan流程被运到我的工作人员手中,并且似乎按顺序运行他们的链,好像一旦他们被分配到核心,他们就看不到机器的其他核心,并认为他们是单一的 - 核心机器。
有没有办法创建4核节点的集群,我可以将其传递给R中的某个并行化软件包,以便我可以从我的机器中获得最大的效率?
*说我有一台36核机器,9个Stan场景每个运行4个链。理想情况下,我有36个进程可以同时运行。现在,我一次使用9个内核,只要我希望它可以使用4倍。
答案 0 :(得分:0)
假设您有充分的理由不直接创建36个并行工作程序
(例如,如果你有一个计算集群或类似的东西),
然后以下应该工作
(以doParallel
为例):
library(doParallel)
# create "outer" workers
outer_workers <- makeCluster(2L)
# register outer_workers
registerDoParallel(outer_workers)
# create "inner" workers
clusterEvalQ(outer_workers, {
library(doParallel)
inner_workers <- makeCluster(2L)
# register inner_workers
registerDoParallel(inner_workers)
NULL
})
# assuming you use foreach directly
foreach(i = 1L:2L) %dopar% {
foreach(j = 1L:2L) %dopar% {
# code
}
NULL
}
# stop inner workers
clusterEvalQ(outer_workers, {
stopCluster(inner_workers)
registerDoSEQ()
NULL
})
stopCluster(outer_workers); registerDoSEQ()
此示例共创建4个进程, 2个外部和2个内部。 在您的示例中,您可以有9个外部进程和4个内部进程。