2013-07-27 30 views
5

Ho cercato di eseguire Rmpi e snowfall sui cluster della mia università, ma per qualche motivo, non importa quanti nodi di calcolo vengono assegnati, l'inizializzazione snowfall continua a essere eseguita su un solo nodo.Inizializzazione del cluster MPI con precipitazioni nevose R

Ecco come sto inizializzandolo:

sfInit(parallel=TRUE, cpus=10, type="MPI") 

Tutte le idee? Fornirò chiarimenti in base alle esigenze.

+0

Qualche messaggio di errore? – sgibb

+0

Che tipo di MPI sta eseguendo il tuo cluster? –

+0

openMPI, nessun messaggio di errore per quanto ne so (le cose funzionano senza intoppi, ma il sysadmin mi dice che sta eseguendo tutto su un cluster anche se ho 5 allocati). Inoltre ho appena realizzato che intendevo un nodo e non un cluster. – user1480248

risposta

6

Per eseguire un programma basato su Rmpi ​​su un cluster, è necessario richiedere più nodi utilizzando il sistema di accodamento batch e quindi eseguire lo script R dallo script del lavoro tramite un'utilità come mpirun/mpiexec. Idealmente, l'utilità mpirun è stata creata per rilevare automaticamente quali nodi sono stati allocati dal sistema di accodamento batch, altrimenti sarà necessario utilizzare un argomento mpirun come --hostfile per indicare quali nodi utilizzare.

Nel tuo caso, sembra che tu abbia richiesto più nodi, quindi il problema è probabilmente il modo in cui viene eseguito lo script R. Alcune persone non si rendono conto che hanno bisogno di usare mpirun/mpiexec, e il risultato è che il tuo script gira su un singolo nodo. Se si utilizza mpirun, è possibile che l'installazione di Open MPI non sia stata realizzata con il supporto per il proprio sistema di accodamento batch. In tal caso, è necessario creare un file host appropriato dalle informazioni fornite dal proprio sistema di accodamento batch che viene solitamente fornito tramite una variabile di ambiente e/o un file.

Ecco un tipico comando mpirun che uso per eseguire i miei script R parallele dal script di processo:

mpirun -np 1 R --slave -f par.R 

Dato che costruiamo Open MPI con il supporto per coppia, io non uso l'opzione --hostfile: mpirun individua automaticamente quali nodi utilizzare dalla variabile di ambiente PBS_NODEFILE. L'uso di -np 1 può sembrare strano, ma è necessario se il programma sta per generare i lavoratori, che in genere viene eseguito quando si utilizza il pacchetto snow. Non ho mai utilizzato snowfall, ma dopo aver cercato sul codice sorgente, mi sembra che sfInit chiami sempre makeMPIcluster con un argomento "count" che causerà snow per generare i lavoratori, quindi penso che sia necessario -np 1 per i cluster MPI con snowfall . Altrimenti, mpirun avvierà il tuo script R su più nodi e ognuno genererà 10 lavoratori sul proprio nodo che non è quello che desideri. Il trucco è impostare l'argomento "cpus" sfInit su un valore coerente con il numero di nodi assegnati al lavoro dal sistema di accodamento batch. È possibile trovare la funzione Rmpimpi.universe.size utile per questo.

Se pensate che tutto ciò sia fatto correttamente, il problema potrebbe essere il modo in cui l'oggetto cluster MPI viene creato nello script R, ma sospetto che abbia a che fare con l'uso (o la mancanza di uso) di mpirun.

+0

Grazie, penso che il problema sia molto probabile che non abbia usato mpirun (non ne ero a conoscenza). Quindi la documentazione per l'utilizzo di mpirun è la seguente delle istruzioni per il cluster: # Invoke mpirun. # Nota: $ NSLOTS è impostato da OGS a N, il numero di processori # richiesto dall'opzione "-pe mpi_M_tasks_per_node N". # Se M = 4, possibile N sono: 4, 8, 12, 16,. . . # (vedere la Tabella 2 nella pagina Runningjobs) mpirun -np $ NSLOTS mpi_program arg1 arg2 .. Se voglio nevicare fai tutto il lavoro per me, dovrei solo fare -np 1? – user1480248

+1

@ user1480248 Come accennato nella mia risposta aggiornata, penso che sia necessario utilizzare '-np 1' con nevicate. I pacchetti basati su Rmpi ​​sono piuttosto insoliti nell'usare spawning MPI, quindi i soliti consigli su come impostare '-np' sono errati. –

+0

Quindi se mi assegnano 16 nodi di calcolo e voglio utilizzare tutti i 16 core su ciascuno di questi nodi (a cui il sistema mi dà accesso) se lascio cpus <- mpi.universe.size() lo eseguirà su tutti quei nodi di calcolo e anche utilizzarli completamente? – user1480248