与foreach并行预测nnet输出时内存膨胀

与foreach并行预测nnet输出时内存膨胀,r,parallel-processing,neural-network,doparallel,nnet,R,Parallel Processing,Neural Network,Doparallel,Nnet,我有一个(大型)神经网络,由R中的nnet软件包进行训练。我希望能够模拟来自这个神经网络的预测,并使用类似foreach的东西以并行方式进行模拟,我以前成功地使用过它(都在Windows机器上) 我的代码基本上就是这样的形式 library(nnet) data = data.frame(out=c(0, 0.1, 0.4, 0.6), in1=c(1, 2, 3, 4), in2=c(10, 4, 2, 6)) net = nnet(

我有一个(大型)神经网络,由R中的nnet软件包进行训练。我希望能够模拟来自这个神经网络的预测,并使用类似foreach的东西以并行方式进行模拟,我以前成功地使用过它(都在Windows机器上)

我的代码基本上就是这样的形式

library(nnet)

data = data.frame(out=c(0, 0.1, 0.4, 0.6),
              in1=c(1, 2, 3, 4),
              in2=c(10, 4, 2, 6))

net = nnet(out ~ in1 + in2, data=data, size=5)

library(doParallel)
registerDoParallel(cores=detectCores()-2)

results = foreach(test=1:10, .combine=rbind, .packages=c("nnet")) %dopar% {
  result = predict(net, newdata = data.frame(in1=test, in2=5))
  return(result)
}
除非拟合和预测的神经网络要大得多;大约300MB

当使用传统的for循环或使用%do%时,上面的代码运行良好,但当使用%dopar%时,每个正在使用的核心的所有内容都会加载到内存中,每个核心大约700MB。如果我运行足够长的时间,一切最终都会爆炸

在查找了类似的问题之后,我仍然不知道是什么导致了这种情况。省略“预测”部分可以使一切顺利进行


如何让每个核心查找都保持不变的“网络”,而不是将其加载到内存中?还是不可能?

当您启动新的并行工作程序时,您实际上是在创建一个新的环境,这意味着您在该新环境中执行的任何操作都需要访问相关的变量/函数

例如,您必须指定
.packages=c(“nnet”)
,因为您需要在每个新工作环境(environment)中使用
nnet
包,这就是您从全局环境“克隆”或“导出”到每个工作环境的方式

因为你需要经过训练的神经网络来进行预测,你也需要将它输出给每个工作人员,我看不出有什么办法可以解决你正在经历的记忆膨胀问题。如果您仍然对并行化感兴趣,但内存不足,我唯一的建议是查看
doMPI

如何让每个核心查找都保持不变的“网络”,而不是将其加载到内存中?还是不可能

CPak的回答解释了发生了什么;您在单独的R会话中有效地运行了主脚本的多个副本(=工作者)。既然你在Windows上,打电话

registerDoParallel(cores = n)
扩展到:

cl <- parallel::makeCluster(n, type = "PSOCK")
registerDoParallel(cl)
cl