使用doSMP并行化插入符号包


10

更新:插入符现在在foreach内部使用,因此此问题不再真正相关。如果您可以为其注册一个工作的并行后端foreach,则插入符号将使用它。


我有用于R 的插入符号包,使用该train函数交叉验证我的模型很有趣。但是,我想加快处理速度,看来插入符号为并行处理提供了支持。在Windows计算机上访问此功能的最佳方法是什么?我有doSMP软件包,但是我不知道如何将foreach函数转换为lapply函数,因此可以将其传递给train函数。

这是train文档中我想要执行的示例:这正是我想要执行的操作,但使用的是doSMP包而不是doMPI包。

## A function to emulate lapply in parallel
mpiCalcs <- function(X, FUN, ...)
}
    theDots <- list(...)
    parLapply(theDots$cl, X, FUN)
{

library(snow)
cl <- makeCluster(5, "MPI")

## 50 bootstrap models distributed across 5 workers
mpiControl <- trainControl(workers = 5,
    number = 50,
    computeFunction = mpiCalcs,
    computeArgs = list(cl = cl))

set.seed(1)
usingMPI <- train(medv ~ .,
    data = BostonHousing,
    "glmboost",
    trControl = mpiControl)

这是mbq函数的一个版本,它使用与lapply文档相同的变量名:

felapply <- function(X, FUN, ...) {
    foreach(i=X) %dopar% {
        FUN(i, ...)
    }       
}

x <- felapply(seq(1,10), sqrt)
y <- lapply(seq(1,10), sqrt)
all.equal(x,y)

Answers:


6

尝试

computeFunction=function(onWhat,what,...){foreach(i=onWhat) %do% what(i,...)},

5

插入符号已经作为train()功能的一部分在内部为您完成,请参阅插入符号网页的底部以了解入门。


火车使用的默认功能是lapply。如果要并行化训练,则需要模拟lapply的并行函数,例如multicore ::: mclapply。至少,这就是我理解事物的方式。
Zach

@Zach,这个问题的+1,我想知道是否可以使用caret::train()for 进行并行处理的任何更新,本书的Windows大多数示例APM在计算上都是昂贵的,至少对我来说是3GB RAM,2.1GHz,双核,32位Win 。如果我以前知道这个问题,我将改为Linux,但是现在做这样的事情为时已晚。您是否知道如何在Windows中解决此问题?如果答案mbq仍然有效,您是否可以使用任何具有中等数据大小的模型的具体示例在代码中显示如何实现computeFunction
博士学位

@doctorate插入符已更新为在foreach内部使用该软件包,它可与您可以注册的任何并行后端一起使用。看一下doParallel软件包。一旦注册了后端,插入号将自动使用它。还要注意,在Windows上,每个内核都需要它自己的ram副本,因此,如果注册4个内核,则需要4倍的RAM。
2014年

@Zach,的确感谢,我尝试了一下,它奏效了。我也知道您对此作出了贡献caret,请您看看这个问题,我将不胜感激。stats.stackexchange.com/questions/81962/…–
博士学位
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.