【问题标题】:Does multicore computing using R's doParallel package use more memory?使用 R 的 doParallel 包进行多核计算是否使用更多内存?
【发布时间】: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% 一起使用--不,对吗?

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

Extremely high memory consumption of new doParallel package

【问题讨论】:

  • 既然提到了“Sun 集群系统”,那么您是在集群上运行的吗?如果是这样,你(或者你可以)使用多个节点吗?集群的一大优势在于,您的内存大小会随着 CPU 数量的增加而增加,这与在单个多核机器上运行不同,这可以让问题扩展。
  • 我所在的节点分配了 30GB 但物理 RAM 为 256GB,因此我可以要求更多内存。但问题有可能变得更大,我希望它能够合理扩展。
  • 您可以尝试使用库(Rdsm),它使用共享内存(但据我所知,插入符号不支持),或者可能使用带有 foreach 和 doRedis 包的 rredis 来避免复制您所有线程中的数据,可以与插入符号一起使用,stackoverflow.com/questions/16615498/…

标签: r parallel-processing machine-learning


【解决方案1】:

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

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

换句话说,使用:

registerDoParallel(7)

可能比使用更节省内存:

cl <- makeCluster(7)
registerDoParallel(cl)

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

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

所以要回答您的第二个问题,如果您只有一台机器并且使用 Linux 或 Mac OS X,我会说使用带有 doParallel 的“多核”API,但使用带有多个的“雪”API如果您使用的是集群,则为机器。我认为没有任何方法可以将Rdsm 之类的共享内存包与caret 包一起使用。

【讨论】:

  • 史蒂夫,在 Windows 64 位的限制下,您有什么建议?当我将任务拆分为多个进程时,我遇到了内存消耗问题,每个进程都需要一个相当大的 data.table 的副本。
  • @MattWeller 选择不多,因为我认为 data.table 不支持使用内存映射。 bigmemory 包可以,但在 Windows 上可能难以使用,因为 CRAN 上没有可用的二进制分发版。您可以尝试在多台机器上并行运行,但在 Windows 上这很困难,因为您需要安装 MPI 发行版,例如 DeinoMPI 或 MPICH。
  • 使用您在另一个线程上关于iterators 的建议,我设法让事情正常进行。这意味着data.table 被拆分并传递给工作进程。感谢其他提示。
  • 看来 CRAN 没有可用的 Windows 二进制文件,但对我来说,在 R 3.1.1 下,这可以在 Windows 上安装 bigmemory: install.packages(c("BH","biglm" )) install.packages("bigmemory", repos="R-Forge.R-project.org") install.packages("bigmemory.sri", repos="R-Forge.R-project.org") install.packages("biganalytics", repos="R-Forge.R-project.org") 安装.packages("bigalgebra", repos="R-Forge.R-project.org") 库(bigmemory)
  • 或者这是一个更新的版本,也适用于 Windows: install.packages(c("BH","biglm"));库(开发工具); devtools::install_github('kaneplusplus/bigmemory');库(大内存); devtools::install_github('tomwenseleers/Rdsm');图书馆(Rdsm)
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多