Контролировать количество ядер ЦП, которые использует sklearn MLPClassifier?

MLPClassifier в sklearn.neural_network, похоже, использует много доступных ядер ЦП, т. е. процесс python начинает использовать 50% вычислительной мощности при подгонке модели. Как предотвратить это? Является ли это возможным? Из документации кажется, что нет параметра n_jobs для управления этим поведением. Я использую sklearn версии 0.20 из ноябрьского дистрибутива Winpython. Это хорошо на моем ноутбуке, но не очень хорошо на сервере, который используют другие.


person Konsta    schedule 10.02.2019    source источник
comment
В других классификаторах есть параметр n_jobs, с помощью которого определяется количество потоков   -  person Kenneth Obando    schedule 10.02.2019
comment
Да, я знаю. Кажется, для этого его нет. Или я пропустил?   -  person Konsta    schedule 10.02.2019
comment
Google: numpy + BLAS + параметры. Sklearn не принимает непосредственного участия   -  person sascha    schedule 11.02.2019
comment
Ах, это BLAS на заднем плане делает это? Хм. Посмотрим.   -  person Konsta    schedule 12.02.2019


Ответы (2)


Не уверен, что вы пытались настроить количество потоков динамически, а не глобально (через переменную среды), но я предлагаю попробовать установить количество потоков с помощью mkl:

import mkl
mkl.set_num_threads(3)

Из личного опыта я заметил, что после добавления двух строк кода, приведенных выше, вверху моего скрипта, использование моего ЦП будет ограничено примерно 26~28% (при использовании рабочего стола с 12 ЦП), даже если я тренировал MLPClassifier, который не нет возможности установить n_jobs.

person noBee    schedule 28.01.2020

Не могли бы вы обернуть свой MLPClassifier в GridSearchCV? Использование GridSearchCV позволит вам установить n_jobs, и при желании вы можете использовать ShuffleSplit, если хотите запустить GridSearchCV без перекрестной проверки.

Например:

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import GridSearchCV, ShuffleSplit

X,y = make_classification(n_samples=100000)
mlp = MLPClassifier()

grid = GridSearchCV(mlp, {}, n_jobs=1, cv=ShuffleSplit(n_splits=1),
                    verbose=2)
grid.fit(X,y)
person Jarad    schedule 11.02.2019
comment
Да, я тоже думал о таком обходном пути. Вы пробовали, работает? - person Konsta; 12.02.2019
comment
Хм, я попробовал фрагмент. Он утверждает, что использует одного одновременно работающего исполнителя, но на самом деле использует все ядра одновременно. - person Konsta; 15.02.2019
comment
Интересное понимание. Я думал, что это сработает. В качестве следующего шага я, вероятно, изучу параллель с joblib и посмотрю, возможно ли это сделать с помощью MLPClassifier. Извините, мой ответ не помог. - person Jarad; 16.02.2019