parallel - ¿Cómo configurar trabajadores para el procesamiento paralelo en R usando nevadas y múltiples nodos de Windows?
r parallel programming (0)
He utilizado con éxito las nevadas para configurar un clúster en un solo servidor con 16 procesadores.
require(snowfall)
if (sfIsRunning() == TRUE) sfStop()
number.of.cpus <- 15
sfInit(parallel = TRUE, cpus = number.of.cpus)
stopifnot( sfCpus() == number.of.cpus )
stopifnot( sfParallel() == TRUE )
# Print the hostname for each cluster member
sayhello <- function()
{
info <- Sys.info()[c("nodename", "machine")]
paste("Hello from", info[1], "with CPU type", info[2])
}
names <- sfClusterCall(sayhello)
print(unlist(names))
Ahora, estoy buscando instrucciones completas sobre cómo pasar a un modelo distribuido . Tengo 4 máquinas de Windows diferentes con un total de 16 núcleos que me gustaría usar para un clúster de 16 nodos. Hasta ahora, entiendo que podría configurar manualmente una conexión SOCK o aprovechar MPI. Si bien parece posible, no he encontrado instrucciones claras y completas sobre cómo.
La ruta SOCK parece depender del código en un script de snowlib. Puedo generar un stub desde el lado principal con el siguiente código:
winOptions <-
list(host="172.01.01.03",
rscript="C:/Program Files/R/R-2.7.1/bin/Rscript.exe",
snowlib="C:/Rlibs")
cl <- makeCluster(c(rep(list(winOptions), 2)), type = "SOCK", manual = T)
Otorga lo siguiente:
Manually start worker on 172.01.01.03 with
"C:/Program Files/R/R-2.7.1/bin/Rscript.exe"
C:/Rlibs/snow/RSOCKnode.R
MASTER=Worker02 PORT=11204 OUT=/dev/null SNOWLIB=C:/Rlibs
Se siente como un comienzo razonable. Encontré el código para RSOCKnode.R
en GitHub bajo el paquete de nieve:
local({
master <- "localhost"
port <- ""
snowlib <- Sys.getenv("R_SNOW_LIB")
outfile <- Sys.getenv("R_SNOW_OUTFILE") ##**** defaults to ""; document
args <- commandArgs()
pos <- match("--args", args)
args <- args[-(1 : pos)]
for (a in args) {
pos <- regexpr("=", a)
name <- substr(a, 1, pos - 1)
value <- substr(a,pos + 1, nchar(a))
switch(name,
MASTER = master <- value,
PORT = port <- value,
SNOWLIB = snowlib <- value,
OUT = outfile <- value)
}
if (! (snowlib %in% .libPaths()))
.libPaths(c(snowlib, .libPaths()))
library(methods) ## because Rscript as of R 2.7.0 doesn''t load methods
library(snow)
if (port == "") port <- getClusterOption("port")
sinkWorkerOutput(outfile)
cat("starting worker for", paste(master, port, sep = ":"), "/n")
slaveLoop(makeSOCKmaster(master, port))
})
No está claro cómo iniciar realmente un oyente SOCK en los trabajadores, a menos que esté enterrado en la snow::recvData
.
Mirando la ruta MPI , hasta donde puedo decir, Microsoft MPI versión 7 es un punto de partida. Sin embargo, no pude encontrar una alternativa de Windows para sfCluster. Pude iniciar el servicio MPI, pero parece que no escucha en el puerto 22 y no hay cantidad de ataques contra él con snowfall::makeCluster
arrojó un resultado. Inhabilité el cortafuegos y probé con makeCluster y con el PuTTY para conectarme directamente al trabajador desde el maestro.
¿Existe una guía completa y paso a paso para configurar un conjunto de nevadas en los trabajadores de Windows que me he perdido? Me gusta snowfall::sfClusterApplyLB
y me gustaría seguir usándolo, pero si hay una solución más fácil, estaría dispuesto a cambiar de rumbo. Al analizar Rmpi y paralelamente, encontré soluciones alternativas para el lado maestro del trabajo, pero aún hay pocos detalles específicos sobre cómo configurar trabajadores que ejecutan Windows.
Debido a la naturaleza del entorno de trabajo, ni mudarse a AWS, ni Linux es una opción.
Preguntas relacionadas sin respuestas definitivas para los nodos de trabajo de Windows:
- Cómo configurar nodos esclavos de clúster (en Windows)
- Paralelo R en un clúster de Windows
- ¿Cree un clúster de PC con Windows 7 para trabajar en paralelo en R?