微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与降雪库并行化的结果不可重现?

如何解决与降雪库并行化的结果不可重现?

每次运行以下代码时,向量 result_seq 中的数字保持不变,因为我在生成向量之前使用了 set.seed(11)

然而,似乎即使我在生成 set.seed(11) 中的数字之前再次使用了 result_par,但每次运行代码时数字都会改变。

library(sNowfall)
sNowfall::sfInit(parallel = TRUE,cpus = 4)

testFun = function(i) {
  result <- rnorm(1,10,3)
}

nsim <- 10

set.seed(11)
result_seq <- sapply(1:nsim,testFun)
print(mean(result_seq))

set.seed(11)
result_par <- sfLapply(1:nsim,testFun)
print(mean(as.numeric(result_par)))

为什么会这样?如何确保在降雪并行化过程中生成随机数具有可重现性?

解决方法

由于 R 是单线程的,任何代码的并行化实际上都会启动多个会话。因此,您实际上在 sfLapply() 中分出 4 个单独的“子”会话,并且种子设置仅在您的“父”会话中发生一次。 “子”会话不知道其他会话,因此不知道您想在每个会话中重新设置种子。

您可以将 set.seed() 移动到 testFun() 来解决此问题:

testFun = function(i) {
  set.seed(11)
  result <- rnorm(1,10,3)
}

sfExport 可能值得探索,因为它旨在将参数分发到“子”会话以用于此类上下文。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。