【问题标题】:R: llply fully reproducible results in parallelR:llply 并行完全可重现的结果
【发布时间】:2016-01-22 11:57:25
【问题描述】:

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

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)

【问题讨论】:

    标签: r parallel-processing plyr


    【解决方案1】:

    以下示例将在 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 使用负载平衡,这会使任务到工作人员的映射变得不可预测。

    如果您使用的是 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 计算机上使用隐式创建的集群对象。显然,初始化将实际执行并行计算的集群工作者非常重要。

    【讨论】:

    • 感谢您的详细回答是的,我正在尝试编写适用于任何操作系统的代码。因此,您的第一个解决方案是我正在使用的解决方案。谢谢!。让我问你后续问题: .options.multicore 和 .options.snow 有什么区别?为什么使用向量 c(1,2,3,4,5,6,7) 作为 set.seed 而不是整数。如果你有一个自定义函数,而不是 runif(10),那么它里面有一个“set.seed(1234)”。应该删除该 set.seed 以避免新的多线程冲突,该冲突不允许重现性?
    • @donpresente .options.multicore 仅由“mclapply”后端使用,而 .options.snow 仅由“cluster”后端使用。它允许您在不丢失可移植性的情况下传递后端特定选项。
    • @donpresente 我应该将 123 传递给 clusterSetRNGStream。我混淆了一些使用 L'Ecuyer-CMRG 生成器使用的 7 整数种子的内部函数。我在回答中修正了这个错误。
    • 太棒了!再次感谢! 3 篇文章中关于并行化的完整课程:)
    猜你喜欢
    • 2021-05-31
    • 2012-11-04
    • 2019-09-29
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多