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:
- Encuentra una aplicación segura para los subprocesos de LM
- Trate de usar procesos más que los hilos (no creo que esto haría una diferencia)
Cualquier ayuda o sugerencia sería muy apreciada.
¿Estás usando Windows? Existe un problema conocido con el enhebrado en optimize.leastsq en Windows: http://projects.scipy.org/scipy/ticket/1117. –
Hmm, interesante que no apareció cuando busqué. Estoy usando Ubuntu, pero tal vez afecte a ambos sistemas operativos. – Steve