`stopCluster` в`R snow` заморозить
Я запускал симуляцию Монте-Карло в кластерных компьютерах с snow
а также R
, Все прошло хорошо, пока R
ударить по линии stopCluster
при котором R
заморозить и, наконец, превысил время стены. Я не вижу проблемы 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()
Вышеуказанный скрипт был сохранен как test_stack.R
под каталогом monte-carlo/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)
2 ответа
Вчера я узнал ответ: версия OpenMPI является ключевой.
Замораживание с помощью stopCluster решается, если вы используете OpenMPI 1.6.5 и вместо вызова stopCluster() из параллельного пакета, вызывайте тот из snow. Знаешь что я имею ввиду? замените stopCluster() на
snow::stopCluster()
И, для хорошей меры, мы явно называем
Rmpi::mpi.quit()
в конце.
Насколько я помню, при использовании MPI зависание в stopCluster происходило параллельно, но snow::stopCluster решал проблему до тех пор, пока мы не перекомпилировали пакеты R с OpenMPI >= 2. Если вы компилируете с 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.
----------------------------------------------------------------------
Несколько лет назад мы столкнулись с этим, потому что кто-то использовал GOTO BLAS в функции R, которая запускала некоторые потоки матрицы OpenMP, чтобы открываться, и задания выполнялись вечно, без сбоев и без вычислений. Это напоминает мне об этом.