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 计算机上隐式创建集群对象。显然,初始化将实际执行并行计算的集群工作程序非常重要。
我应该做哪些更改才能在此处获得可重现的结果?我 运行 它多次,结果向量不同。感谢您的帮助。
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 计算机上隐式创建集群对象。显然,初始化将实际执行并行计算的集群工作程序非常重要。