Параметр scikit-learn n_jobs об использовании процессора и памяти

11

В большинстве оценок в scikit-learn в n_jobsпараметре fit/ predictmethod есть параметр для создания параллельных заданий с использованием joblib. Я заметил, что его установка -1создает всего 1 процесс Python и максимально увеличивает количество ядер, в результате чего загрузка ЦП достигает 2500% сверху. Это сильно отличается от установки некоторого положительного целого числа> 1, которое создает несколько процессов Python при ~ 100% использовании.

Как его настройка влияет на использование процессора и ядра на многопроцессорном сервере Linux? (например, если n_jobs=8тогда 8 процессоров полностью заблокированы или процессоры все еще резервируют некоторые ядра для других задач / процессов?)

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

Snympi
источник
1
Помните также, что вы можете установить его на -2, при котором будут использоваться все доступные ядра, кроме 1, и ваша машина будет работать по крайней мере несколько. Совершенно верно, что проблемы с памятью обычно начинают кусаться для многих ядер, особенно если наборы данных большие
Кен Сайм

Ответы:

4

Я могу себе представить, что стоимость -1потребляет все доступные ресурсы по мере их появления. В зависимости от того, о какой функции вы говорите, кажется, что данные копируются для каждого из заданий, что может привести к проблемам с памятью, если набор данных достаточно велик. Вот фрагмент информации из строки документации 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? Вы должны просто установить количество физических ядер на вашей машине или, может быть, в два раза больше этого числа, если задача может быть многопоточной.

РЕДАКТИРОВАТЬ:

Кажется, настройка n_jobs=-1действительно просто выбирает все физические ядра и максимально увеличивает их использование. Посмотрите комментарии в этом ответе на StackOverflow .

Если вы не установили pre_dispatch, он, конечно, будет пытаться скопировать много. Вот почему у вас заканчивается память. Если у вас есть 4 ядра, по умолчанию будет сделано 8 копий набора данных (как описано выше в цитате).

Вот еще один поток , который смотрит больше на производительность

n1k31t4
источник
1
поэтому мы используем pre_dispatch для ограничения копий данных, но почему при значении -1 возникает проблема с памятью?
1
@sweetyBaby - пожалуйста, смотрите добавленные ссылки. Настройка n_jobs = -1не учитывает память, а только количество ядер на вашем процессоре, что, конечно, может привести к проблемам с памятью.
n1k31t4