2016-12-07 12 views
0

私はsnowRというクラスタコンピュータでモンテカルロシミュレーションを実行していました。すべてRがの凍結し、最終的に壁の時間を超えたstopClusterのラインを打つまでうまくいった。私はstopClusterの問題は表示されません。`R snow 'フリーズの` stopCluster`

以下は、私のRスクリプトの簡略化されたバージョンです。

simu <- function(rep_worker, n_used) { 
    theta_simu <- c() 
    for (i in 1 : rep_worker) { 
    theta_simu[i] <- mean(rnorm(n_used)) 
    } 
    theta_simu 
} 
library(Rmpi) 
library(snow) 
np <- mpi.universe.size() - 1 
cl <- makeCluster(np, type = "MPI") 
## go go go 
n_used <- 1e4 
rep_worker_list <- rep(1, np) # each worker do one `simu` 
theta_cluster <- clusterApply(cl, rep_worker_list, simu, n_used) 
theta_cluster 
stopCluster(cl) 
mpi.exit() 

上記のスクリプトは、ディレクトリmonte-carlo/Rtest_stack.Rとして保存されました。サーバーに送信したpbsスクリプトは次のとおりです。

#!/bin/bash 

#PBS -N test 
#PBS -l walltime=00:30:00 
#PBS -l nodes=3:ppn=8 
#PBS -l pvmem=8gb 

module load R/3.3.1 
module load openmpi/gcc/2.0.0 
cd monte-carlo/R 

# For snow jobs, use 'mpiexec -n 1' 
mpiexec -n 1 R CMD BATCH test_stack.R 

Routの一部を以下に示します。それはstopCluster()に止まります。

> simu <- function(rep_worker, n_used) { 
+ theta_simu <- c() 
+ for (i in 1 : rep_worker) { 
+  theta_simu[i] <- mean(rnorm(n_used)) 
+ } 
+ theta_simu 
+ } 
> library(Rmpi) 
> library(snow) 
> np <- mpi.universe.size() - 1 
> cl <- makeCluster(np, type = "MPI") 
    23 slaves are spawned successfully. 0 failed. 
> ## go go go 
> n_used <- 1e4 
> rep_worker_list <- rep(1, np) # each worker do one `simu` 
> theta_cluster <- clusterApply(cl, rep_worker_list, simu, n_used) 
> theta_cluster 
[[1]] 
[1] 5.54539e-05 

[[2]] 
[1] 0.0009270881 

... (I deleted the rest to save space) 

> stopCluster(cl) 
+0

gcc/2.0.0が意味する正しいコンパイラを使用していることをご存知ですか?また、Rhpcパッケージをチェックすることをお勧めします。それは、大規模なMPIユニバースでの通信が著しく高速です。 –

+0

@OttToomet私はコンパイラが正しいと思います。私たちのHPCの男は私にそう言った。私はRhpcを見ていきます。ちなみに、コンパイラが誤って指定されていると、奴隷/労働者が最初に産卵されることはありませんでした。 – semibruin

+0

誰が知っていますか?私はそれが実質的にオフであると思う、それはすぐに不平を言う。しかし、いくつかのマイナーバージョンの違いの場合...私は確信していません。 –

答えて

0

昨日私は答えました。OpenMPIのバージョンが鍵です。

OpenMPI 1.6.5を使用し、パラレルパッケージからstopCluster()を呼び出す代わりに、stopClusterを使用したフリーズを解決するには、スノーから呼び出します。わかる?

snow::stopCluster() 

でSTOPCLUSTER()を交換して、よい測定のために、我々は明示的に終わり

Rmpi::mpi.quit() 

を呼び出します。

私が覚えている限り、MPIを使用すると、parallelからstopClusterにハングアップがありましたが、SnowMP:stopClusterはOpenMPI> = 2でRパッケージを再構築するまで問題を解決しました。OpenMPI > 2の場合、どのstopClusterを使用していても、stopClusterによるハングが発生します。

OpenMPI 1.6.5が正しいと思われます。

あなたはOpenMPIのを使用する場合> 1.6.5しかし< 2、その後、ハングが発生しませんが、フォークに関する興味深い警告メッセージがあります:

> library(Rmpi) 
> library(parallel) 
> sessionInfo() 
---------------------------------------------------------------------- 
A process has executed an operation involving a call to the 
"fork()" system call to create a child process. Open MPI is currently 
operating in a condition that could result in memory corruption or 
other system errors; your job may hang, crash, or produce silent 
data corruption. The use of fork() (or system() or other calls that 
create child processes) is strongly discouraged. 

The process that invoked fork was: 

    Local host:   [[44893,1],0] (PID 35793) 

If you are *absolutely sure* that your application will successfully 
and correctly survive a call to fork(), you may disable this warning 
by setting the mpi_warn_on_fork MCA parameter to 0. 
---------------------------------------------------------------------- 

数年前、私たちは、理由は誰かがあったとヒットいくつかのOpenMPマトリックススレッドを開くようにトリガしたR関数でGOTO BLASを使用し、ジョブは永久に座り、失敗しないで計算しません。これは私にそれを思い出させる。

関連する問題