2011-01-04 13 views
5

Estoy trabajando en un código de investigación que usa scipy.optimize.leastsq para optimizar una función. Hace esto unas 18 veces por iteración, por lo que me gustaría llamar a leastsq en paralelo para reducir el tiempo de ejecución. Esto no debería ser un problema porque las optimizaciones están casi completamente separadas, por lo que se requiere muy poca sincronización. Recientemente me enteré de multiprocessing.pool.ThreadPool que me permitiría hacer esto sin tener que configurar explícitamente la memoria compartida (un problema ya que la mayoría de mis datos están en matrices NumPy). Así que hice una pequeña reescritura de mi código, esperando que funcionara, pero arroja un extraño error: SystemError: null argument to internal routine.Paralelismo con SciPy.optimize

La siguiente es una simplificación de mi código:

def optfunc(id): 
    def errfunc(x): 
     return somedata[id] - somefunc(x) 

    lock.acquire() 
    x0 = numpy.copy(currentx[id]) 
    lock.release() 

    result = scipy.optimize.leastsq(errfunc, x0) 

    lock.acquire() 
    currentx[id] = result 
    lock.release() 

ThreadPool(processes=8).map(optfunc, range(idcount)) 

Esto debería funcionar bien, a menos scipy.optimize.leastsq no es multi-hilo. Así que traté de poner un candado alrededor de scipy.optimize.leastsq; he aquí que funciona. Sin embargo, la utilización del procesador está bloqueada al 100%, por lo que esto es inútil para mí.

Mi pregunta es, entonces, ¿qué puedo hacer al respecto? Creo que mis opciones son:

  1. Encuentra una aplicación segura para los subprocesos de LM
  2. Trate de usar procesos más que los hilos (no creo que esto haría una diferencia)
(levmar, tal vez?)

Cualquier ayuda o sugerencia sería muy apreciada.

+2

¿Estás usando Windows? Existe un problema conocido con el enhebrado en optimize.leastsq en Windows: http://projects.scipy.org/scipy/ticket/1117. –

+0

Hmm, interesante que no apareció cuando busqué. Estoy usando Ubuntu, pero tal vez afecte a ambos sistemas operativos. – Steve

Respuesta

-1

¿Cuántas CPU/núcleos? No hay nada que ganar si lo que tienes funciona al 100% sin enhebrar. Si leastq() no es seguro para subprocesos y no está utilizando el 100% de la computadora que tiene, puede ejecutar una instancia del programa por núcleo y hacer que las instancias se sincronicen a través del sistema de archivos.

+0

Hay 8 CPUs en la máquina de investigación. No estoy seguro de por qué dices que no se ganaría nada si funciona al 100%. Cuando probé el ejemplo anterior, el código se ejecutaría por un tiempo antes de arrojar el error SystemError, y durante ese tiempo oscilaba alrededor del 400% de uso de la CPU. Estaba pensando en utilizar la solución que propusiste, pero creo que podría ser más complicado de lo que vale en este momento. Gracias por tu publicación. – Steve

2

Usar procesos en lugar de hilos hará la diferencia, funcionará independientemente de que el programa sea seguro o no. Por supuesto, si es más rápido depende si el tiempo necesario para resolver el problema es mayor que la sobrecarga.

El uso de procesos puede requerir algunas molestias adicionales al configurar todos los datos necesarios. Sin embargo, el módulo multiprocessing se ocupa de la mayor parte del trabajo, por lo que no debería ser demasiado difícil.

Cuestiones relacionadas