В большинстве оценок в scikit-learn в n_jobs
параметре fit
/ predict
method есть параметр для создания параллельных заданий с использованием joblib
. Я заметил, что его установка -1
создает всего 1 процесс Python и максимально увеличивает количество ядер, в результате чего загрузка ЦП достигает 2500% сверху. Это сильно отличается от установки некоторого положительного целого числа> 1, которое создает несколько процессов Python при ~ 100% использовании.
Как его настройка влияет на использование процессора и ядра на многопроцессорном сервере Linux? (например, если n_jobs=8
тогда 8 процессоров полностью заблокированы или процессоры все еще резервируют некоторые ядра для других задач / процессов?)
Кроме того, я получаю время от MemoryError
времени при настройке n_jobs=-1
больших наборов данных. Тем не менее, использование памяти обычно колеблется в пределах 30-40% для одного процесса Python. Как данные и память управляются / копируются в зависимости от значения n_jobs
?
источник
Ответы:
Я могу себе представить, что стоимость
-1
потребляет все доступные ресурсы по мере их появления. В зависимости от того, о какой функции вы говорите, кажется, что данные копируются для каждого из заданий, что может привести к проблемам с памятью, если набор данных достаточно велик. Вот фрагмент информации из строки документации GridSearchCV :Поэтому было бы неплохо использовать
pre_dispatch
верхний предел потребления памяти.В противном случае, почему вы устанавливаете это
-1
? Вы должны просто установить количество физических ядер на вашей машине или, может быть, в два раза больше этого числа, если задача может быть многопоточной.РЕДАКТИРОВАТЬ:
Кажется, настройка
n_jobs=-1
действительно просто выбирает все физические ядра и максимально увеличивает их использование. Посмотрите комментарии в этом ответе на StackOverflow .Если вы не установили
pre_dispatch
, он, конечно, будет пытаться скопировать много. Вот почему у вас заканчивается память. Если у вас есть 4 ядра, по умолчанию будет сделано 8 копий набора данных (как описано выше в цитате).Вот еще один поток , который смотрит больше на производительность
источник
n_jobs = -1
не учитывает память, а только количество ядер на вашем процессоре, что, конечно, может привести к проблемам с памятью.