Это очень интересный вопрос. У меня нет окончательного ответа, но некоторые элементы, которые стоит упомянуть, чтобы разобраться в проблеме, не упоминаются в комментариях.
Начнем с того, почему вам следует или не следует использовать многопроцессорность:
- Многопроцессорность полезна для независимых задач. Это случай GridSearch, где все ваши различные варианты ваших моделей независимы.
- Многопроцессорность бесполезна / замедляет работу, когда:
- Задача слишком мала: создание нового процесса требует времени, и если ваша задача действительно небольшая, это накладные расходы с медленным выполнением всего кода
- Создается слишком много процессов: ваш компьютер имеет ограниченное количество ядер. Если у вас больше процессов, чем ядер, механизм балансировки нагрузки заставит компьютер регулярно переключать запущенные процессы. Эти переключатели занимают некоторое время, что приводит к более медленному выполнению.
Первый вывод заключается в том, что вы не должны использовать n_jobs как в GridSearch
, так и в модели вы оптимизируете, потому что вы создадите множество процессов и в конечном итоге замедлите их выполнение.
Теперь многие модели и функции sklearn основаны на Numpy / SciPy, которые, в свою очередь, обычно реализован на C / Fortran, поэтому уже использует многопроцессорность. Это означает, что они не должны использоваться с n_jobs
> 1, установленным в GridSearch
.
Если вы предполагаете, что ваша модель еще не распараллелена, вы можете установить n_jobs
на уровне модели или на уровне GridSearch
. Некоторые модели могут быть полностью распараллелены (например, RandomForest
), но большинство из них могут иметь по крайней мере часть, которая является последовательной (например, Boosting
). С другой стороны, GridSearch
не имеет последовательного компонента по конструкции, поэтому имеет смысл установить n_jobs
в GridSearch
, а не в модели.
При этом, это зависит от реализации модели, и вы не можете получить окончательный ответ, не проверив себя в своем случае. Например, если конвейер по какой-то причине потребляет много памяти, установка n_jobs
в GridSearch
может вызвать проблемы с памятью.
В качестве дополнения, вот очень интересное примечание о параллелизме в склеарне