Uso del módulo multiprocesamiento para computación en clúster.

Estoy interesado en ejecutar un progtwig Python usando un clúster de computadora. En el pasado, he estado utilizando interfaces MPI de Python, pero debido a las dificultades para comstackrlas e instalarlas, preferiría soluciones que usen módulos integrados, como el módulo de multiprocesamiento de Python.

Lo que realmente me gustaría hacer es configurar una instancia de multiprocessing.Pool que abarque todo el clúster de la computadora y ejecutar un Pool.map(...) . ¿Es esto algo posible / fácil de hacer?

Si esto es imposible, me gustaría poder al menos poder iniciar instancias de Process en cualquiera de los nodos desde un script central con diferentes parámetros para cada nodo.

Si por computación en grupo se refiere a sistemas de memoria distribuida (múltiples nodos en lugar de SMP), entonces el multiprocesamiento de Python puede no ser una opción adecuada. Puede generar múltiples procesos, pero aún estarán vinculados dentro de un solo nodo.

Lo que necesitará es un marco que maneje la eliminación de procesos en múltiples nodos y proporcione un mecanismo para la comunicación entre los procesadores. (más o menos lo que hace MPI).

Consulte la página sobre Procesamiento en paralelo en la wiki de Python para obtener una lista de marcos que le ayudarán con la computación en clúster.

De la lista, pp , jar , pyro y apio parecen opciones sensatas, aunque no puedo responder por ninguna ya que no tengo experiencia con ninguna de ellas (uso principalmente MPI).

Si la facilidad de instalación / uso es importante, comenzaría por explorar la jug . Es fácil de instalar , admite sistemas de clúster por lotes comunes y se ve bien documentado .

En el pasado he usado Pyro para hacer esto con bastante éxito. Si activa el código móvil, enviará automáticamente por cable los módulos necesarios que los nodos aún no tienen. Bastante ingenioso

Tengo suerte al usar SCOOP como una alternativa al multiprocesamiento para uso de una sola computadora o para varias computadoras y obtener el beneficio del envío de trabajos para clústeres, así como muchas otras características como mapas nesteds y cambios mínimos de código para trabajar con map ().

La fuente está disponible en Github. ¡Un ejemplo rápido muestra cuán simple puede ser la implementación!

Si está dispuesto a instalar un paquete de código abierto, debe considerar a Ray , que fuera de los marcos de clúster de Python es probablemente la opción más cercana a la experiencia de Python de un solo hilo. Le permite paralelizar ambas funciones (como tareas) y también clases con estado (como actores) y realiza todo el envío y serialización de datos, así como la propagación de mensajes de excepción automáticamente. También permite una flexibilidad similar a la de Python normal (los actores se pueden pasar, las tareas pueden llamar a otras tareas, puede haber dependencias de datos arbitrarias, etc.). Más sobre eso en la documentación .

Como ejemplo, esta es la forma en que haría su ejemplo de mapa de multiprocesamiento en Ray:

 import ray ray.init() @ray.remote def mapping_function(input): return input + 1 results = ray.get([mapping_function.remote(i) for i in range(100)]) 

La API es un poco diferente a la API de multiprocesamiento de Python, pero debería ser más fácil de usar. Hay un tutorial que describe cómo manejar las dependencias de datos y los actores, etc.

Puede instalar Ray con “pip install ray” y luego ejecutar el código anterior en un solo nodo, o también es fácil configurar un clúster, consulte Soporte de nube y Soporte de clúster

Descargo de responsabilidad: soy uno de los desarrolladores de Ray.