4

我刚刚测试了一个有和没有并行后端的弹性网络。电话是:

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 )

%dopar%我在没有注册并行后端的情况下运行它(并在调用完成时收到警告消息train),然后再次为 7 个内核(8 个)注册了一个。第一次运行耗时 529 秒,第二次耗时 313 秒。但第一次运行最大占用 3.3GB 内存(由 Sun 集群系统报告),第二次占用 22.9GB。我有 30GB 的内存,任务只会从这里变得更加复杂。

问题:1)这是并行计算的一般属性吗?enet我以为他们共享内存.... 2)在内部使用的同时有没有办法解决这个问题train?如果doParallel是问题所在,是否有其他架构可以与%dopar%--no 一起使用,对吗?

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

新的 doParallel 包的内存消耗极高

4

2 回答 2

8

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

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

换句话说,使用:

registerDoParallel(7)

可能比使用以下方法更节省内存:

cl <- makeCluster(7)
registerDoParallel(cl)

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

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

因此,要回答您的第二个问题,如果您只有一台机器并且使用 Linux 或 Mac OS X,我会说使用“多核”API doParallel,但如果您使用的是多台机器,请使用“雪”API一个集群。我认为没有任何方法可以使用共享内存包,例如Rdsmwithcaret包。

于 2013-10-07T15:42:46.240 回答
2

有最少数量的字符,否则我会简单地输入:1)是的。2)不,呃,也许。有些包使用“共享内存”模型进行并行计算,但 R 的经过更彻底测试的包不使用它。

http://www.stat.berkeley.edu/scf/paciorek-parallelWorkshop.pdf

http://heather.cs.ucdavis.edu/~matloff/158/PLN/ParProcBook.pdf

http://heather.cs.ucdavis.edu/Rdsm/BARUGSlides.pdf

于 2013-10-06T00:49:39.740 回答