2013-11-26 2 views
1

스노우 패키지를 사용하여 R의 탄력있는 그물 모델을 채점하려하지만 클러스터의 여러 노드에서 예측 기능을 실행하는 방법을 알 수 없습니다. 아래 코드는 타이밍 벤치 마크 및 오류 생산하는 실제 코드를 모두 포함 : 나는 멀티 코어를 사용하여 리눅스 박스에 분기를 통해 병렬화 할 수 있었다병렬 모델 채점 R

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

을,하지만 난 꽤 제대로 mclapply 수행을 사용하지 끝났다 unlist와 결합하여 눈으로 그것을하는 더 좋은 방법을 찾고 있었다. (그것은 우연히 내 dev 창 PC와 나의 유능한 리눅스 서버 모두에서 작동 할 것이다). 고마워.

답변

2

predict.glmnet 함수는 병렬 처리 할만큼 충분히 집중적으로 계산되지 않는 것부터 시작해야합니다. 그러나 이것은 흥미로운 예이며,이 특별한 경우가 병렬화 할 가치가 없더라도 제 대답이 도움이 될 수 있습니다.

주된 문제점은 parRapply 함수가 apply 주위의 병렬 래퍼이고, 차례로 사용자가 원하는 것이 아닌 부분 행의 행에서 함수를 호출한다는 것입니다. 당신은 당신의 함수가 submatrices에서 직접 호출되기를 원합니다. 눈이 있음을 수행하는 편리한 기능이 포함되어 있지 않습니다, 그러나 하나를 쓰기 쉽게 :

rowchunkapply <- function(cl, x, fun, ...) { 
    do.call('rbind', clusterApply(cl, splitRows(x, length(cl)), fun, ...)) 
} 

귀하의 예제에서 또 다른 문제는 올바른 함수가 호출 예측할 수 있도록 노동자 glmnet를로드 할 필요가 있다는 것입니다. pred_en 함수는 명시 적으로 내보낼 필요가 없습니다. 왜냐하면이 함수는 사용자를 위해 처리되기 때문입니다.

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) 

당신은 또한 foreach는 패키지를 사용하는 cv.glmnetparallel 옵션을 사용하여에 관심이있을 수 :

다음은 귀하의 예제의 내 버전입니다.