Я бы хотел, чтобы каждое ведомое устройство считывало большой набор данных индивидуального уровня, а затем итеративно находило вероятность на уровне субъекта с учетом обновлений вектора параметров.Слэйвы читают наборы данных, а затем первый слэйв выдает ошибку, пытаясь вычислить вероятность уровня объекта - он не может найти фрейм данных.Я предполагаю, что команды чтения широковещания, которые были успешными, были R процессами, которые вышли.Итак, мой общий вопрос - как сделать так, чтобы данные сохранялись между одноразовой командой (чтение) и повторяющейся командой
Я отправляю задание с помощью команды оболочки
sbatch --partition=multinode batch-rmpi-ex1mle.s
filebatch-rmpi-ex1mle.R
#!/bin/bash
#
# this file is batch-rmpi-ex1mle.sh
#
#SBATCH --ntasks=1051
#SBATCH --time=00:30:00
#SBATCH --mem-per-cpu=1024
#SBATCH --job-name="Rmpi_ex1mle"
#SBATCH --mail-type=BEGIN,END
#
cd $SLURM_SUBMIT_DIR
echo "Working from $(pwd)"
export OMPI_MCA_mpi_warn_on_fork=0
#Run this from mpirun so that R starts in an MPI environment
module load R
module load openmpi/3.0.2/gcc-7.3.0-pmi2
mpirun -n 1 R CMD BATCH --no-restore --no-save --quiet \
main-rmpi-ex1mle.R main-rmpi-ex1mle.Rout
file main-rmpi-ex1mle.R
if (!is.loaded("mpi_initialize")) {
library("Rmpi")
}
"%,%" <- function(x,y)paste(x,y,sep="")
wd <- Sys.getenv("SLURM_SUBMIT_DIR")
source(wd %,% "/" %,% "funs-rmpi-ex1mle.R")
N <- 1051
dsname <- "dat.rda"
load(wd %,% "/" %,% (N-1) %,% "/" %,% dsname)
p <- ncol(DAT.i)
B <- rep(0, p)
# Spawn ns workers
mpi.spawn.Rslaves(nslaves=N-1)
# broadcast common code to all slaves
mpi.bcast.Robj2slave(read.i)
mpi.bcast.Robj2slave(logL.i)
# The command we want to run on all the nodes/processors we have
mpi.bcast.cmd(read.i, N-1, dsname, wd)
fit.glm <- nlminb(start=B, obj=FlogL, n=N-1)
fit.glm.s <- summary(fit.glm)
save(list=c("fit.glm", "fit.glm.s"), file=fit-glm-par.rda")
# Close down the MPI processes and quit
mpi.close.Rslaves(dellog=FALSE)
mpi.exit()
file funs-rmpi-ex1mle.R
"%,%" <- function(x,y)paste(x,y,sep="")
"FlogL" <-
function(B, n)
{
ns <- n
logL <- sum(unlist(mpi.apply(1:ns, logL.i, B=B, comm=1)))
-logL
}
#workercode
"read.i" <-
function(ns, dsname, wd)
{
"%,%" <- function(x,y)paste(x,y,sep="")
imx <- ceiling(logb(ns, 10))
# which slave am I?
i <- mpi.comm.rank()
i.digs <- ceiling(logb(1 + i, 10))
z <- paste(rep("0", imx-i.digs), collapse="")
i.s <- z %,% i
load(wd %,% "/" %,% i.s %,% "/" %,% dsname)
}
"logL.i" <-
function(B, i)
{
attach(DAT.i)
b0 <- B[1]
b <- B[-1]
P.i <- logit.inv(b0 + X%*%b)
D*log(P.i) + (1-D)*log(1-P.i)
}