Как найти оптимальное количество процессов в GridSearchCV (..., n_jobs = ...)? - PullRequest
0 голосов
/ 05 мая 2018

Мне интересно, что лучше использовать с GridSearchCV( ..., n_jobs = ... ), чтобы выбрать лучший набор параметров для модели, n_jobs = -1 или n_jobs с большим номером,
как n_jobs = 30?

На основании документации Sklearn:

n_jobs = -1 означает, что вычисление будет отправлено на все Процессоры компьютера.

На моем ПК у меня есть процессор Intel i3, который имеет 2 ядра и 4 потока, поэтому это означает, что если я установлю n_jobs = -1, то неявно он будет равен n_jobs = 2 ?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Дополнительный более простой ответ профессора Кевина Коллинза-Томпсона из курса «Прикладное машинное обучение на Python»:

Если в моей системе 4 ядра, n_jobs = 30 (например, 30) будет таким же, как n_jobs = 4 .. Так что никакого дополнительного эффекта нет.

Таким образом, максимальная производительность, которую можно получить, всегда использует n_jobs = -1 ..

0 голосов
/ 05 мая 2018

... это значит, что если я установлю n_jobs = -1, то неявно оно будет равно n_jobs = 2?

Это просто:

python (scipy / joblib внутри GridSearchCV()), используемый для определения количества ядер ЦП, что целесообразно для планирования параллельных (независимых) процессов, если запрос был выполнен с параметром n_jobs = -1.

enter image description here Смешно видеть трехпроцессорное ядро?

В некоторых случаях с виртуализированными машинами, которые могут синтетически эмулировать ЦП / ядра, результаты не столь тривиальны, как в вашем известном случае с Intel CPU / i3.

Если вы сомневаетесь, можно проверить это с помощью тривиализированного случая (на самом деле небольшом наборе данных, а не полномасштабном поиске в модельном пространстве ...) и позволить истории перейти к докажи это.

import psutil;                  print( "{0:17s}{1:} CPUs PHYSICAL".format(
      "psutil:",
       psutil.cpu_count( logical = False ) ) )
pass;                           print( "{0:17s}{1:} CPUs LOGICAL".format(
      "psutil:",
       psutil.cpu_count( logical = True  ) ) )
...

Подобное «самообнаружение» на хост-платформе может сообщать более подробную информацию для разных систем / настроек:

'''
sys:             linux 
                 3.6.1 (default, Jun 27 2017, 14:35:15)  .. [GCC 7.1.1 20170622 (Red Hat 7.1.1-3)]

multiprocessing: 1 CPU(s)
psutil:          1 CPUs PHYSICAL
psutil:          1 CPUs LOGICAL
psutil:          psutil.cpu_freq(  per_cpu = True  ) not able to report. ?( v5.1.0+ )
psutil:          5.0.1
psutil:          psutil.cpu_times( per_cpu = True  ) not able to report. ?( vX.Y.Z+ )
psutil:          5.0.1
psutil:          svmem(total=1039192064, available=257290240, percent=75.2, used=641396736, free=190361600, active=581107712, inactive=140537856, buffers=12210176, cached=195223552, shared=32768)
numexpr:         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ModuleNotFoundError: No module named 'numexpr'.
joblib:          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ModuleNotFoundError: No module named 'joblib'.
sklearn/joblib:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ModuleNotFoundError: No module named 'sklearn.externals.joblib' 
'''

Или

''' [i5]
>>> numexpr.print_versions()
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Numexpr version:   2.5
NumPy version:     1.10.4
Python version:    2.7.13 |Anaconda 4.0.0 (32-bit)| (default, May 11 2017, 14:07:41) [MSC v.1500 32 bit (Intel)]
AMD/Intel CPU?     True
VML available?     True
VML/MKL version:   Intel(R) Math Kernel Library Version 11.3.1 Product Build 20151021 for 32-bit applications
Number of threads used by default: 4 (out of 4 detected cores)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'''

... который лучше использовать с GridSearchCV для выбора наилучшего набора параметров для модели,
n_jobs = -1 или n_jobs с большим числом, например n_jobs = 30?

Нет простого ответа " One-Size-Fits-All " на этот вопрос:

Инструменты Scikit (и многие другие, следовавшие этой практике), используемые для создания директивы n_jobs, необходимого количества одновременных экземпляров процесса (для выхода из общей блокировки GIL). степпинг - подробнее об этом в другом месте, если интересует подробности).

Это создание процесса не является бесплатным (как с точки зрения времени, т. Е. Тратит соответствующую сумму [TIME] -доменовых затрат, так и с точки зрения пространства, т. Е. Тратит, по крайней мере, n_jobs -кратное распределение ОЗУ одного экземпляра процесса Python в [SPACE] -домен).

Учитывая это, ваша битва - это битва с обоюдоострым мечом.

Попытка «подрубить» CPU приведет к тому, что (некоторые) ядра CPU могут работать на холостом ходу.
Попытка «перебросить» пространство RAM приведет к снижению производительности, чем ожидалось, так как виртуальная память превратит операционную систему в подкачку, в результате чего время доступа к данным, масштабируемое в режиме машинного обучения, увеличится с * 1073. * более чем на 100 000 раз медленнее ~ 10+ [ms] что вряд ли понравится.

Общий эффект n_jobs = a_reasonable_amount_of_processes зависит от Закона Амдала (переформулированный, а не надстройка над-наивной версии) Таким образом, будет практический пик оптимальности (максимум) того, сколько ядер ЦП поможет улучшить вычислительные намерения, помимо которых накладные расходы (в общих чертах для доменов [TIME] - и [SPACE] выше ) фактически ухудшит любые потенциальные положительные воздействия.

Используя RandomForestRegressor() на действительно больших наборах данных в производстве, я могу сказать вам, что [SPACE] - ваш домен хуже ваших врагов в попытках роста n_jobs любая дальнейшая и ни одна настройка на системном уровне никогда не преодолеет эту границу (поэтому все больше и больше ОЗУ со сверхнизкой задержкой и все больше и больше (реальных) ядер ЦП - это единственный практический рецепт для того, чтобы действительно перейти на более масштабные вычисления n_jobs). планы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...