2017-12-11 24 views
1

하나의 R 스크립트를 실행하기 위해 여러 노드의 CPU 코어를 활용하고 싶습니다. 각 노드에는 16 개의 코어가 포함되어 있으며 Slurm 도구를 통해 나에게 할당됩니다.여러 노드에서 단일 R 스크립트

지금까지 내 코드는 다음과 같습니다

ncores <- 16 

List_1 <- list(...) 
List_2 <- list(...) 

cl <- makeCluster(ncores) 
registerDoParallel(cl) 
getDoParWorkers() 

foreach(L_1=List_1) %:% 
foreach(L_2=List_2) %dopar% { 
... 
} 

stopCluster(cl) 

나는 UNIX 쉘에서 다음 명령을 통해 실행 : 단일 노드에서 잘 작동

mpirun -np 1 R --no-save <file_path_R_script.R> another_file_path.Rout 

합니다. 그러나, 나는 두 번째 노드에 액세스하면 일단 ncores를 32로 늘리는 것이 충분한 지 알지 못했습니다. R은 다른 노드에 추가로 16 개의 코어를 자동으로 포함합니까? 아니면 다른 R 패키지를 사용해야합니까?

+1

'mpirun'에게 다른 호스트를 고려하도록 말할 수 있습니다. 그것은 당신의 로컬 MPI 설정의 일부입니다. –

답변

1

mpirun을 사용하여 R 스크립트를 실행하는 것은 Rmpi을 사용하지 않으면 의미가 없습니다.

코드를 보면 MPI없이 원한다고 할 수 있습니다. 2x16 코어를 사용하는 방법은 다음과 같습니다.

srun 명령은 두 개의 다른 노드와의 R 스크립트의 두 인스턴스를 시작합니다

srun R --no-save <file_path_R_script.R> another_file_path.Rout 

Slurm의 srun 명령으로 프로그램을 시작

2 작업 및 작업

#SBATCH --nodes 2 
#SBATCH --ntasks 2 
#SBATCH --cpus-per-task 16 
당 16 개 CPU에 대한 질문 환경 변수 SLURM_PROCID을 한 노드에서 0으로 설정하고 다른 노드에서 1로 설정하십시오.

값을 사용하십시오 당신의 RSCRIPT에서 SLURM_PROCID의 전자 당신은 하나의 전체 결과에 부분적인 결과를 디스크에 결과를 저장 한 다음 병합해야합니다 srun

ncores <- 16 

taskID <- as.numeric(Sys.getenv('SLURM_PROCID')) 

List_1 <- list(...) 
List_2 <- list(...) 

cl <- makeCluster(ncores) 
registerDoParallel(cl) 
getDoParWorkers() 

Lits_1 <- split(List_1, 1:2)[[taskID+1]] # Split work based on value of SLURM_PROCID 

foreach(L_1=List_1) %:% 
foreach(L_2=List_2) %dopar% { 
... 
} 

stopCluster(cl) 

에 의해 시작 두 프로세스 사이의 작업을 분할합니다.

+0

귀하의 조언에 진심으로 감사드립니다. srun 라인을 조금 수정했습니다. 즉,'srun --nodes = 2 --ntasks = 2 - per-task = 16 R --no-save another_file_path.Rout'입니다. 그렇지 않으면 시스템이 단일 노드 만 요청했습니다. 노드 수를 5로 늘리면'[[taskID + 1]] '을 수정할 필요가 없습니다. 맞습니까? '--node = 2'를'--nodes = 5'로,'ntasks = 2'를'ntasks = 5'로,'split (List_1, 1 : 2)'를'split (List_1, 1 : 5) '? – Christian

+0

나는 시험하지 않았다. 그러나 그렇다, 그것은 생각이다. – damienfrancois