2017-12-11 12 views
1

複数のノードからCPUコアを利用して1つのRスクリプトを実行したいと考えています。各ノードは16のコアを含み、Slurmツールを介して私に割り当てられます。単一ノード上で正常に動作します複数のノードで1つのRスクリプト

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

これまでのところ、私のコードは次のようになります。

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のシェルで次のコマンドを経由して、それを実行します。しかし、2番目のノードにアクセスすると、32までのncoresを増やすだけで十分かどうかはわかりません。 Rは他のノードに追加の16コアを自動的に追加しますか?または、別のRパッケージを使用する必要がありますか?

+1

「mpirun」に他のホストを考慮させることができます。これはローカルのMPI設定の一部です。 –

答えて

1

mpirunを使用してRスクリプトを起動すると、Rmpiを使用しないと意味がありません。

コードを見ると、MPIなしでやりたいことがあります。レシピは、2x16コアを使用するために次のようになります。

2つのタスクを尋ね、タスク

#SBATCH --nodes 2 
#SBATCH --ntasks 2 
#SBATCH --cpus-per-task 16 
あたり16個のCPUが

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

SLURMのsrunコマンドを使用してプログラムを起動し

srunコマンドは、2つの異なるノード上のRスクリプトの2つのインスタンスを開始し、 1つのノードで環境変数SLURM_PROCIDを0に設定します。

あなたは、ディスク上の結果を保存して、単一の完全な結果に部分的な結果をマージする必要があります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) 

によって開始された二つのプロセス間で作業を分割するためにあなたのRscriptでSLURM_PROCIDの電子。

+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

関連する問題