如何在GridSearchCV(...,n_jobs = ...)中找到最佳进程数?

时间:2018-05-04 21:09:14

标签: python machine-learning parallel-processing scikit-learn parallelism-amdahl

我想知道,最好与 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

2 个答案:

答案 0 :(得分:4)

  

...这是否意味着如果我设置n_jobs = -1,隐含地它将等于n_jobs = 2

这个很容易:

用于检测CPU内核数量的python(scipy / joblib)用于检测CPU内核的数量,这对于调度并发(独立)进程是合理的,因为请求是使用GridSearchCV()设置完成的

enter image description here看到3-CPU核心很有趣?

在一些虚拟化机器中,可以综合模拟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}这样的大数字}?

没有简单的“ One-Size-Fits-All ”答案:

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 ..

相关问题