parallel - r multicore
Error al llamar a serializar la función R (5)
Obtuve un error similar Error en unserialize (node $ con): error al leer de la conexión
Descubrí que era un argumento faltante en una llamada a una función C a través. .Call()
Tal vez puede ser de ayuda!
Estoy cargando los siguientes paquetes en R:
library(foreach)
library(doParallel)
library(iterators)
"Paralelizo" el código durante mucho tiempo, pero últimamente estoy deteniendo INTERMITENTE mientras el código se está ejecutando. El error es:
Error in serialize(data, node$con) : error writing to connection
Mi conjetura es que tal vez la conexión que abro usando los comandos a continuación, ha expirado:
## Register Cluster
##
cores<-8
cl <- makeCluster(cores)
registerDoParallel(cl)
Al mirar la página man de makeCluster veo que, de manera predeterminada, ¡las conexiones caducan solo después de 30 días! Podría establecer opciones (error = recuperar) para verificar, sobre la marcha, si la conexión se abre o no cuando el código se detiene, pero decidí publicar esta pregunta general antes.
IMPORTANTE:
1) el error es realmente intermitente, a veces vuelvo a ejecutar el mismo código y no obtengo errores. 2) Ejecuto todo en la misma máquina multi-core (núcleos Intel / 8). Por lo tanto, no es un problema de comunicación (red) entre los clusters. 3) Soy un gran usuario de la paralelización de CPU y GPU, en mi computadora portátil y mi escritorio (64 núcleos) Desafortunadamente, es la primera vez que recibo este tipo de error.
¿Alguien tiene el mismo tipo de error?
Según lo solicitado, estoy proporcionando mi sessionInfo ():
> sessionInfo()
R version 2.15.3 (2013-03-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods base
other attached packages:
[1] TTR_0.22-0 xts_0.9-3 doParallel_1.0.1 iterators_1.0.6 foreach_1.4.0 zoo_1.7-9 Revobase_6.2.0 RevoMods_6.2.0
loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_2.15.3 grid_2.15.3 lattice_0.20-13 tools_2.15.3
@SeteveWeston, debajo del error en una de las llamadas (de nuevo es intermitente):
starting worker pid=8808 on localhost:10187 at 15:21:52.232
starting worker pid=5492 on localhost:10187 at 15:21:53.624
starting worker pid=8804 on localhost:10187 at 15:21:54.997
starting worker pid=8540 on localhost:10187 at 15:21:56.360
starting worker pid=6308 on localhost:10187 at 15:21:57.721
starting worker pid=8164 on localhost:10187 at 15:21:59.137
starting worker pid=8064 on localhost:10187 at 15:22:00.491
starting worker pid=8528 on localhost:10187 at 15:22:01.855
Error in unserialize(node$con) :
ReadItem: unknown type 0, perhaps written by later version of R
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Añadiendo un poco más de información. Establecí las opciones (error = recuperar) y proporcionó la siguiente información:
Error in serialize(data, node$con) : error writing to connection
Enter a frame number, or 0 to exit
1: #51: parallelize(FUN = "ensemble.prism", arg = list(prism = iis.long, instances = oos.instances), vectorize.arg = c("prism", "instances"), cores = cores, .export
2: parallelize.R#58: foreach.bind(idx = i) %dopar% pFUN(idx)
3: e$fun(obj, substitute(ex), parent.frame(), e$data)
4: clusterCall(cl, workerInit, c.expr, exportenv, obj$packages)
5: sendCall(cl[[i]], fun, list(...))
6: postNode(con, "EXEC", list(fun = fun, args = args, return = return, tag = tag))
7: sendData(con, list(type = type, data = value, tag = tag))
8: sendData.SOCKnode(con, list(type = type, data = value, tag = tag))
9: serialize(data, node$con)
Selection: 9
Traté de verificar si las conexiones todavía estaban disponibles, y hay:
Browse[1]> showConnections()
description class mode text isopen can read can write
3 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
4 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
5 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
6 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
7 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
8 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
9 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
10 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
Browse[1]>
Como las conexiones están abiertas y el error 0 significa la versión R (como señala @SteveWeston), realmente no puedo entender lo que está sucediendo aquí.
EDIT 1:
MI RESOLUCIÓN DEL PROBLEMA
El código está bien en términos de argumentos pasados a la función. Por lo tanto, la respuesta proporcionada por @MichaelFilosi no ha aportado mucho a la mesa. De cualquier manera, muchas gracias por su respuesta!
No pude encontrar exactamente lo que estaba mal con la llamada, pero, al menos, pude solucionar el problema.
El truco consistía en dividir los argumentos de llamada de función, para cada subproceso paralelo, en bloques más pequeños.
Mágicamente, el error desapareció.
¡Avíseme si lo mismo funcionó para usted!
Luché con este problema durante bastante tiempo y pude solucionarlo moviendo todos mis paquetes necesarios en los argumentos dentro del ciclo foreach usando .packages=c("ex1","ex2")
. Previamente había utilizado require("ex1")
dentro del ciclo y esta parece haber sido la causa principal de mis errores.
En general, solo me aseguraría de mover todo lo posible en los argumentos foreach para evitar estos tipos de errores.
Lo más probable es que esto se deba a que se está quedando sin memoria (consulte la publicación de mi blog para obtener más información). Aquí hay un ejemplo de cómo puede causar este error:
> a <- matrix(1, ncol=10^4*2.1, nrow=10^4)
> cl <- makeCluster(8, type = "FORK")
> parSapply(cl, 1:8, function(x) {
+ b <- a + 1
+ mean(b)
+ })
Error in unserialize(node$con) : error reading from connection
Estoy teniendo el mismo problema y dudo que sea un problema de memoria. Mi código es tan simple como:
library(doParallel)
library(foreach)
cl <- makeCluster(2, outfile=''LOG.TXT'')
registerDoParallel(cl)
res <- foreach(x=1:10) %dopar% x
y recibí el siguiente mensaje de error en LOG.TXT
:
starting worker pid=13384 on localhost:11776 at 18:25:29.873
starting worker pid=21668 on localhost:11776 at 18:25:30.266
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
El programa funciona de todos modos, así que lo ignoré por el momento. Sin embargo, siempre me siento incómodo de ver esos errores en el archivo de registro.
En Shiny I causó este error al escribir en un objeto reactiveValues dentro del código paralelo