2017-09-21 13 views
0

R (큰) 신경망을 R에서 nnet 패키지로 학습했습니다.이 신경망에서 예측을 시뮬레이트하고 병렬 처리 foreach와 같은 것을 사용하는 패션 (이전에는 Windows 머신에서 사용)과 함께 사용했습니다.foreach와 병렬로 nnet 출력을 예측할 때 R 메모리가 폭발 할 때

내 코드는 기본적으로 양식 훨씬 더 큰 NN 적절되는 제외하고

library(nnet) 

data = data.frame(out=c(0, 0.1, 0.4, 0.6), 
       in1=c(1, 2, 3, 4), 
       in2=c(10, 4, 2, 6)) 

net = nnet(out ~ in1 + in2, data=data, size=5) 

library(doParallel) 
registerDoParallel(cores=detectCores()-2) 

results = foreach(test=1:10, .combine=rbind, .packages=c("nnet")) %dopar% { 
    result = predict(net, newdata = data.frame(in1=test, in2=5)) 
    return(result) 
} 

이며로부터 예측; 300MB 정도입니다.

위의 코드는 기존 for 루프를 사용하거나 % do %를 사용할 때 잘 실행되지만 % dopar %를 사용하면 모든 코어가 사용되는 동안 각각 700MB 정도의 메모리가로드됩니다. 내가 충분히 오래 실행하면 결국 모든 것이 폭발하게됩니다.

비슷한 문제를봤을 때, 나는 아직도이 문제의 원인을 전혀 모릅니다. '예측'부분을 생략하면 모든 것이 원활하게 실행됩니다.

메모리에로드하는 대신 변경되지 않은 'net'을 각 코어에서 어떻게 찾을 수 있습니까? 아니면 불가능한가요?

답변

0

어떻게 각 코어가 메모리에로드되는 대신 변경되지 않는 'net'을 조회하도록 할 수 있습니까? 아니면 불가능한가요?

CPak의 답장은 무슨 일이 일어 났는지 설명합니다. 별도의 R 세션에서 주 스크립트의 여러 사본 (= 작업자)을 효과적으로 실행하고 있습니다. 자신의 indenpendent 메모리 주소 공간과 n독립적 인 배경 R 노동자를 설정하는 것을

cl <- parallel::makeCluster(n, type = "PSOCK") 
registerDoParallel(cl) 

: 당신이 전화, 윈도우에있어 이후

registerDoParallel(cores = n) 

는로 확장됩니다.

유닉스와 비슷한 시스템을 사용하고 있었다면 대신 n포크 R 작업자를 사용하는 것과 같습니다. parallel::mclapply(). 포크 된 프로세스는 Windows의 R에서 지원되지 않습니다. fork 된 자식 프로세스는 주 프로세스가 이미 할당 한 객체를 공유하기 때문에 (예 : 객체가 수정되지 않는 한) fork 된 프로세스를 사용하면 원하는 것을 효과적으로 얻을 수 있습니다. net.

1

새로운 병렬 작업자를 시작하면 본질적으로 새로운 환경을 생성하게됩니다. 즉, 새 환경에서 수행하는 모든 작업에는 관련 변수/기능에 대한 액세스가 필요합니다.

예를 들어, 각각의 새 작업자 (환경) 내에 nnet 패키지가 필요하기 때문에 .packages=c("nnet")을 지정해야합니다. 이는 전역 환경에서 각 작업자 환경에 "복제"또는 "내보내기"하는 방법입니다.

훈련 된 신경망에 예측을해야하기 때문에이를 각 근로자에게 내 보내야합니다. 경험하고있는 메모리 폭발 현상을 볼 방법이 없습니다. 병렬화에 관심이 있지만 메모리가 부족하다면 조언은 doMPI입니다.