2011-01-04 11 views
5

Ich arbeite an etwas Forschungscode, der scipy.optimize.leastsq verwendet, um eine Funktion zu optimieren. Dies geschieht ungefähr 18 mal pro Iteration, also würde ich gerne lostsq parallel aufrufen, um die Laufzeit zu reduzieren. Dies sollte kein Problem sein, da die Optimierungen fast vollständig getrennt sind, so dass sehr wenig Synchronisation erforderlich ist. Ich habe kürzlich über multiprocessing.pool.ThreadPool herausgefunden, was mir erlauben würde, dies zu tun, ohne den Shared Memory explizit einzurichten (ein Schmerz, da die meisten meiner Daten in NumPy-Arrays sind). Also habe ich meinen Code etwas neu geschrieben, in der Hoffnung, dass es funktioniert, aber es wirft einen seltsamen Fehler auf: SystemError: null argument to internal routine. Parallelität mit SciPy.optimize

Das Folgende ist eine Vereinfachung meiner Code:

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)) 

Dies sollte funktionieren, es sei denn, scipy.optimize.leastsq nicht THREAD ist. Also habe ich versucht, eine Sperre um scipy.optimize.leastsq zu setzen; Und siehe da, es funktioniert. Die Prozessorauslastung bleibt jedoch bei 100% hängen, was für mich nutzlos ist.

Meine Frage ist dann, was kann ich dagegen tun? Ich glaube, meine Optionen sind:

  1. Finden Sie eine Thread-sichere Implementierung von LM
  2. Versuchen Prozesse mit nicht-Threads (ich glaube nicht, das würde einen Unterschied machen)
(levmar, vielleicht?)

Jede Hilfe oder Vorschläge würden sehr geschätzt werden.

+2

Verwenden Sie Windows? Es gibt ein bekanntes Problem mit Threading in optimize.leastsq unter Windows: http://projects.scipy.org/scipy/ticket/1117. –

+0

Hmm, interessant das ist nicht gekommen, als ich gesucht habe. Ich benutze Ubuntu, aber vielleicht betrifft es beide Betriebssysteme. – Steve

Antwort

-1

Wie viele CPUs/Kerne? Es gibt nichts zu gewinnen, wenn das, was Sie haben, zu 100% ohne Threading läuft. Wenn leastq() nicht Thread-sicher ist und Sie nicht 100% des Computers verwenden, den Sie haben, können Sie eine Instanz des Programms pro Kern ausführen und die Instanzen über das Dateisystem synchronisieren lassen.

+0

Es gibt 8 CPUs auf der Forschungsmaschine. Ich bin mir nicht sicher, warum Sie sagen, nichts wäre gewonnen, wenn es bei 100% läuft. Wenn ich das obige Beispiel ausprobierte, würde der Code ein wenig laufen, bevor der SystemError geworfen wurde, und während dieser Zeit schwebte er um 400% CPU-Auslastung herum. Ich habe überlegt, die Lösung, die Sie vorgeschlagen haben, zu verwenden, aber ich denke, es könnte mehr Ärger bedeuten, als es an diesem Punkt wert ist. Vielen Dank für Ihren Beitrag. – Steve

2

Die Verwendung von Prozessen anstelle von Threads macht einen Unterschied - es funktioniert, ob das Programm Thread-sicher ist oder nicht. Ob es schneller geht, hängt natürlich davon ab, ob die Zeit zur Lösung des Problems größer ist als der Overhead.

Die Verwendung von Prozessen kann einige zusätzliche Probleme mit der Einrichtung aller erforderlichen Daten erfordern. Das Modul multiprocessing kümmert sich jedoch um den größten Teil der Arbeit, so dass dies nicht allzu schwierig sein sollte.

Verwandte Themen