2012-01-09 3 views
1

저는 맥북 프로에서 더 빨리 실행되도록 "사례 연구와 함께 R- 학습을 통한 데이터 마이닝"에서 일부 코드를 병렬화하는 방법을 연구하고 있습니다. 문제의 특정 코드는 다음과 같습니다. 코드는 기본적으로 동일한 데이터 (DS)를 사용하며 소수의 변형으로 6 명의 학습자 (예 : svm, 회귀 및 분류 등의 nnet)를 적용합니다.몬테카를로 simluations 않는 for 루프를 병렬 처리하는 방법?

전체 코드는 HERE (하단의 "모델 평가 및 선택"섹션에 있음)입니다. 내가 찾을 병렬화 정보의 대부분

for(td in TODO) { 
    assign(td, 
    experimentalComparison(
     DSs,   
     c(
     do.call('variants', 
       c(list('singleModel',learner=td),VARS[[td]], 
        varsRootName=paste('single',td,sep='.'))), 
     do.call('variants', 
       c(list('slide',learner=td, 
         relearn.step=c(60,120)), 
        VARS[[td]], 
        varsRootName=paste('slide',td,sep='.'))), 
     do.call('variants', 
       c(list('grow',learner=td, 
         relearn.step=c(60,120)), 
        VARS[[td]], 
        varsRootName=paste('grow',td,sep='.'))) 
     ), 
     MCsetts) 
    ) 
    # save the results 
    save(list=td,file=paste(td,'Rdata',sep='.')) 
} 

이 같은 기능은 데이터의 다른 하위 집합에 적용되는, '적용'같은 것들에 더 적용 할 것으로 보인다. 이 코드가하는 것은 반대입니다. 다른 기능이 동일한 데이터를 적용했습니다.

내부의 FOR 루프를 병렬 처리하는 것이 더 좋으므로 루프 내의 코드를 병렬로 배치하지 않고 코드가 한 번에 여러 학습자에 대해 실행되도록하여 다른 학습 방법이 한 명의 학습자에 대해 병렬 처리되도록하십시오 .

하나의 반복에 대한 실행은 2 개의 코어가 아무것도 수행하지 않는 것처럼 보이는 (다른 두 개는 그냥 유휴 상태로 있음) 나의 맥북에서 2 시간이 넘습니다. 링크의 실제 코드는 20 번 반복으로 설정됩니다. 내 유휴 코어를 사용하여 이것을 줄이는 것이 좋습니다.

+1

광범위한 몬테카를로 시뮬레이션의 경우 R은 병렬화 방법에 관계없이 너무 느릴 수 있습니다. 작은 (1-5 배) 속도 향상을 얻는 쉬운 방법은 컴파일러 함수를 사용하여 주요 함수 (예 :'variantsCMP <- cmpfun (variants)')를 바이트 컴파일하는 것입니다. 그러나 훨씬 빠른 속도 향상을 위해서는 컴파일 된 언어를 사용하는 것이 가장 좋습니다 C++은'Rcpp' 패키지를 통해 쉽게 R로 구현 될 수 있습니다. –

+2

병렬 계산을 빠르고 간단하게 할 수있는 방법은'lapply (1 : N, some_function)'을 사용하는 것입니다. 여기서'N '은 원하는 횟수입니다 유닉스/리눅스에서'lapply'를'parallel' 패키지의'mclapply'로 대체 할 수 있습니다 (코어가 1 개 이상 있다고 가정). Windows의 경우,'snow '패키지. –

+0

그래서 lapply (1 : 6, code_as_function())와 같은 함수는 전역 변수를 전달하는 것과는 반대로 모든 전역 변수를 사용합니까? TODO 변수처럼 의미가있는 것처럼 보입니다. 전체 데이터 세트에 적용 할 간단한 이름 목록. –

답변

2

비 병렬 경우에서 함수를 lapply 루프로 전달하는 것은 간단합니다.

lapply(c(mean, sum), function(f) f(1:5)) 

이 명령어는 snow을 사용하여 병렬 프로그래밍을하는 몇 가지 다른 시스템입니다.

library(snow) 
cl <- makeCluster(c("localhost","localhost"), type = "SOCK") 
clusterApply(cl, c(mean, sum), function(f) f(1:5)) 
stopCluster(cl) 

각 경우마다 동일한 답변을 받아야합니다.

+0

나는 Mac을 사용하므로 t와 비슷합니다. ahoe california - no snow –

+0

CRAN에 'snow'를위한 Mac 바이너리가 있습니다. 그게 효과가 없다고 확신합니까? http://cran.r-project.org/web/packages/snow/index.html –

+0

어쨌든, 병렬로 사용하면 개념에 차이가 없다 : 'lapply'와 같은 함수를 원한다. 함수 목록 (함수 이름도 가능). –

관련 문제