7

mi imbatto nel seguente problema quando si scrive codice scientifica con Python:raccolta la potenza dei computer altamente parallelo con Python codice scientifica

  • Di solito si scrive il codice in modo iterativo, come uno script che svolgono qualche calcolo.
  • Infine, funziona; ora desideri eseguirlo con più input e parametri e trova che ci vuole troppo tempo.
  • Ricordando che lavori per un istituto accademico e hai accesso a circa 100 macchine CPU, sei perplesso su come sfruttare questo potere. Si inizia preparando piccoli script di shell che eseguono il codice originale con input diversi e li eseguono manualmente.

Essendo un ingegnere, so tutto dell'architettura giusta per questo (con gli elementi di lavoro in coda, i thread oi processi di lavoro ei risultati del lavoro accodati e scritti nell'archivio permanente); ma non voglio implementarlo da solo. Il problema più problematico è la necessità di repliche a causa di modifiche al codice o problemi di sistema temporanei (ad esempio, fuori memoria).

Vorrei trovare un framework a cui fornirò gli input desiderati (ad esempio con un file con una riga per esecuzione) e quindi sarò in grado di avviare più istanze di qualche agente fornito da framework che verrà eseguito il mio codice Se qualcosa è andato male con la corsa (ad esempio, problema di sistema temporaneo o eccezione generata a causa di un bug) potrò cancellare i risultati ed eseguire altri agenti. Se prendo troppe risorse, potrò uccidere alcuni agenti senza temere l'incoerenza dei dati, e altri agenti raccoglieranno gli oggetti di lavoro quando troveranno il tempo.

Qualsiasi soluzione esistente? Qualcuno vuole condividere il suo codice che fa proprio questo? Grazie!

+0

Io non lo uso da solo, ma [python per mpi] (http://mpi4py.scipy.org/docs/usrman/index.html) è comunemente usato per questo genere di cose. Poiché mpi è già enorme nello spazio di calcolo scientifico, potrebbe adattarsi all'architettura esistente. – tdelaney

+1

* Essendo un ingegnere, so tutto ... ma non voglio implementarlo da solo. * Mi sembra più un manager. La tua macchina ha un sistema di gestione dei lavori installato? –

+0

@ High Performance Mark: Ahi .. Preferisco chiamarlo focalizzato. :) Ma in realtà, il codice scientifico non è come il codice di produzione; se scrivere un codice sperimentale richiede mezza giornata, non è ok ci vorrà un'altra mezza giornata per farlo funzionare su un cluster, che è il caso per me oggi. –

risposta

2

Prima di tutto, vorrei sottolineare che il problema che Uri ha descritto nella sua domanda è affrontato da molte persone che fanno il calcolo scientifico. Potrebbe non essere facile vedere se si lavora con una base di codice sviluppata che ha un ambito ben definito - le cose non cambiano così velocemente come nel calcolo scientifico o nell'analisi dei dati. This page ha un'ottima descrizione del perché si vorrebbe avere una soluzione semplice per il parallelismo di pezzi di codice.

Quindi, this project è un tentativo molto interessante per risolvere il problema. Non ho ancora provato a usarlo, ma sembra molto promettente!

+0

Sono d'accordo. Bella risposta. –

2

Se con "have access to a ~100 CPUs machines" significa che si ha accesso a 100 macchine ciascuna con più CPU e nel caso in cui si desideri un sistema che sia abbastanza generico per diversi tipi di applicazioni, quindi il migliore possibile (e secondo me solo) la soluzione è avere un livello di gestione tra le tue risorse e il tuo input di lavoro. Questo non è affatto specifico di Python, è applicabile in un senso molto più generale. Tale livello gestisce le risorse di calcolo, assegna le attività a singole unità di risorse e monitora l'intero sistema per te. Utilizzi le risorse tramite un'interfaccia ben definita fornita dal sistema di gestione. Il sistema di gestione di solito viene chiamato "sistema batch" o "sistema di messa in coda di lavoro". Esempi popolari sono SLURM, Sun Grid Engine, Torque, .... L'impostazione di ciascuno di essi non è affatto banale, ma anche la tua richiesta non è banale.

soluzioni "parallelo" Python basata solito fermano a livello di singola macchina tramite multiprocessing. Eseguire il parallelismo oltre una singola macchina in modo automatico richiede un cluster di risorse ben configurato. Di solito coinvolge meccanismi di livello superiore come l'interfaccia di passaggio dei messaggi (MPI), che si basa su un sistema di risorse correttamente configurato. La configurazione corrispondente viene eseguita sul sistema operativo e persino su livello hardware su ogni singola macchina coinvolta nel pool di risorse. Alla fine, un ambiente di elaborazione parallelo che coinvolge molte macchine singole di natura omogenea o eterogenea richiede la creazione di un tale "sistema batch" per poter essere utilizzato in modo generale.

ti rendi conto che non si ottiene in giro lo sforzo per dare corretta attuazione di tale pool di risorse. Ma quello che puoi fare è isolare totalmente questo sforzo dal tuo livello applicativo. Una volta implementate tale pool di risorse gestite in modo generico, pronto per essere utilizzato da qualsiasi applicazione da un'interfaccia comune. Questa interfaccia viene solitamente implementata a livello di riga di comando, fornendo comandi di invio, monitoraggio, cancellazione, .... Spetta a te definire cos'è un lavoro e quali risorse deve consumare.È compito del sistema di messa in coda del lavoro assegnare il proprio lavoro a macchine specifiche e spetta al sistema operativo (correttamente configurato) e alla libreria MPI assicurarsi che la comunicazione tra le macchine funzioni.

Nel caso in cui sia necessario utilizzare hardware distribuito tra più macchine per una singola applicazione e presupponendo che le macchine possano comunicare tra loro tramite TCP/IP, esistono soluzioni basate su Python che implementano sistemi di code di lavoro meno generici. Potresti dare un'occhiata a http://python-rq.org/ o http://itybits.com/pyres/intro.html (ci sono molti altri sistemi comparabili, tutti basati su un'istanza di messaggistica/accodamento indipendente come Redis o ZeroMQ).

5

Potrei sbagliarmi, ma semplicemente utilizzando le utilità della riga di comando GNU, come parallel, o anche xargs, mi sembra appropriato per questo caso. Uso potrebbe assomigliare a questo:

cat inputs | parallel ./job.py --pipe > results 2> exceptions 

Questo eseguirà job.py per ogni linea di inputs in parallelo, uscita risultati di successo in results, e quelli non è riuscito a exceptions. Un sacco di esempi di utilizzo (anche per script Python scientifici) possono essere trovati in questo Biostars thread.

E, per completezza, Parallel documentation.

+0

Questa è una soluzione semplice e semplice per qualsiasi macchina senza un livello di gestione. Grazie! –

2
  • Di solito si scrive il codice in modo iterativo, come uno script che svolgono qualche calcolo.

Questo mi fa pensare che si piacerebbe molto ipython notebooks

un notebook è un file che ha una struttura che è un mix tra un documento e un interprete python interattivo. Man mano che si modificano le parti Python del documento possono essere eseguite e l'output incorporato nel documento. È davvero una buona programmazione in cui si esplora lo spazio del problema e si desidera prendere appunti mentre si procede.

È inoltre fortemente integrato con Matplotlib, quindi è possibile visualizzare grafici in linea. È possibile incorporare in lattice la matematica in linea e molti tipi di oggetti multimediali come immagini e video.

Ecco un basic example, e un flashier one

  • Infine, funziona; ora desideri eseguirlo con più input e parametri e trova che ci vuole troppo tempo.
  • Ricordando che lavori per un istituto accademico e hai accesso a circa 100 macchine CPU, sei perplesso su come sfruttare questo potere. Si inizia preparando piccoli script di shell che eseguono il codice originale con input diversi e li eseguono manualmente.

Questo mi fa pensare che si piacerebbe molto ipython clusters

cluster ipython consentono di eseguire programmi paralleli su più macchine. I programmi possono essere SIMD (che suona come il tuo caso) o stile MIMD. I programmi possono essere modificati e corretti in modo interattivo.

Ci sono stati diversi discorsi su iPython al recente evento SciPy. Andando su PyVideo.org e la ricerca dà numerosi video, tra cui:

non ho visto tutte queste, ma sono probabilmente un buon punto di partenza.

Problemi correlati