我想知道,哪个更好GridSearchCV( ..., n_jobs = ... )
用于为模型选择最佳参数集,n_jobs = -1
或者n_jobs
使用大数字,
例如n_jobs = 30
?
基于 Sklearn 文档:
n_jobs = -1
意味着计算将在计算机的所有 CPU 上分派。
在我的 PC 上,我有一个 Intel i3 CPU,它有 2 个内核和 4 个线程,所以这是否意味着如果我设置n_jobs = -1
,它会隐含地等于n_jobs = 2
?
我想知道,哪个更好GridSearchCV( ..., n_jobs = ... )
用于为模型选择最佳参数集,n_jobs = -1
或者n_jobs
使用大数字,
例如n_jobs = 30
?
基于 Sklearn 文档:
n_jobs = -1
意味着计算将在计算机的所有 CPU 上分派。
在我的 PC 上,我有一个 Intel i3 CPU,它有 2 个内核和 4 个线程,所以这是否意味着如果我设置n_jobs = -1
,它会隐含地等于n_jobs = 2
?
...这是否意味着如果我设置
n_jobs = -1
,隐含地它将等于n_jobs = 2
?
python ( scipy / joblib inside a GridSearchCV()
) 用于检测 CPU 内核的数量,如果请求是通过n_jobs = -1
设置完成的,那么调度并发(独立)进程是合理的。
在某些可以综合模拟 CPU / 内核的虚拟机案例中,结果并不像您已知的 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
?
Scikit 工具(以及许多其他遵循此做法的工具)用于在n_jobs
使用指令时生成所需数量的并发进程实例(以便摆脱共享 GIL 锁步进 - 如果对细节感兴趣,请在其他地方阅读更多信息) .
这种进程实例化不是无成本的(既是时间方面的,即花费大量的[TIME]
域成本,也是空间方面的,即花费至少n_jobs
一倍于单个 python 进程实例的 RAM 分配在[SPACE]
域中)。
鉴于此,您的战斗是与双刃剑的战斗。
尝试“预订” CPU将使(某些)CPU 内核可能闲置。
尝试“超额预订” RAM空间将使您的性能比预期的更差,因为虚拟内存会导致操作系统交换,这会使您的机器学习规模的数据访问时间从~ 10+[ns]
100,000 倍以上变慢~ 10+ [ms]
,这几乎不会高兴。
的整体效果n_jobs = a_reasonable_amount_of_processes
是Amdahl 定律的主题(重新制定的,不是附加的开销天真的版本),因此会有一个实际的最优峰值(最大值)多少 CPU 内核将有助于提高一个人的处理意图,除此之外,间接成本(上面为[TIME]
- 和 -域所[SPACE]
描绘的)实际上会恶化任何潜在的积极影响预期。
在生产中确实使用RandomForestRegressor()
过大型数据集后,我可以告诉你,[SPACE]
-domain 是你试图进一步发展的最糟糕的敌人,n_jobs
而且没有任何系统级调整能够克服这个界限(所以越来越多的超低延迟RAM 和越来越多(真正的)CPU 内核是进入任何更大的n_jobs
计算计划的唯一实用方法)。
Kevyn Collins-Thompson 教授的另一个更简单的答案来自 Python 中的应用机器学习课程:
如果我的系统中有 4 个内核,n_jobs = 30
(例如 30 个)将与n_jobs = 4
. 所以没有附加效果
因此,始终可以获得的最大性能是使用
n_jobs = -1