2012-02-12 11 views
13

Tengo problemas para decidir qué usar Python multiprocesamiento o apio o pp para mi aplicación.¿Es el apio tan eficiente en un sistema local como el multiprocesamiento python?

Mi aplicación es muy pesada en CPU pero actualmente solo usa una CPU, así que necesito extenderla a través de todas las CPU disponibles (lo que me hizo mirar la biblioteca de multiprocesamiento de python) pero leí que esta biblioteca no escala a otras máquinas si es necesario. En este momento no estoy seguro de si necesitaré más de un servidor para ejecutar mi código, pero estoy pensando en ejecutar apio localmente y luego escalar solo requeriría agregar nuevos servidores en lugar de refactorizar el código (como lo haría si utilizara multiprocesamiento).

Mi pregunta: ¿es esta lógica correcta? y ¿hay algún resultado negativo (rendimiento) con el uso local de apio (si resulta que un solo servidor con múltiples núcleos puede completar mi tarea)? ¿o se recomienda más usar multiprocesamiento y crecer en algo más adelante?

Gracias!

p.s. esto es para un proyecto de aprendizaje personal, pero quizás algún día me gustaría trabajar como desarrollador en una empresa y quiero aprender cómo lo hacen los profesionales.

+0

¿Qué le hace pensar que múltiples CPU ayudarán a una aplicación con IO-heavy? Si su aplicación está vinculada a IO, necesita varios canales IO, no CPU. –

+0

En oposición a la palabra incorrecta ... es muy intensivo en la CPU. Básicamente es solo matemática en una gran recursión con muchas entradas de datos. Parecía un buen proceso para distribuir – Lostsoul

+0

Ah, en ese caso, continúe :) ¿Necesita tolerancia a fallas? Por ejemplo, tratando de usar la computación voluntaria esparcida por todos lados o simplemente está buscando usar computadoras en un laboratorio o en un laboratorio. ¿racimo? –

Respuesta

4

Nunca he usado Apio, pero he usado multiprocesamiento.

Parece que el apio tiene varias formas de pasar mensajes (tareas), incluidas las formas en que debería poder ejecutar los trabajadores en diferentes máquinas. Por lo tanto, un inconveniente podría ser que el envío de mensajes podría ser más lento que con el multiprocesamiento, pero por otro lado podría distribuir la carga a otras máquinas.

Tiene razón de que el multiprocesamiento solo se puede ejecutar en una máquina. Pero, por otro lado, la comunicación entre los procesos puede ser muy rápida, por ejemplo, al usar memoria compartida. Además, si necesita procesar grandes cantidades de datos, puede leer y escribir datos fácilmente desde y hacia el disco local, y simplemente pasar nombres de archivo entre los procesos.

No sé qué tan bien trataría Aplery las fallas de tareas. Por ejemplo, la tarea puede que nunca termine de ejecutarse, o puede bloquearse, o puede querer tener la capacidad de matar una tarea si no terminó en un cierto límite de tiempo. No sé qué tan difícil sería agregar soporte para eso si no está allí.

multiprocesamiento no viene con tolerancia a fallas fuera de la caja, pero puede hacerlo usted mismo sin demasiados problemas.

+2

De hecho, el apio tiene más gastos generales que el uso del multiprocesamiento.Pool directamente, debido a la sobrecarga de mensajes. Apio se ocupa muy bien de las fallas de tareas en cualquier forma, también admite límites de tiempo y mucho, mucho más. Apio utiliza una versión mejorada del conjunto de multiprocesamiento (apio.conciudad.procesos.pool.Pool), que admite límites de tiempo y corrige muchos errores relacionados con la ejecución del grupo como un servicio (es decir, que se ejecuta para siempre) y errores relacionados con el apagado. Algunas personas usan la versión de la piscina de Apio. – asksol

+0

Algunos enlaces: http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks Opciones de grupo: http://docs.celeryproject.org/en/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool http://docs.celeryproject.org/ es/latest/internals/reference/aplery.concurrency.processes.pool.html # aplery.concurrency.processes.pool.Pool.apply_async – asksol

+2

También puede distribuir el trabajo en varias máquinas utilizando solo multiprocesamiento, pero no recomendaría hacerlo. Hacer que la calidad de la producción requiera un esfuerzo considerable, y Celery ya tiene una comunidad que está solucionando estos problemas. – asksol

17

Acabo de terminar una prueba para decidir cuánto apio agrega como sobrecarga en multiprocessing.Pool y matrices compartidas. La prueba ejecuta el filtro wiener en una matriz uint16 (292, 353, 1652). Ambas versiones usan el mismo agrupamiento (más o menos: divida las 292.353 dimensiones por la raíz cuadrada de la cantidad de CPU disponibles). Se probaron dos versiones de apio: una solución envía datos encurtidos, la otra abre el archivo de datos subyacente en cada trabajador.

Resultado: en mi CPU de 16 núcleos i7, el apio toma alrededor de 16 s, multiprocessing.Pool con matrices compartidas de aproximadamente 15 s. Encuentro esta diferencia sorprendentemente pequeña.

Aumentar la granularidad aumenta la diferencia obviamente (el apio tiene que pasar más mensajes): el apio tarda 15 s, multiprocessing.Pool lleva 12 s.

Tenga en cuenta que los trabajadores de apio ya se estaban ejecutando en el host, mientras que los trabajadores de la agrupación se bifurcan en cada ejecución.No estoy seguro de cómo podría comenzar multiprocesamiento piscina al comenzar desde el paso por las matrices compartidas en el inicializador:

with closing(Pool(processes=mp.cpu_count(), initializer=poolinit_gen, initargs=(sourcearrays, resarrays))) as p: 

y sólo los resarrays están protegidos por bloqueo.

+1

Logré separar la configuración de la piscina de la medición, pero eso casi no hizo diferencia (como era de esperar, la horquilla es barata). Probando con otro conjunto de datos (276, 385, 3821): apio mediante transferencia en escabeche 38s, multiprocesamiento.Pozo 27 segundos. Honestamente, encuentro que el apio es mucho más cómodo para trabajar y, naturalmente, puede delegar el procesamiento a otras máquinas en caso de que el tiempo de procesamiento sea realmente mayor que el tiempo de transferencia. En una sola máquina, la diferencia de rendimiento se nota solo para grandes conjuntos de datos. –

Cuestiones relacionadas