【发布时间】:2013-10-12 18:45:58
【问题描述】:
我刚刚测试了一个有和没有并行后端的弹性网络。电话是:
enetGrid <- data.frame(.lambda=0,.fraction=c(.005))
ctrl <- trainControl( method="repeatedcv", repeats=5 )
enetTune <- train( x, y, method="enet", tuneGrid=enetGrid, trControl=ctrl, preProc=NULL )
我在没有注册并行后端的情况下运行它(并在 train 调用完成时收到来自 %dopar% 的警告消息),然后再次为 7 个内核(共 8 个)注册了一个。第一次运行耗时 529 秒,第二次耗时 313 秒。但第一次运行最大占用 3.3GB 内存(由 Sun 集群系统报告),第二次占用 22.9GB。我有 30GB 的内存,任务只会变得更加复杂。
问题:
1)这是并行计算的一般属性吗?我以为他们共享记忆......
2) 在train 中仍然使用enet 时有没有办法解决这个问题?如果doParallel 是问题所在,还有其他架构可以与%dopar% 一起使用--不,对吗?
因为我对这是否是预期结果感兴趣,所以这与此问题密切相关但并不完全相同,但我可以关闭此问题并将我的问题合并到那个问题中(或将其标记为重复)并指向这个,因为它有更多细节)如果这是共识:
【问题讨论】:
-
既然提到了“Sun 集群系统”,那么您是在集群上运行的吗?如果是这样,你(或者你可以)使用多个节点吗?集群的一大优势在于,您的内存大小会随着 CPU 数量的增加而增加,这与在单个多核机器上运行不同,这可以让问题扩展。
-
我所在的节点分配了 30GB 但物理 RAM 为 256GB,因此我可以要求更多内存。但问题有可能变得更大,我希望它能够合理扩展。
-
您可以尝试使用库(Rdsm),它使用共享内存(但据我所知,插入符号不支持),或者可能使用带有 foreach 和 doRedis 包的 rredis 来避免复制您所有线程中的数据,可以与插入符号一起使用,stackoverflow.com/questions/16615498/…
标签: r parallel-processing machine-learning