R:并行完全可重现的结果

R: llply fully reproducible results in parallel

我应该做哪些更改才能在此处获得可重现的结果?我 运行 它多次,结果向量不同。感谢您的帮助。

cl <- makeCluster(2)

registerDoParallel(2)

set.seed(123)

results <- unlist(llply(seq_along(1:4), .fun = function(x){
  runif(1)} ,.parallel = T, 
  .paropts = list(.export=ls(.GlobalEnv))))


stopCluster(cl)

以下示例将在 Linux、Mac OS X 和 Windows 上给出可重现的结果:

library(plyr)
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
opts <- list(preschedule=TRUE)
clusterSetRNGStream(cl, 123)
r <- llply(1:20,
           .fun = function(x) runif(10),
           .parallel = TRUE,
           .paropts = list(.options.snow=opts))

需要 preschedule=TRUE 选项来防止 doParallel 使用负载平衡,这会使任务到 worker 的映射变得不可预测。

如果您正在使用 Linux 或 Mac OS X 并且您希望 doParallel 使用 mclapply,您可以使用这种方法:

if (.Platform$OS.type != "windows") {
  registerDoParallel(2)
  RNGkind("L'Ecuyer-CMRG")
  set.seed(123)
  mc.reset.stream()
  r <- llply(1:20,
             .fun = function(x) runif(10),
             .parallel = TRUE)
}

这是可行的,因为 mclapply 默认使用预先安排。它不会在 Windows 上工作,因为 doParallel 将隐式创建一个集群对象,并且 RNG 初始化不会有任何影响。

请注意,在您的示例中,您正在创建一个集群对象但没有注册它,因此它不会被 doParallel 使用。您必须使用 registerDoParallel(cl),否则 doParallel 将在 Posix 计算机上使用 mclapply 或在 Windows 计算机上隐式创建集群对象。显然,初始化将实际执行并行计算的集群工作程序非常重要。