【问题标题】:All parallel processes in foreach loop in R generating same resultsR中foreach循环中的所有并行进程生成相同的结果
【发布时间】:2022-01-21 14:43:00
【问题描述】:

我使用foreach() 循环并行生成随机数组。但是我在所有并行过程中都得到了相同的结果。如何在每个并行进程中添加随机性,使每个进程彼此不同?

library(doFuture)
library(foreach)

# Parallel programming
registerDoFuture()
plan(multicore, workers = 3)


res = foreach(iter = 1:3) %dopar%
{
  
  # generate random array
  x = runif(n = 5)
  
}

所有并行生成的数组都是一样的

> res
[[1]]
[1] 0.55882648 0.73863525 0.51284839 0.01454722 0.08909375

[[2]]
[1] 0.55882648 0.73863525 0.51284839 0.01454722 0.08909375

[[3]]
[1] 0.55882648 0.73863525 0.51284839 0.01454722 0.08909375

【问题讨论】:

  • 必须与set.seed中的RNGkind相关。例如对我来说,它工作正常。可以试试改成set.seed(1, kind = "L'Ecuyer-CMRG")
  • 有一个警告说1: UNRELIABLE VALUE: One of the foreach() iterations (‘doFuture-1’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, use '%dorng%' from the 'doRNG' package instead of '%dopar%'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method.
  • 对于协议:plan 的第一次运行我收到了警告...Forked processing ('multicore') is not supported when running R from RStudio...。所以我在控制台中尝试了原始代码,它运行良好。

标签: r foreach parallel.foreach


【解决方案1】:

如果我们运行 OP 的代码,会有警告消息建议使用 doRNG 包中的 %dorng%

警告信息: 1:不可靠的值:foreach() 迭代之一(“doFuture-1”)意外生成随机数而没有声明。存在这些随机数在统计上不可靠并且总体结果可能无效的风险。要解决此问题,请使用“doRNG”包中的“%dorng%”而不是“%dopar%”。这可确保通过 L'Ecuyer-CMRG 方法生成正确的、并行安全的随机数。要禁用此检查,请将选项“future.rng.onMisuse”设置为“忽略”。 ...

因此,加载包并使用%dorng% 代替%dopar%

library(doFuture)
library(foreach)
library(doRNG)

# Parallel programming
registerDoFuture()
plan(multicore, workers = 3)

res = foreach(iter = 1:3) %dorng%
 {
   # generate random array
   x = runif(n = 5)
 }
res
[[1]]
[1] 0.1058127 0.4715034 0.9921409 0.3633179 0.9830486

[[2]]
[1] 0.2801489 0.1372907 0.6491732 0.6267578 0.1657053

[[3]]
[1] 0.8981384 0.8950956 0.4003182 0.9338281 0.9706626
attr(,"rng")
attr(,"rng")[[1]]
[1]       10407    41337137 -1038536386  -420834137  1745650876  2038421133 -1613694998

attr(,"rng")[[2]]
[1]       10407 -1775499178   -92726601 -1608089308   992801654   241903385  2115481412

attr(,"rng")[[3]]
[1]       10407  1979572086 -1800896478  -210258865   856919030   298818868  1787849826

【讨论】:

  • 谢谢@akrun。我有一个后续问题 - 如果我使用 foreach 循环在 keras 中并行训练 10 个 ANN(理想情况下,每次训练都应该从不同的随机初始权重开始。)。这是否意味着 %dopar% 从相同的初始随机权重开始所有 ANN 训练。如果我使用 %doRNG% ,它将允许每次训练从不同的初始权重开始。
  • @SiH 我想是的。否则,您可能必须将 set.seedkind 值添加为 set.seed(1, kind = "L'Ecuyer-CMRG") sing %dopar%
  • 所以如果我并行训练 10 个人工神经网络(每个需要 1 小时)。我应该使用 %doRNG% 而不是 %dopar% 来确保在所有并行训练中具有不同的初始随机权重。
  • 好的,谢谢,这是个好主意。rdocumentation 写道 - %dorng% 提供了一个替代运算符 %dopar%,以确保可重现的 foreach 循环。 reproducible foreach loops是什么意思,我只是想让每个并行训练过程从不同的随机权重开始
  • 知道了,非常感谢
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多