gpt4 book ai didi

r - 使用 R 的 doParallel 包的多核计算是否会使用更多内存?

转载 作者:行者123 更新时间:2023-11-30 08:30:07 24 4
gpt4 key购买 nike

我刚刚测试了带有和不带有并行后端的弹性网络。调用的是:

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% 一起使用 - 不,对吗?

因为我对这是否是预期的结果感兴趣,这与这个问题密切相关,但并不完全相同,但我可以关闭这个问题并将我的问题合并到那个问题中(或者将其标记为重复)并指向这个,因为这有更多细节)如果这就是共识:

Extremely high memory consumption of new doParallel package

最佳答案

在多线程程序中,线程共享大量内存。它主要是线程之间不共享的堆栈。但是,引用 Dirk Eddelbuettel 的话说,“R 现在是、将来仍然是单线程的”,因此 R 并行包使用进程而不是线程,因此共享内存的机会要少得多。

但是,内存在 mclapply 派生的进程之间共享。 (只要进程不修改它,就会触发操作系统中内存区域的副本)。这就是使用“多核”API 与使用并行/doParallel 的“雪”API 相比,内存占用量可能更小的原因之一。

换句话说,使用:

registerDoParallel(7)

可能比使用以下内容更有效地使用内存:

cl <- makeCluster(7)
registerDoParallel(cl)

因为前者会导致%dopar%使用mclapply在 Linux 和 Mac OS X 上,而后者使用 clusterApplyLB .

但是,“snow”API 允许您使用多台机器,这意味着您的内存大小会随着 CPU 数量的增加而增加。这是一个很大的优势,因为它可以允许程序扩展。有些程序在集群上并行运行时甚至可以获得超线性加速,因为它们可以访问更多内存。

因此,为了回答你的第二个问题,我建议使用“多核”API 和 doParallel如果您只有一台计算机并使用 Linux 或 Mac OS X,但如果您使用集群,则对多台计算机使用“snow”API。我认为没有任何方法可以使用共享内存包,例如 Rdsmcaret包。

关于r - 使用 R 的 doParallel 包的多核计算是否会使用更多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com