Paralelizando o pacote de interpolação usando doSMP

10

ATUALIZAÇÃO: o sinal de intercalação agora usa foreachinternamente, portanto, essa pergunta não é mais realmente relevante. Se você pode registrar um back-end paralelo em funcionamento foreach, o caret o usará.


Eu tenho o pacote de interpolação para R e sou interessante em usar a trainfunção para validar cruzadamente meus modelos. No entanto, quero acelerar as coisas e parece que o sinal de intercalação fornece suporte para processamento paralelo. Qual é a melhor maneira de acessar esse recurso em uma máquina Windows? Eu tenho o pacote doSMP , mas não consigo descobrir como converter a foreachfunção em uma lapplyfunção, para que eu possa passar para a trainfunção.

Aqui está um exemplo do que eu quero fazer, a partir da traindocumentação: É exatamente isso que eu quero fazer, mas usando o doSMPpacote, e não o doMPIpacote.

## 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)

Aqui está uma versão da função mbq que usa os mesmos nomes de variáveis ​​que a documentação da 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)
Zach
fonte

Respostas:

6

Tentar

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

fonte
5

A Caret já faz isso internamente para você como parte da train()função; consulte a seção inferior da página da Web sobre caret para iniciantes.

Dirk Eddelbuettel
fonte
A função padrão usada pelo trem é lapply. Se você deseja paralelizar o trem, precisa de uma função paralela que imite o lapply, como multicore ::: mclapply. Pelo menos, é assim que eu entendo as coisas.
Zach
@Zach, +1 para esta pergunta, gostaria de saber há alguma atualização de como se pode fazer o processamento paralelo com caret::train()para Windows, a maioria dos exemplos de APMlivro são computacionalmente caro, pelo menos para mim 3GB RAM, 2,1 GHz, dual core, 32 bits Win . Se eu conhecesse esse problema antes, mudaria para Linux, mas agora é tarde demais para fazer isso. Você tem alguma idéia de como combater esse problema no Windows? se a resposta por mbqainda estiver ativa, você pode apenas mostrar no código usando um exemplo concreto de qualquer modelo com tamanho de dados moderado de como implementar o computeFunction?
doutorado
O @doctorate caret foi atualizado para usar o foreachpacote internamente, que funciona com qualquer back-end paralelo que você possa registrar. Dê uma olhada no pacote doParallel. Depois de registrar um back-end, o acento circunflexo o usará automaticamente. Observe também que, no Windows, cada núcleo precisa de sua própria cópia de memória RAM; portanto, se você registrar 4 núcleos, precisará de 4x mais RAM.
Zach
@ Zach, obrigado de fato, eu tentei e funcionou. Sei também que você contribuiu caret, você pode dar uma olhada nesta pergunta, ficaria muito grato. stats.stackexchange.com/questions/81962/…
doutorado em