R 并行模型记分器

R 并行模型记分器,r,parallel-processing,multicore,prediction,snow,R,Parallel Processing,Multicore,Prediction,Snow,我试图使用snow软件包在R中为弹性网络模型评分,但我不知道如何让predict函数在集群中的多个节点上运行。下面的代码包含计时基准和产生错误的实际代码: ############## #Snow example# ############## library(snow) library(glmnet) library(mlbench) data(BostonHousing) BostonHousing$chas<-as.numeric(BostonHousing$chas) ind

我试图使用snow软件包在R中为弹性网络模型评分,但我不知道如何让predict函数在集群中的多个节点上运行。下面的代码包含计时基准和产生错误的实际代码:

##############
#Snow example#
##############

library(snow)
library(glmnet)
library(mlbench)

data(BostonHousing)
BostonHousing$chas<-as.numeric(BostonHousing$chas)

ind<-as.matrix(BostonHousing[,1:13],col.names=TRUE)
dep<-as.matrix(BostonHousing[,14],col.names=TRUE)

fit_lambda<-cv.glmnet(ind,dep)

#fit elastic net
fit_en<<-glmnet(ind,dep,family="gaussian",alpha=0.5,lambda=fit_lambda$lambda.min)

ind_exp<-rbind(ind,ind)

#single thread baseline
i<-0
while(i < 2000){
    ind_exp<-rbind(ind_exp,ind)
    i = i+1
    }

system.time(st<-predict(fit_en,ind_exp))

#formula for parallel execution
pred_en<-function(x){
    x<-as.matrix(x)
    return(predict(fit_en,x))
    }

#make the cluster
cl<-makeSOCKcluster(4)
clusterExport(cl,"fit_en")
clusterExport(cl,"pred_en")

#parallel baseline
system.time(mt<-parRapply(cl,ind_exp,pred_en))
##############
#雪的例子#
##############
图书馆(雪)
图书馆(glmnet)
图书馆(mlbench)
数据(Boston外壳)

BostonHousing$chas我首先应该说,
predict.glmnet
函数似乎没有足够的计算密集度,不值得并行化。但这是一个有趣的例子,我的回答可能会对您有所帮助,即使这个特殊情况不值得并行化

主要问题是
parRapply
函数是一个围绕
apply
的并行包装器,它反过来调用子矩阵行上的函数,这不是您想要的。您希望直接在子矩阵上调用函数。Snow不包含这样做的便利函数,但很容易编写:

rowchunkapply <- function(cl, x, fun, ...) {
    do.call('rbind', clusterApply(cl, splitRows(x, length(cl)), fun, ...))
}
您可能还对使用使用foreach包的
cv.glmnet
parallel
选项感兴趣

library(snow)
library(glmnet)
library(mlbench)

data(BostonHousing)
BostonHousing$chas <- as.numeric(BostonHousing$chas)
ind <- as.matrix(BostonHousing[,1:13], col.names=TRUE)
dep <- as.matrix(BostonHousing[,14], col.names=TRUE)
fit_lambda <- cv.glmnet(ind, dep)
fit_en <- glmnet(ind, dep, family="gaussian", alpha=0.5,
                 lambda=fit_lambda$lambda.min)
ind_exp <- do.call("rbind", rep(list(ind), 2002))

# make and initialize the cluster
cl <- makeSOCKcluster(4)
clusterEvalQ(cl, library(glmnet))
clusterExport(cl, "fit_en")

# execute a function on row chunks of x and rbind the results
rowchunkapply <- function(cl, x, fun, ...) {
    do.call('rbind', clusterApply(cl, splitRows(x, length(cl)), fun, ...))
}

# worker function
pred_en <- function(x) {
    predict(fit_en, x)
}
mt <- rowchunkapply(cl, ind_exp, pred_en)