如何在 GridSearchCV( ..., n_jobs = ... ) 中找到最佳进程数?
How to find an optimum number of processes in GridSearchCV( ..., n_jobs = ... )?
我想知道,哪个更好地与 GridSearchCV( ..., n_jobs = ... )
一起使用来为模型选择最佳参数集,n_jobs = -1
或 n_jobs
大数字,
像 n_jobs = 30
?
基于 Sklearn 文档:
n_jobs = -1
means that the computation will be dispatched on all the
CPUs of the computer.
我的 PC 上有一个 Intel i3 CPU,它有 2 个内核和 4 个线程,所以如果我设置 n_jobs = -1
,这是否意味着隐含地它将等于 n_jobs = 2
?
... does that mean if I set n_jobs = -1
, implicitly it will be equal to n_jobs = 2
?
这个很简单:
python(scipy / joblib inside a GridSearchCV()
)用于检测CPU-cores的数量,即调度并发(独立)进程是否合理, 假设请求是使用 n_jobs = -1
设置完成的。
看到 3-CPU-core 很有趣吗?
在某些虚拟机案例中,可以综合模拟 CPU / 核心,结果并不像您已知的 Intel CPU / i3 案例那样微不足道。
如果有疑问,可以测试 用一个简单的案例(在一个非常小的数据集上,而不是成熟的模型 - space 搜索。 .. ) 让故事继续证明这一点。
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 ) ) )
...
类似的主机平台 "self-detection" 可能会针对不同的系统/设置报告更多详细信息:
'''
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)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'''
... which is better to use with GridSearchCV to pick the best parameter set for a model,
n_jobs = -1
or n_jobs
with a big number like n_jobs = 30
?
没有简单的“一刀切”答案:
Scikit 工具(以及许多其他遵循这种做法的工具)用于在使用 n_jobs
指令时生成所需数量的并发进程实例(因此关于从共享 GIL 锁步进中逃脱 - 如果对细节感兴趣,请阅读其他地方的更多信息)。
这个过程实例化不是免费的(在时间上,即花费相当数量的 [TIME]
域成本,而且 space-wise,即花费至少 n_jobs
倍于 [ 中单个 python 进程实例的 RAM 分配=23=]-域名).
鉴于此,你们的战斗是双刃剑。
尝试 "underbook" CPU 将使(一些)CPU-核心可能空转。
尝试 "overbook" RAM-space 会使您的性能比预期的更差,因为虚拟内存会导致操作系统交换,从而使您的机器学习规模扩大~ 10+[ns]
的数据访问时间比 ~ 10+ [ms]
慢了 100,000 倍以上,这很难令人满意。
n_jobs = a_reasonable_amount_of_processes
的总体效果是Amdahl's Law ( the re-formulated one, not an add-on overhead-naive version )的主题,因此会有多少CPU-cores 将有助于改善一个人的处理意图,超过它的间接成本(上面为 [TIME]
- 和 [SPACE]
-domains 勾画的)实际上会降低任何潜在的积极影响预期。
在生产中的大型数据集上使用了 RandomForestRegressor()
,我可以告诉你 [SPACE]
-domain 是你试图进一步发展 n_jobs
的最大敌人,none 系统级调整将永远克服这个界限(因此越来越多的超低延迟 RAM 和越来越多的( real ) CPU-cores 是进入任何更大 n_jobs
计算计划的唯一实用方法。
Kevyn Collins-Thompson 教授在 Python 的 Applied Machine Learning 课程中给出了一个更简单的答案:
如果我的系统有 4 个核心,n_jobs = 30
(例如 30 个)将与 n_jobs = 4
相同。所以没有附加效果
So the maximum performance that can be obtained always is using n_jobs = -1
我想知道,哪个更好地与 GridSearchCV( ..., n_jobs = ... )
一起使用来为模型选择最佳参数集,n_jobs = -1
或 n_jobs
大数字,
像 n_jobs = 30
?
基于 Sklearn 文档:
n_jobs = -1
means that the computation will be dispatched on all the CPUs of the computer.
我的 PC 上有一个 Intel i3 CPU,它有 2 个内核和 4 个线程,所以如果我设置 n_jobs = -1
,这是否意味着隐含地它将等于 n_jobs = 2
?
... does that mean if I set
n_jobs = -1
, implicitly it will be equal ton_jobs = 2
?
这个很简单:
python(scipy / joblib inside a GridSearchCV()
)用于检测CPU-cores的数量,即调度并发(独立)进程是否合理, 假设请求是使用 n_jobs = -1
设置完成的。
在某些虚拟机案例中,可以综合模拟 CPU / 核心,结果并不像您已知的 Intel CPU / i3 案例那样微不足道。
如果有疑问,可以测试 用一个简单的案例(在一个非常小的数据集上,而不是成熟的模型 - space 搜索。 .. ) 让故事继续证明这一点。
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 ) ) )
...
类似的主机平台 "self-detection" 可能会针对不同的系统/设置报告更多详细信息:
'''
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)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'''
... which is better to use with GridSearchCV to pick the best parameter set for a model,
n_jobs = -1
orn_jobs
with a big number liken_jobs = 30
?
没有简单的“一刀切”答案:
Scikit 工具(以及许多其他遵循这种做法的工具)用于在使用 n_jobs
指令时生成所需数量的并发进程实例(因此关于从共享 GIL 锁步进中逃脱 - 如果对细节感兴趣,请阅读其他地方的更多信息)。
这个过程实例化不是免费的(在时间上,即花费相当数量的 [TIME]
域成本,而且 space-wise,即花费至少 n_jobs
倍于 [ 中单个 python 进程实例的 RAM 分配=23=]-域名).
鉴于此,你们的战斗是双刃剑。
尝试 "underbook" CPU 将使(一些)CPU-核心可能空转。
尝试 "overbook" RAM-space 会使您的性能比预期的更差,因为虚拟内存会导致操作系统交换,从而使您的机器学习规模扩大~ 10+[ns]
的数据访问时间比 ~ 10+ [ms]
慢了 100,000 倍以上,这很难令人满意。
n_jobs = a_reasonable_amount_of_processes
的总体效果是Amdahl's Law ( the re-formulated one, not an add-on overhead-naive version )的主题,因此会有多少CPU-cores 将有助于改善一个人的处理意图,超过它的间接成本(上面为 [TIME]
- 和 [SPACE]
-domains 勾画的)实际上会降低任何潜在的积极影响预期。
在生产中的大型数据集上使用了 RandomForestRegressor()
,我可以告诉你 [SPACE]
-domain 是你试图进一步发展 n_jobs
的最大敌人,none 系统级调整将永远克服这个界限(因此越来越多的超低延迟 RAM 和越来越多的( real ) CPU-cores 是进入任何更大 n_jobs
计算计划的唯一实用方法。
Kevyn Collins-Thompson 教授在 Python 的 Applied Machine Learning 课程中给出了一个更简单的答案:
如果我的系统有 4 个核心,n_jobs = 30
(例如 30 个)将与 n_jobs = 4
相同。所以没有附加效果
So the maximum performance that can be obtained always is using
n_jobs = -1