2014-04-15 14 views
5

Sto eseguendo un codice che richiede molto tempo per il calcolo. Ho reso il mio codice parallelo usando foreach()%dopar% ed eseguito nel cluster.Errore raro rintracciabile

Funziona generalmente bene, ma a volte si blocca e ricevo il seguente errore: Error in { : task 4 failed - "missing value where TRUE/FALSE needed" Calls: %dopar% -> <Anonymous> Execution halted

Ora si dice Esecuzione fermato, ma solo per questo particolare nucleo così gli altri continuano a funzionare e alla fine non riesce a uscita, ma doesn Dimmi prima mano. Immagino sia un problema con un'istruzione if. Ho provato a simulare il codice sul mio computer ma è così raro che non riesco a simularlo.

Il codice viene eseguito con facilità per 100 ore fino a 100.000 loop e solo uno di essi avrà esito negativo.

Le mie domande sono: Posso rintracciare dov'era l'errore? (Eseguo il codice su un cluster in modo da non avere tutte le belle cose Rstudio)
Inoltre, è possibile stampare ancora da un ciclo foreach() anche se una delle attività si è arrestata?
O forse qualsiasi metodo che la gente usa per fare in modo che il crash si verifichi sul mio computer?

Posso scrivere il codice se necessario, si prega di chiedere se aiuta.

+0

avvolgere il calcolo in un try(). Quindi avrai tutti i risultati e sarai in grado di investigare il problema –

+0

@KarlForner: Non riesco a fare un lavoro 'try'. Continua a lamentarsi di 'Simboli imprevisti' quando è solo il mio codice ... C'è un modo speciale per usarlo? Non mi è affatto familiare. – TAllieri

+1

'try' o' trycatch' è un buon consiglio. Un'altra possibilità è quella di registrare l'input * * (cioè il sottogruppo di dati j-th) utilizzato su ogni chiamata parallela, in modo da poter restringere il pezzo di dati che ha causato il problema. Nel frattempo, assicurati di avere il codice di convalida nella tua funzione, come controllare che 'length (something)> 0' e'! Is.na (qualcosa) 'siano' TRUE' prima di applicare 'if (qualcosa)' . –

risposta

3

L'argomento foreach ".errorhandling" ha lo scopo di aiutare in questa situazione. Se vuoi che foreach passi gli errori, usa .errorhandling="pass". Se vuoi filtrare gli errori (che riduce la lunghezza del risultato), usa .errorhandling="remove". Il valore predefinito è "stop" che genera un errore che indica quale attività non è riuscita.

Sfortunatamente, la maggior parte dei backend paralleli non supporta i traceback, ma doMPI lo fa. Basta chiamare "startMPIcluster" con verbose=TRUE e il traceback verrà scritto nel file di registro del worker che ha riscontrato l'errore. Ecco un esempio che genera un errore sul compito 42,

suppressMessages(library(doMPI)) 
cl <- startMPIcluster(4, verbose=TRUE) 
registerDoMPI(cl) 
g <- function(i) { 
    if (i == 42) { 
    if (NULL) cat('hello, world\n') 
    } 
    7 
} 
f <- function(i) g(i) 
r <- foreach(i=1:50, .errorhandling='pass') %dopar% f(i) 
print(r) 
closeCluster(cl) 
mpi.quit() 

Dal momento che utilizza .errorhandling="pass", lo script viene eseguito fino al completamento, con un oggetto l'errore restituito in elemento 42 della lista dei risultati. Inoltre, uno dei file di registro contiene una traceback dell'errore (insieme a molti altri messaggi):

waiting for a taskchunk... 
executing taskchunk 42 containing 1 tasks 
error executing task: argument is of length zero 
traceback (most recent call first): 
> g(i) 
> f(i) 
> eval(expr, envir, enclos) 
> eval(expr, envir) 
> executeTask(taskchunk$argslist[[1]]) 
> executeTaskChunk(cl$workerid, taskchunk, envir, err, cores) 
returning error results for taskchunk 42 

Purtroppo, doMPI è usato soprattutto nei sistemi Linux, quindi questo non è utile per la maggior parte di Mac e Windows utenti.

+0

Grazie. Ho provato a utilizzare doMPI all'inizio invece di foreach, sfortunatamente il cluster linux non è in grado di installarlo. Ho chiesto all'amministratore di farlo un paio di mesi fa ma nessuna risposta :-(Sarebbe '.errorhandling =" passare "' metti NA invece della risposta e continua così? Proverò a provarlo, ma l'errore è molto casuale e raro potrebbe tornare in un paio di giorni. – TAllieri

+0

A meno che non mi stia confondendo con Rmpi? Questo è l'errore che ottengo quando provo a installarlo https://stat.ethz.ch/pipermail/r-sig-hpc/2011-May/000977.html – TAllieri

+0

@TAllieri Ho aggiornato la risposta per dire che viene restituito un errore nell'elenco dei risultati quando si utilizza .errorhandling = "pass". –