Параметр scikit-learn n_jobs про використання процесора та пам'яті


12

У більшості оцінювачів на scikit-learn є n_jobsпараметр в fit/ predictметодах для створення паралельних завдань з використанням joblib. Я помітив, що налаштування його -1створює лише 1 Python-процес і збільшує кількість ядер, в результаті чого використання процесора досягає 2500% вгорі. Це сильно відрізняється від встановлення його на якесь додатне ціле число> 1, що створює кілька процесів Python при ~ 100% використанні.

Як його налаштування впливає на використання процесора та ядра на багатопроцесорному сервері Linux? (наприклад, якщо n_jobs=8тоді 8 ЦП повністю заблоковані або процесори все ще резервують деякі ядра для інших завдань / процесів?)

Крім того, я MemoryErrorчас від часу отримую при встановленні n_jobs=-1великих наборів даних. Однак використання пам'яті зазвичай коливається на рівні близько 30-40% для одного процесу Python. Як керуються / копіюються дані та пам'ять залежно від значення n_jobs?


1
Пам'ятайте також, що ви можете встановити його на -2, що використовуватиме всі, крім 1 доступних ядер, залишаючи вашу машину хоча б дещо справною. Цілком правильно, що проблеми з пам'яттю зазвичай починають кусатись для багатьох ядер, особливо якщо набір даних великий
Ken Syme

Відповіді:


4

Я можу уявити собі величину -1споживання всіх доступних ресурсів як і коли вони стають доступними. Залежно від функції, про яку ви говорите, схоже, що дані копіюються для кожного із завдань, що може призвести до проблем із пам'яттю, якщо набір даних досить великий. Ось фрагмент інформації з docstring 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`.

Тож може бути корисно використовувати pre_dispatchдля встановлення верхньої межі споживання пам’яті.

В іншому випадку, для чого ви це налаштовуєте -1? Вам слід просто встановити його на кількість фізичних ядер на вашій машині або, можливо, у 2 рази більше цього числа, якщо завдання може бути багатопоточним.

Редагувати:

Здається, що налаштування n_jobs=-1дійсно просто вибирає всі фізичні ядра та максимально збільшує їх використання. Погляньте на коментарі у цій відповіді на StackOverflow .

Якщо ви не встановили pre_dispatch, то, звичайно, спробуйте скопіювати багато. Ось чому у вас не вистачає пам'яті. Якщо у вас є 4 ядра, за замовчуванням буде зроблено 8 копій набору даних (як описано вище в цитаті).

Ось ще одна тема , яка більше дивиться на ефективність


1
тому ми використовуємо pre_dispatch для обмеження копій даних, але чому встановлено значення -1, виникає проблема пам'яті?

1
@sweetyBaby - перегляньте додані посилання. Налаштування n_jobs = -1не враховуватиме пам’ять, лише кількість ядер у вашому процесорі, що, звичайно, може призвести до проблем із пам'яттю.
n1k31t4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.