Sto lavorando su un codice di ricerca che utilizza scipy.optimize.leastsq
per ottimizzare una funzione. Lo fa circa 18 volte per iterazione, quindi vorrei chiamare leastsq in parallelo per ridurre il tempo di esecuzione. Questo non dovrebbe essere un problema perché le ottimizzazioni sono quasi completamente separate, quindi è richiesta pochissima sincronizzazione. Recentemente ho scoperto lo multiprocessing.pool.ThreadPool
che mi permetterebbe di farlo senza dover impostare esplicitamente la memoria condivisa (un problema dato che la maggior parte dei miei dati sono in array di NumPy). Così ho fatto una leggera riscrittura del mio codice, sperando che funzionasse, ma genera uno strano errore: SystemError: null argument to internal routine
.Parallelismo con SciPy.optimize
Quello che segue è una semplificazione del mio codice:
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))
Questo dovrebbe funzionare bene, a meno che scipy.optimize.leastsq
non è threadsafe. Così ho provato a mettere un lucchetto intorno allo scipy.optimize.leastsq
; ecco, funziona. Tuttavia, l'utilizzo del processore è bloccato al 100%, quindi questo è inutile per me.
La mia domanda è: cosa posso fare a riguardo? Credo che le mie opzioni sono:
- Trova un'implementazione thread-safe di LM
- Prova con processi piuttosto che le discussioni (non credo che questo sarebbe fare la differenza)
Qualsiasi aiuto o suggerimento sarebbe molto apprezzato.
Stai utilizzando Windows? C'è un problema noto con il threading in optimize.leastsq su Windows: http://projects.scipy.org/scipy/ticket/1117. –
Hmm, interessante che non è venuto quando ho cercato. Sto usando Ubuntu ma forse influenza entrambi i sistemi operativi. – Steve