我刚测试了有和没有平行后端的弹性网。电话是:
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%
一起使用的架构 - 不,对吧?
因为我对这是否是预期的结果感兴趣,这与这个问题密切相关但不完全相同,但是我可以很好地结束这个并将我的问题合并到那个(或标记为重复)并指出这一点,因为这有更详细的信息)如果这就是共识:
答案 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