Multiprocessing zweier Funktionen (threads, Cores festlegen)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Hallo

ich habe zwei funktionen die ich parallel ablaufen lassen muss auf einen 32 core system. Dabei habe ich das paket multiprocessing gefunden
import multiprocessing

Code: Alles auswählen


def p_start1:
...
...
def p_start2:
...
...

if __name__ == '__main__':


        P1= multiprocessing.Process(name='P1', target=p_start1)
        P2= multiprocessing.Process(name='P2', target=p_start2)
        P1.start()
        P2.start()



Hier mit klappt es das beide funktionen Parallel ablaufen.

Das Problem das ich habe ist das eine der Funktionen deutlich mehr zeit benötigt beide Funktionen sollten aber zeitgleich fertig werden.

Gibt es hier uz eine möglichkeit der einen Funktion 28 Cores oder threads zu zuweisen und der anderen nur 4 cores/threads


Vielen Dank für eure Hilfe

Sbfly
BlackJack

@sbfly: Nein natürlich nicht. Dazu müsste es ja möglich sein eine Funktion automagisch zu parallelisieren. Jede der beiden Funktionen nutzt maximal *einen* Prozessor/Kern.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Du müsstest die Funktionen p_start1 und p_start2 parallelisieren.
Das ist aber viel Arbeit und oftmals in Python nicht möglich.

Am einfachsten ist es noch, wenn Deine Funktionen die meiste Rechenzeit mit Numpy oder einer Numerik-Bibliothek verbringen und Du Numpy mit der Option OpenMP baust oder Du die Numerik-Bibliothek mit OpenMP Unterstützung bekommst.
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

„Oftmals in Python nicht möglich” klingt mir zu spezifisch, parallelisieren an sich ist nur möglich wenn sich der Algorithmus dafür eignet, und dann ist das in der Regel auch mit Python möglich.
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

das hört sich ja kompliziert an

Danke für eure antworten :-)
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

BlackJack hat geschrieben:„Oftmals in Python nicht möglich” klingt mir zu spezifisch, parallelisieren an sich ist nur möglich wenn sich der Algorithmus dafür eignet, und dann ist das in der Regel auch mit Python möglich.
OpenMP ist z.B. nur bei kompilierten Sprachen wie C, C++ und Fortran möglich. In Python ist es nur indirekt möglich, wenn Du in Python Bibliotheken nutzt, in die es reinkompiliert ist.

Einfache Sachen lassen sich aber natürlich auch mit Python parallelisieren, z.B. wenn ein Animationsfilm gerendert werden soll, dann sind das zig tausende unabhängige Tasks, die sich sehr einfach mit Python Mitteln auf eine Renderfarm verteilen lassen.
sbfly hat geschrieben:das hört sich ja kompliziert an
Es ist nicht unbedingt kompliziert, wenn die Rechenzeit auf ein paar Schleifen konzentriert ist und die einzelnen Schleifenschritte voneinander unabhängige Ergebnisse berechnen, dann ist es mit OpenMP mit ein paar Kompiler Direktiven getan. Soll auf mehrere Rechner verteilt gerechnet werden oder auf Grafikkarten gerechnet werden, dann wird es komplizierter. Es muss einen guten Grund dafür geben (z.B. 4 Wochen Rechenzeit seriell) und ein ordentliches Budget.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MagBen hat geschrieben:OpenMP ist z.B. nur bei kompilierten Sprachen wie C, C++ und Fortran möglich. In Python ist es nur indirekt möglich, wenn Du in Python Bibliotheken nutzt, in die es reinkompiliert ist.
Also für das Scheduling von Prozessen ist das Betriebssystem verantwortlich, da braucht es keinen Umweg über niedere Sprachen! Und Du kannst in Python natürlich mehrere Prozesse erstellen (``multiprocessing``), die parallel Dinge bearbeiten. Wenn Du Deinen Pool groß genug anlegst, wird das OS schon dafür sorgen, dass diese gut auf die vorhandenen Kerne verteilt werden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@MagBen: OpenMP ist nicht die einzige Möglichkeit parallisierte Programme zu schreiben, darum ist das nicht wirklich relevant ob/wo OpenMP möglich ist.

Was sind „einfache Sachen”? Oder was sind nicht einfache Sachen, und warum sollten die in Python nicht parallelisierbar sein? Mal davon ausgehend das Python grundsätzlich die richtige Sprache für das Problem ist.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

BlackJack hat geschrieben:@MagBen: OpenMP ist nicht die einzige Möglichkeit parallisierte Programme zu schreiben, darum ist das nicht wirklich relevant ob/wo OpenMP möglich ist.
Die anderen APIs mit denen ich arbeite und zu denen ich was sagen kann sind MPI und CUDA. MPI ist für das Verteilen einer Rechnung auf mehreren Rechnern und CUDA ist für das Rechnen auf Nvidia-Grafikkarten (Grafikkarten rechnen extrem parallel, über tausend Prozesse machen aktuelle Gamer-Grafikkarten). Auch diese APIs sind primär für kompilierte Sprachen gemacht. Es gibt dazu auch Python-Schnittstellen, aber die Grafikkarte führt nun mal kein Python Code aus und MPI braucht die Speicheradressen der Daten.

Der Sinn von Parallelisierung ist ja auch nicht im Sinne eines Kunststückes vorzuführen, dass es auch mit Python geht, sondern dass die Wettervorhersage vor dem vorhergesagten Wetter fertig ist.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MagBen hat geschrieben: Der Sinn von Parallelisierung ist ja auch nicht im Sinne eines Kunststückes vorzuführen, dass es auch mit Python geht, sondern dass die Wettervorhersage vor dem vorhergesagten Wetter fertig ist.
Sicher. Aber die Wettervorhersage muss vielleicht nicht nach 0,5 Sekunden fertig sein, sondern 5 Minuten reichen auch. Und wenn man das mit Python-Bord-Mitteln erreichen kann, ist das doch allemal angenehmer, als sich etwas auf Low-Level Niveau basteln zu müssen, oder? ;-)

Generell geht man doch so vor, dass man zunächst mit Sprachmitteln versucht etwas zu lösen. Wenn das nicht (mehr) ausreicht, kann man sondieren, welche Alternativen es gibt. Das ist doch bei anderen Sprachen und Plattformen nicht anders...

Edit: Basiert das Verteilungssystem der Renderfarmen von "Industrial Light an Magic" nicht auf Python? Mir war so... ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Hyperion hat geschrieben:Edit: Basiert das Verteilungssystem der Renderfarmen von "Industrial Light an Magic" nicht auf Python? Mir war so... ;-)
Mit "Industrial Light an Magic" habe ich keine Erfahrungen, aber mit Blender, bei dem ist es so. Wenn "Industrial Light an Magic" sowieso schon eine Python Schnittstelle hat (so wie Blender) dann bietet sich für so eine Task basierte Parallelisierung Python an. Denn es geht ja nicht nur darum möglichst viele Prozesse gleichzeitig laufen zu haben, sondern wenn einer fertig ist die Ergebnis-Dateien einzusammeln und sinnvoll zu ordnen und sowas macht keiner freiwillig mit C++.
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@MagBen: Ich hatte ja extra noch als Voraussetzung mit aufgenommen, dass es nur Sinn macht sich über das Paralellisieren von Lösungen Gedanken zu machen für die Python an sich eine geeignete Sprache ist. Es läuft nicht auf GPUs und das Wettervorhersagemodell wird auch nicht in Python geschrieben. Das sind also ungeeignete Beispiele für „oftmals ist das parallelisieren nicht möglich”, weil schon eine nicht-parallelisierte Variante in Python nicht sinnvoll möglich ist.

Mit MPI und Cuda hat man also nur zwei weitere Beispiele für Schnittstellen die in Python vielleicht nicht so viel Sinn machen, aber eben auch immer noch nicht die einzigen Möglichkeiten sind parallelisierte Lösungen zu schreiben. `multiprocessing`, die verschiedenen Message Queue Implementierungen (RabbitMQ, ZeroMQ, …), oder darauf aufbauend Celery, sind alles Mechanismen mit denen man Algoritmen die *in Python* implementiert sind, und sich für's parallelisieren eignen oder entsprechend anpassbar sind, auch tatsächlich parallelisieren kann.

ILM ist übrigens keine Software sondern eine Firma. Die benutzt verschiedenste Software „von der Stange” aber auch Eigenentwicklungen. Da scheint alles ziemlich ”durchsetzt” zu sein mit Python, und die haben auch erstaunlich früh mit Python angefangen. Auf Python.org gibt es einen Artikel dazu: https://www.python.org/about/success/ilm/
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@sbfly: Beschreib doch Mal was die beiden Funktionen machen, dann kann man genauer sagen wie sich das besser parallelisieren lässt und wie schwer das ist.
Antworten