Opciones de E / S paralelas, en particular HDF5 paralelo

20

Tengo una aplicación que puede ser paralelamente trivial, pero su rendimiento está en gran medida vinculado a E / S. La aplicación lee una matriz de entrada única almacenada en un archivo que normalmente tiene un tamaño de 2-5 GB (pero espero que este número crezca en el futuro). Un cálculo típico aplica la misma operación a cada fila o columna de esa matriz. Para operaciones pesadas de CPU, obtengo una escalabilidad muy buena de hasta aproximadamente 100 procesadores, pero para operaciones más lentas, la E / S y la comunicación relacionada (acceso NFS) dominan y no puedo usar más de unos pocos procesadores de manera eficiente.

¿Cuáles son las opciones eficientes y portátiles (idealmente portables eficientes) para tal situación? El HDF5 paralelo parece prometedor. ¿Alguien tiene experiencia en la vida real con él?

¿Merecería la pena considerar MPI-I / O? ¿Puede funcionar de manera eficiente con un diseño de archivo determinado, o tengo que adaptar todo?

Khinsen
fuente
44
Gran pregunta Tenemos el mismo problema, y ​​nuestra solución cruda es escribir / leer la matriz descompuesta de dominio en / desde N archivos, para N procesadores. Realmente no me gusta esto, pero es simple. Me interesaría ver respuestas que también aborden la complejidad de varias interfaces de biblioteca ...
Yann
¿Cómo está distribuyendo la matriz entre los procesadores? ¿Qué estás usando para el paralelismo ahora? ¿Estás escribiendo en archivos a través de NFS como una forma de comunicación?
Dan
2
Es posible que no tenga que modificar mucho su código; Tuve un problema como este una vez y pude obtener una mejor aceleración evitando IO que optimizándolo.
Dan
1
¿Está utilizando un sistema de colas como PBS o Torque? Si es así, hay comandos para "poner en escena" un archivo en algún directorio cuando se inicia un trabajo. No sé si aceleraría las cosas notablemente, pero podría valer la pena intentarlo.
Dan
1
@Dan: sí, uso PBS y puedo usarlo para colocar mi archivo donde quiera. Pero dado que mi clúster no tiene discos locales de nodo, no hay nada mejor que un volumen NFS compartido.
khinsen

Respuestas:

6

La E / S paralela puede ayudarlo en este caso, pero si está utilizando NFS (inherentemente bastante serial) para servir sus archivos, entonces no tendrá el efecto completo que podría desear: habrá un cuello de botella en serie en el servidor de archivos y tener cientos de procesos que realizan solicitudes del servidor único no le dará factores de cientos de aceleración de hacerlo a través de un solo proceso. Aún así, podría ayudar hasta cierto punto, especialmente porque parece que el cuello de botella es leer en lugar de escribir, y será una gran mejora si su sistema se actualiza a un sistema de archivos completamente paralelo.

MPI-IO es de muy bajo nivel; vale la pena entender algo al respecto para saber qué está pasando "bajo el capó" con HDF5, NetCDF4 o ADIOS paralelos , pero usarlo usted mismo es realmente muy adecuado para datos binarios sin procesar donde la estructura es bien conocida en tiempo de compilación. HDF5 y NetCDF4 son mucho más flexibles.

Tenga en cuenta que si sus datos son relativamente simples, por ejemplo, las estructuras de big data son principalmente matrices o vectores n-dimensionales, recomiendo NetCDF4 (que también es paralelo y basado en HDF5) en lugar de HDF5; Es notablemente más simple de usar. HDF5 es más complicado y, a cambio de esa complejidad, permite modelos de datos muy complicados. Pero si esa es una característica que no necesita, es más rápido comenzar a usar NetCDF4.

En nuestro centro tenemos una clase de tarde y una clase de día sobre E / S paralelas donde hablamos sobre los conceptos básicos, MPI-IO, HDF5 y NetCDF4; Las diapositivas se pueden encontrar aquí .


fuente
5

Conseguimos una buena ampliación a todo el XT6 en ORNL usando MPI / IO para generar vectores. Aquí está el código . Los subsistemas de E / S para muchas máquinas no están diseñados para un paralelismo masivo, por lo que creo que @Dan está en lo cierto al tratar de minimizar las E / S escribiendo solo algunos pasos o alguna otra estrategia de aglomeración.

En cuanto a la escritura flexible de salida de forma escalable, tengo experiencia con XDMF , que puede realizarse mediante grandes escrituras binarias paralelas utilizando HDF5 (como PETSc VecView ) junto con una pequeña cantidad de código XML escrito en serie para describir el diseño. Esto puede leerse mediante paquetes de visualización como Paraview o MayaVi2 . Otra forma de hacerlo es usar el formato VTK con datos binarios adjuntos, sin embargo, esto requiere que sepa todo lo que desea escribir por adelantado.

Matt Knepley
fuente
XDMF parece interesante, pero se trata de organizar datos en lugar de acceder de manera eficiente a lo que XDMF llama datos "pesados". ¿Qué utilizas para ese aspecto?
Khinsen 05 de
Solo usamos XDMF para apuntar a HDF5. De esa manera puede escribir todos los HDF5 binarios, pero que la mayoría de los motores de visualización lo lean.
Matt Knepley
1

Supongo que su problema de escalabilidad está relacionado con la salida y no con la entrada. La entrada paralela es bastante simple: lo que hago es que cada CPU abre el archivo NetCDF de entrada y lee la parte de la matriz que pertenece a su mosaico (puede haber un límite para cuántos lectores pueden abrir el mismo archivo NetCDF, pero no estoy seguro ) La salida paralela es más problemática.

Lo que estoy haciendo actualmente no es óptimo, pero funciona por ahora. Reúno todo en una CPU y hago la salida en serie. Mientras tanto, otros jugadores esperan a que termine el escritor. Esto funcionó bien para mí porque logré mantener el cálculo sobre la relación de salida bastante alto, por lo que la escalabilidad sería buena para más de 200 CPU. Pero esta no es la solución que estás buscando.

Otra solución es lo que sugirió Yann: escriba en serie en N archivos y haga que una CPU de dron ensamble los mosaicos en una sola pieza, si la RAM lo permite.

Además de las bibliotecas de E / S paralelas sugeridas en respuestas anteriores, es posible que también desee consultar Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , ya que ya se siente cómodo con NetCDF y MPI. No lo usé en la práctica, pero planeo ir en esa dirección cuando golpee la pared con recolección + E / S en serie.

milancurcic
fuente
Es una entrada que crea mi problema de escalabilidad. Supongo que todas las solicitudes entrantes de muchos nodos sobrecargan el servidor NFS, pero no tengo idea de cómo verificar esta hipótesis.
Khinsen
@khinsen Lo que podría hacer para probar su hipótesis es leer el archivo con un pequeño número de CPU, digamos entre 1 y 8, y dispersar los datos al resto. Haga el perfil, vea cuánto tiempo pasa en E / S y cuánto en dispersión. Varíe el número de lectores de CPU y vea qué le ofrece el mejor rendimiento.
milancurcic
¡Buena sugerencia! Esto será un poco de trabajo porque significa reescribir el código, pero probablemente valga la pena.
Khinsen