我想知道,最好与 GridSearchCV( ..., n_jobs = ... )
一起使用来为模型挑选最佳参数集 n_jobs = -1
或< strong> n_jobs
,数字很大,如 n_jobs = 30
?
基于Sklearn文档:
n_jobs = -1
表示将在所有计算器上调度计算 计算机的CPU。
在我的电脑上我有一个Intel i3 CPU,它有2个核心和4个线程,所以这意味着如果我设置 n_jobs = -1
,隐含地它将等于 n_jobs = 2
?
答案 0 :(得分:4)
...这是否意味着如果我设置
n_jobs = -1
,隐含地它将等于n_jobs = 2
?
GridSearchCV()
设置完成的
在一些虚拟化机器中,可以综合模拟CPU /内核,结果并不像你已知的Intel CPU / i3那样简单。
如果有疑问,可以通过一个简单的案例(在一个确实很小的数据集上,而不是完整的模型空间搜索......)测试这个并让故事继续下去证明这一点。
n_jobs = -1
类似的主机平台“自我检测”可能会报告不同系统/设置的更多详细信息:
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'
'''
...最好与GridSearchCV一起使用,为模型选择最佳参数集,{
''' [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) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= '''
或n_jobs = -1
,如{{1}这样的大数字}?
Scikit工具(以及许多其他人遵循此做法)过去常常在使用的 n_jobs
指令上生成所需数量的并发流程实例(以便从共享中逃脱GIL-lock步进 - 如果对细节感兴趣,请在其他地方阅读更多信息。)
此流程实例化不是免费的(在时间上,即花费相当多的 n_jobs = 30
- 域成本,但也在空间方面,即花费在至少 n_jobs
- [TIME]
-domain中单个python流程实例的RAM分配。
鉴于此,你的斗争是对抗双刃剑的战斗。
尝试“低估” CPU 会让(某些)CPU内核可能空转。
试图“超量预订” RAM -space会使您的性能比预期的更差,因为虚拟内存将转变操作系统交换,从而使您的机器学习规模数据访问时间从 { {1}}超过100,000 x n_jobs
,这几乎不会令人满意。
[SPACE]
的整体效果是Amdahl's Law ( the re-formulated one, not an add-on overhead-naive version )的主题,因此将有多少CPU内核有助于改善的实用最佳峰值(最大值)一个人的处理意图,除此之外,间接成本(概述上述~ 10+[ns]
- 和~ 10+ [ms]
- 域)实际上会恶化任何潜在的积极影响预期。
在生产中确实使用了大量数据集 n_jobs = a_reasonable_amount_of_processes
,我可以告诉你 [TIME]
-domain是你的最糟糕的尝试增长[SPACE]
的敌人任何更远的系统级调整都无法克服这个边界(因此越来越多的超低延迟RAM和越来越多(真实的)CPU内核是唯一可行的实用方法实际上任何更大的RandomForestRegressor()
计算计划。)
答案 1 :(得分:1)
Kevyn Collins-Thompson教授在Python中应用机器学习课程的另一个更简单的答案:
如果我的系统中有4个核心,n_jobs = 30(例如30个)将与n_jobs = 4相同..所以没有额外的效果..
因此,可以获得的最大性能始终是使用n_jobs = -1 ..