Parametr scikit-learn n_jobs dotyczący użycia procesora i pamięci

12

W większości estymatorów w scikit-learn istnieje n_jobsparametr fit/ predictmetody do tworzenia równoległych zadań za pomocą joblib. Zauważyłem, że ustawienie go tak, aby -1tworzyło tylko 1 proces Pythona i maksymalizuje rdzenie, powodując, że użycie procesora osiągnęło 2500%. Różni się to znacznie od ustawienia dodatniej liczby całkowitej> 1, która tworzy wiele procesów Pythona przy ~ 100% użyciu.

Jak ustawienie to wpływa na użycie procesora i rdzenia na wieloprocesorowym serwerze Linux? (np. czy n_jobs=8wtedy 8 procesorów jest całkowicie zablokowanych lub czy procesory nadal rezerwują niektóre rdzenie na inne zadania / procesy?)

Ponadto dostaję MemoryErrorczasem od czasu ustawienia n_jobs=-1dużych zestawów danych. Jednak użycie pamięci zwykle wynosi około 30–40% dla pojedynczego procesu Pythona. W jaki sposób dane i pamięć są zarządzane / kopiowane w zależności od wartości n_jobs?

Snympi
źródło
1
Pamiętaj również, że możesz ustawić go na -2, co spowoduje wykorzystanie wszystkich dostępnych rdzeni oprócz 1, pozostawiając maszynę przynajmniej trochę działającą. Całkiem słusznie, że problemy z pamięcią zwykle zaczynają gryźć wiele rdzeni, szczególnie jeśli zestawy danych są duże
Ken Syme

Odpowiedzi:

4

Mogę sobie wyobrazić wartość -1zużycia wszystkich dostępnych zasobów w miarę ich udostępniania. W zależności od funkcji, o której mówisz, dane są kopiowane dla każdego zadania, co może prowadzić do problemów z pamięcią, jeśli zestaw danych jest wystarczająco duży. Oto fragment informacji z dokumentu 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`.

Dobrym pomysłem może być ustalenie pre_dispatchgórnego limitu zużycia pamięci.

W przeciwnym razie, dlaczego to ustawiasz -1? Powinieneś po prostu ustawić liczbę fizycznych rdzeni na komputerze, a może 2-krotność tej liczby, jeśli zadanie może być wielowątkowe.

EDYTOWAĆ:

Wygląda na to, że ustawienie n_jobs=-1rzeczywiście wybiera wszystkie rdzenie fizyczne i maksymalizuje ich użycie. Spójrz na komentarze w tej odpowiedzi na StackOverflow .

Jeśli nie ustawiłeś pre_dispatch, to oczywiście spróbuje dużo skopiować. Właśnie dlatego brakuje Ci pamięci. Jeśli masz 4 rdzenie, domyślnie wykonanych będzie 8 kopii zestawu danych (jak opisano powyżej w cytacie).

Oto kolejny wątek , który wygląda bardziej na stronę wydajności

n1k31t4
źródło
1
więc używamy pre_dispatch, aby ograniczyć liczbę kopii danych, ale dlaczego ustawiono na -1, występuje problem z pamięcią?
1
@sweetyBaby - zobacz dodane linki. Ustawienie n_jobs = -1nie uwzględni pamięci, tylko liczbę rdzeni procesora, co oczywiście może prowadzić do problemów z pamięcią.
n1k31t4,