"Des-registrar" un clúster doParallel
doparallel r (2)
Si ejecuto foreach... %dopar%
sin registrar un clúster, foreach genera una advertencia y ejecuta el código de manera secuencial:
library("doParallel")
foreach(i=1:3) %dopar%
sqrt(i)
Rendimientos:
Warning message:
executing %dopar% sequentially: no parallel backend registered
Sin embargo, si ejecuto este mismo código después de iniciar, registrar y detener un clúster, falla:
cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
foreach(i=1:3) %dopar%
sqrt(i)
Rendimientos:
Error in summary.connection(connection) : invalid connection
¿Hay un opuesto a registerDoParallel()
que limpia el registro del clúster? ¿O estoy atrapado con el fantasma del clúster anterior hasta que reinicie mi sesión R?
/ edit: algo de Google revela la función bumphunter:::foreachCleanup()
en el paquete bumphunter bumphunter:
function ()
{
if (exists(".revoDoParCluster", where = doParallel:::.options)) {
if (!is.null(doParallel:::.options$.revoDoParCluster))
stopCluster(doParallel:::.options$.revoDoParCluster)
remove(".revoDoParCluster", envir = doParallel:::.options)
}
}
<environment: namespace:bumphunter>
Sin embargo, esta función no parece solucionar el problema.
library(bumphunter)
cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
bumphunter:::foreachCleanup()
foreach(i=1:3) %dopar%
sqrt(i)
¿Dónde guarda Foreach la información en el clúster registrado?
La única forma oficial de "anular el registro" de un backend foreach es registrar el backend secuencial:
registerDoSEQ()
Esto tiene sentido para mí porque se supone que debes declarar qué backend usar, así que no vi ningún punto en proporcionar una forma de "no declarar" qué backend usar. En su lugar, declara que desea utilizar el backend secuencial, que es el predeterminado.
Originalmente consideré incluir una función "desregistrar", pero como no podía convencerme a mí misma de que era útil, decidí omitirla porque es mucho más fácil agregar una función que eliminarla.
Dicho esto, creo que todo lo que necesitas hacer es eliminar todas las variables de foreach:::.foreachGlobals
que es donde foreach mantiene todo su estado:
unregister <- function() {
env <- foreach:::.foreachGlobals
rm(list=ls(name=env), pos=env)
}
Después de llamar a esta función, cualquier backend paralelo se desregistrará y la advertencia se emitirá nuevamente si se llama a %dopar%
.
cl <- makeCluster(2)
registerDoParallel(cl)
on.exit(stopCluster(cl))
Esto funcionó bien para mi.