Los resultados de los trabajadores no se devolvieron correctamente-nieve-depuración
debugging parallel-processing (2)
Estoy usando el paquete de snow
en R para ejecutar una función en un clúster de SOCK
con varias máquinas (3) ejecutándose en el sistema operativo Linux. Traté de ejecutar el código con parLapply
y clusterApply
.
En caso de error en el nivel del trabajador, los resultados de los nodos del trabajador no se devuelven correctamente al maestro, lo que dificulta la depuración. Actualmente estoy registrando cada latido de los nodos del trabajador de forma independiente con futile.logger
. Parece que los resultados se calculan correctamente. Pero cuando traté de imprimir el resultado en el nodo maestro (después de recibir el resultado de los trabajadores) recibo un error que dice: Error in checkForRemoteErrors(val): 8 nodes produced errors; first error: missing value where TRUE/FALSE needed
Error in checkForRemoteErrors(val): 8 nodes produced errors; first error: missing value where TRUE/FALSE needed
.
¿Hay alguna forma de depurar los resultados de los trabajadores más profundamente?
La función checkForRemoteErrors
es parLapply
por parLapply
y clusterApply
para comprobar si hay errores en las tareas, y arrojará un error si alguna de las tareas falla. Desafortunadamente, aunque muestra el mensaje de error, no proporciona ninguna información sobre qué código de trabajador provocó el error. Pero si modifica su función de trabajador / tarea para detectar errores, puede retener información adicional que puede ser útil para determinar dónde ocurrió el error.
Por ejemplo, aquí hay un programa de nieve simple que falla. Tenga en cuenta que usa outfile=''''
cuando crea el clúster para que se muestre el resultado del programa, que por sí mismo es una técnica de depuración muy útil:
library(snow)
cl <- makeSOCKcluster(2, outfile='''')
problem <- function(i) {
if (NA)
j <- 999
else
j <- i
2 * j
}
r <- parLapply(cl, 1:2, problem)
Cuando ejecuta esto, ve el mensaje de error de checkForRemoteErrors
y algunos otros mensajes, pero nada que le diga que la instrucción if
provocó el error. Para detectar errores al llamar al problem
, definimos workerfun
:
workerfun <- function(i) {
tryCatch({
problem(i)
},
error=function(e) {
print(e)
stop(e)
})
}
Ahora ejecutamos workerfun
con parLapply
lugar de problem
, primero exportando el problem
a los trabajadores:
clusterExport(cl, c(''problem''))
r <- parLapply(cl, 1:2, workerfun)
Entre los otros mensajes, ahora vemos
<simpleError in if (NA) j <- 999 else j <- i: missing value where TRUE/FALSE needed>
que incluye la instrucción if
real que generó el error. Por supuesto, no te dice el nombre del archivo y el número de línea de la expresión, pero a menudo es suficiente para que puedas resolver el problema.
verifica el rango de tus observaciones cómo varía la observación Me he dado cuenta de que cuando hay muchos lugares decimales 4, 5, 6, arroja glm.nb off. Para resolver esto, simplemente redondeo las observaciones a 2 decimales.