2014-05-08 13 views
11

Sto vivendo la lentezza durante la creazione di cluster utilizzando il pacchetto parallel.Che cosa influenza il tempo per creare un cluster usando il pacchetto parallelo?

Ecco una funzione che crea e arresta un cluster PSOCK con i nodi n.

library(parallel) 
library(microbenchmark) 
f <- function(n) 
{ 
    cl <- makeCluster(n) 
    on.exit(stopCluster(cl)) 
} 
microbenchmark(f(2), f(4), times = 10) 
## Unit: seconds 
## expr  min  lq median  uq  max neval 
## f(2) 4.095315 4.103224 4.206586 5.080307 5.991463 10 
## f(4) 8.150088 8.179489 8.391088 8.822470 9.226745 10 

La mia macchina (un tempo ragionevolmente moderna stazione di lavoro a 4 core in esecuzione Win 7 Pro) sta prendendo circa 4 secondi per creare un cluster a due nodi e 8 secondi per creare un cluster a quattro nodi. Questo mi sembrava troppo lento, quindi ho provato la stessa profilatura sulla macchina identica di un collega, e ci sono voluti uno/due secondi rispettivamente per le due prove.

Questo suggerimento potrebbe avere qualche configurazione di configurazione dispari sulla mia macchina, o che ci sia qualche altro problema. Ho letto le pagine di aiuto ?makeCluster e socketConnection, ma non ho visto nulla relativo al miglioramento delle prestazioni.

Ho avuto un aspetto nel Task Manager di Windows mentre il codice era in esecuzione: non c'era alcuna evidente interferenza con l'anti-virus o altro software, solo un processo Rscript in esecuzione a ~ 17% (meno di un core).

Non so dove cercare la fonte del problema. Esistono cause note di lentezza con la creazione del cluster PSOCK in Windows?

È 8 secondi per creare un cluster a 4 nodi effettivamente lento (per gli standard del 2014) o le mie aspettative sono troppo alte?

+0

8 secondi è piuttosto lento. Ci vuole circa 1 secondo sulla mia workstation win7 di 3 anni. – Roland

+0

Prende 11 secondi sul mio nuovo Win8 PC. – JT85

+0

1.6 e 3.2 secondi sul mio i7 di 3 anni con W7. –

risposta

13

Per monitorare ciò che stava accadendo, ho installato e aperto Process Monitor (HT @qethanm). Ho anche abbandonato la maggior parte delle cose nel mio vassoio di sistema come Dropbox, al fine di generare meno rumore. (Anche se alla fine, questo non ha fatto la differenza.)

Ho quindi rieseguito una versione semplificata del codice R nella domanda, direttamente dalla GUI R (invece di un IDE).

microbenchmark(f(4), times = 5) 

Dopo un po 'di scavo, ho notato che R GUI genera un processo rscript per ogni cluster che crea (vedi foto).

the process tree shows an Rscript instance for each node in each cluster

Dopo molti vicoli ciechi e inseguimenti oca selvatica, mi venne in mente che forse questi casi rscript non erano vaniglia R. ho rinominato il mio file Rprofile.site di nasconderlo e ripetuto il punto di riferimento.

Questa volta, un cluster a 4 nodi è stato creato, in media, in poco meno di un secondo.

Per un cluster a quattro nodi, il file Rprofile.site (e presumibilmente il file di avvio personale, ~/.Rprofile, se esiste) viene letto quattro volte, che possono rallentare le cose notevolmente. Passare rscript_args = c("--no-init-file", "--no-site-file", "--no-environ") a makeCluster per evitare questo comportamento.

+1

Dopo un'ulteriore ispezione, sembra che la maggior parte del tempo trascorso all'interno del mio Rprofile.site' è nella chiamata a 'update.packages (ask = FALSE)'. –

+0

Come rinominare Rprofile.site influenza ulteriori analisi che è possibile eseguire? non è un passaggio necessario? Gli altri utenti non hanno adottato questo approccio per ottenere risultati simili. –

+0

Non avere o utilizzare un file 'Rprofile.site' significa semplicemente che le opzioni che imposti o le variabili che hai definito nel file non saranno impostate/esistenti. –

Problemi correlati