scikit-learn n_jobs-Parameter zur CPU-Auslastung und zum Arbeitsspeicher

11

In den meisten Schätzern für Scikit-Learn gibt es n_jobsin fit/ predictMethoden einen Parameter zum Erstellen paralleler Jobs mit joblib. Ich habe festgestellt, dass durch das Festlegen von -1nur 1 Python-Prozess die Kerne maximal genutzt werden und die CPU-Auslastung 2500% übersteigt. Dies unterscheidet sich erheblich von der Einstellung auf eine positive Ganzzahl> 1, wodurch mehrere Python-Prozesse bei einer Auslastung von ~ 100% erstellt werden.

Wie wirkt sich die Einstellung auf die CPU- und Kernauslastung auf einem Linux-Server mit mehreren CPUs aus? (zB wenn n_jobs=8dann 8 CPUs vollständig gesperrt sind oder reservieren die CPUs noch einige Kerne für andere Aufgaben / Prozesse?)

Außerdem bekomme ich MemoryErrorgelegentlich bei der Einstellung n_jobs=-1für große Datenmengen. Die Speichernutzung liegt jedoch normalerweise bei etwa 30-40% für den einzelnen Python-Prozess. Wie werden die Daten und der Speicher abhängig vom Wert von verwaltet / kopiert n_jobs?

Snympi
quelle
1
Denken Sie auch daran, dass Sie den Wert auf -2 einstellen können, wodurch alle verfügbaren Kerne bis auf einen verwendet werden und Ihre Maschine zumindest ein wenig funktioniert. Ganz richtig, dass Speicherprobleme normalerweise bei vielen Kernen auftreten, insbesondere wenn die Datenmengen groß sind
Ken Syme

Antworten:

4

Ich kann mir vorstellen, dass ein Wert von -1alle verfügbaren Ressourcen verbraucht, sobald sie verfügbar sind. Abhängig von der Funktion, über die Sie sprechen, werden anscheinend Daten für jeden Job kopiert, was zu Speicherproblemen führen kann, wenn der Datensatz groß genug ist. Hier ist ein Ausschnitt aus der Dokumentzeichenfolge von GridSearchCV :

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

Daher ist es möglicherweise eine gute Idee, pre_dispatchden Speicherverbrauch zu begrenzen.

Warum stellen Sie es sonst ein -1? Sie sollten es einfach auf die Anzahl der physischen Kerne auf Ihrem Computer oder auf das Zweifache dieser Anzahl einstellen, wenn die Aufgabe Multithread-fähig sein kann.

BEARBEITEN:

Es scheint, dass die Einstellung n_jobs=-1tatsächlich nur alle physischen Kerne auswählt und deren Verwendung maximiert. Schauen Sie sich die Kommentare in dieser Antwort auf StackOverflow an .

Wenn Sie nicht eingestellt haben pre_dispatch, wird es natürlich versuchen, viel zu kopieren. Aus diesem Grund geht Ihnen der Speicher aus. Wenn Sie 4 Kerne haben, werden standardmäßig 8 Kopien des Datensatzes erstellt (wie oben im Zitat beschrieben).

Hier ist ein weiterer Thread , der sich mehr mit der Leistung befasst

n1k31t4
quelle
1
Wir verwenden also pre_dispatch, um die Kopien der Daten zu begrenzen. Warum jedoch auf -1 gesetzt, liegt ein Speicherproblem vor?
1
@sweetyBaby - siehe die hinzugefügten Links. Bei der Einstellung n_jobs = -1wird nicht der Speicher berücksichtigt, sondern nur die Anzahl der Kerne auf Ihrer CPU, was natürlich zu Speicherproblemen führen kann.
n1k31t4