Opzioni I / O parallele, in particolare HDF5 parallelo


20

Ho un'applicazione che può essere banalmente parallelizzata ma le sue prestazioni sono in larga misura legate all'I / O. L'applicazione legge un singolo array di input archiviato in un file di dimensioni normalmente comprese tra 2 e 5 GB (ma mi aspetto che questo numero cresca in futuro). Un calcolo tipico applica la stessa operazione a ciascuna riga o colonna di tale array. Per le operazioni pesanti della CPU, ottengo un ottimo ridimensionamento fino a circa 100 processori, ma per operazioni più lente l'I / O e la relativa comunicazione (accesso NFS) dominano e non posso usare più di alcuni processori in modo efficiente.

Quali sono le opzioni efficienti e portatili (idealmente portabilmente efficienti) per una situazione del genere? Parallel HDF5 sembra promettente. Qualcuno ha esperienza di vita reale con esso?

MPI-I / O sarebbe qualcosa che vale la pena esaminare? Può funzionare in modo efficiente con un determinato layout di file o devo adattare tutto?


4
Ottima domanda Abbiamo lo stesso problema e la nostra soluzione grezza è scrivere / leggere l'array decomposto dal dominio su / da N file, per N processori. Non mi piace molto, ma è semplice. Sarei interessato a vedere le risposte che affrontano anche la complessità delle varie interfacce della libreria ....
Yann

Come stai distribuendo l'array tra i processori? Cosa stai usando per il parallelismo ora? Stai scrivendo su file su NFS come forma di comunicazione?
Dan,

2
Potrebbe non essere necessario rielaborare molto il codice; Ho avuto un problema come questo una volta ed è stato in grado di ottenere una migliore velocità evitando IO non ottimizzandolo.
Dan,

1
Stai utilizzando un sistema di coda come PBS o Torque? In tal caso, ci sono comandi per "inserire" un file in una directory all'avvio di un lavoro. Non so se accelererebbe notevolmente le cose, ma potrebbe valere la pena provare.
Dan,

1
@ Dan: si, uso PBS e posso usarlo per mettere il mio file dove voglio. Ma dal momento che il mio cluster non ha dischi local-node, non c'è niente di meglio di un volume NFS condiviso.
Khinsen,

Risposte:


6

L'I / O parallelo può aiutarti in questo caso, ma se stai usando NFS (intrinsecamente piuttosto seriale) per servire i tuoi file, allora non avrà l'effetto completo che potresti desiderare - ci sarà un collo di bottiglia seriale nella fileserver e avere centinaia di processi che fanno richieste del singolo server non ti daranno fattori di centinaia di accelerazioni nel farlo attraverso un singolo processo. Tuttavia, potrebbe aiutare a un certo punto, soprattutto perché sembra che il collo di bottiglia stia leggendo piuttosto che scrivere, e sarebbe un grande miglioramento se il tuo sistema viene aggiornato a un filesystem completamente parallelo.

MPI-IO è di livello molto basso; vale la pena capirne qualcosa per sapere cosa sta succedendo "sottocoperta" con HDF5 parallelo, NetCDF4 o ADIOS , ma usarlo da soli è davvero adatto solo per dati binari grezzi in cui la struttura è ben nota al momento della compilazione. HDF5 e NetCDF4 sono molto più flessibili.

Nota che se i tuoi dati sono relativamente semplici - ad esempio, le strutture di big data sono principalmente matrici o vettori n-dimensionali - raccomando NetCDF4 (che è anche parallelo e basato su HDF5) piuttosto che HDF5; è decisamente più semplice da usare. HDF5 è più complicato e in cambio di tale complessità consente modelli di dati molto complicati. Ma se questa è una funzione che non ti serve, è più veloce iniziare con NetCDF4.

Nel nostro centro abbiamo una lezione pomeridiana e di un giorno sull'I / O parallelo in cui parliamo dei concetti di base, MPI-IO, HDF5 e NetCDF4; le diapositive possono essere trovate qui .


5

Otteniamo un buon ridimensionamento dell'intero XT6 su ORNL usando MPI / IO per emettere vettori. Ecco il codice . I sottosistemi I / O per molte macchine non sono progettati per un parallelismo massiccio, quindi penso che @Dan abbia ragione nel cercare di minimizzare l'IO scrivendo solo ogni pochi passaggi o qualche altra strategia di agglomerazione.

Per quanto riguarda la scrittura flessibile dell'output in modo scalabile, ho esperienza con XDMF , che può essere effettuato da grandi scritture binarie parallele usando HDF5 (come PETSc VecView ) accoppiato con una piccola quantità di codice XML scritto in seriale per descrivere il layout. Questo può essere letto da pacchetti di visualizzazione come Paraview o MayaVi2 . Un altro modo per farlo è utilizzare il formato VTK con i dati binari aggiunti, tuttavia ciò richiede che tu sappia tutto ciò che vuoi scrivere in anticipo.


XDMF sembra interessante, ma si tratta di organizzare i dati piuttosto che di accedere in modo efficiente a ciò che XDMF chiama dati "pesanti". Cosa usi per quell'aspetto?
khinsen,

Usiamo semplicemente XDMF per puntare su HDF5. In questo modo puoi scrivere tutto l'HDF5 binario, ma farlo leggere dalla maggior parte dei motori di visualizzazione.
Matt Knepley,

1

Presumo che il tuo problema di scalabilità sia correlato all'output e non all'input. L'input parallelo è piuttosto semplice: quello che faccio è che ogni CPU apre il file NetCDF di input e legge la parte dell'array che appartiene al suo riquadro (potrebbe esserci un limite al numero di lettori che possono aprire lo stesso file NetCDF ma non sono sicuro ). L'output parallelo è più problematico.

Quello che sto facendo attualmente non è del tutto ottimale, ma funziona per ora. Raccolgo il tutto su una CPU e eseguo l'output seriale. Nel frattempo, altri giocatori aspettano che lo scrittore finisca. Questo ha funzionato bene per me perché sono riuscito a mantenere il calcolo sul rapporto di output piuttosto elevato, quindi la scalabilità sarebbe buona per oltre 200 CPU. Ma questa non è la soluzione che stai cercando.

Un'altra soluzione è quella che Yann ha suggerito: scrivere in serie su N file e fare in modo che una CPU drone monti le tessere su un pezzo solo se la RAM lo consente.

Oltre alle librerie di I / O parallele suggerite nelle risposte precedenti, potresti anche voler esaminare Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , poiché sei già a tuo agio con NetCDF e MPI. In pratica non l'ho usato, ma ho intenzione di andare in quella direzione quando ho colpito il muro con raccolta + I / O seriale.


È l'input che crea il mio problema di scalabilità. Suppongo che tutte le richieste in arrivo da molti nodi sovraccarichino il server NFS, ma non ho idea di come verificare questa ipotesi.
Khinsen,

@khinsen Quello che potresti fare per testare la tua ipotesi è leggere il file con un piccolo numero di CPU, diciamo tra 1 e 8, e spargere i dati al resto. Esegui la profilazione, vedi quanto tempo dedichi all'I / O e quanto spendi. Varia il numero di lettori CPU e scopri cosa ti offre le migliori prestazioni.
milancurcic,

Buon consiglio! Questo funzionerà perché significa riscrivere il codice, ma probabilmente ne vale la pena.
khinsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.