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

时间:2013-10-05 23:23:29

标签: r parallel-processing machine-learning

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

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的ram,而且任务从这里开始变得更加复杂。

问题: 1)这是并行计算的一般属性吗?我以为他们分享了记忆.... 2)在enet内使用train时是否可以解决此问题?如果doParallel出现问题,是否还有其他可以与%dopar%一起使用的架构 - 不,对吧?

因为我对这是否是预期的结果感兴趣,这与这个问题密切相关但不完全相同,但是我可以很好地结束这个并将我的问题合并到那个(或标记为重复)并指出这一点,因为这有更详细的信息)如果这就是共识:

Extremely high memory consumption of new doParallel package

2 个答案:

答案 0 :(得分:7)

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

但是,由mclapply分叉的进程之间共享内存(只​​要进程不修改它,它会触发操作系统中内存区域的副本)。这就是使用“多核”API而不是使用parallel / doParallel的“snow”API时内存占用量可能更小的一个原因。

换句话说,使用:

registerDoParallel(7)

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

cl <- makeCluster(7)
registerDoParallel(cl)

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

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

所以要回答你的第二个问题,如果你只有一台机器并使用Linux或Mac OS X,我会说使用“多核”API与doParallel,但使用“snow”API如果您正在使用群集,请使用多台计算机。我认为没有办法将Rdsm等共享内存包与caret包一起使用。

答案 1 :(得分: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