【问题标题】:How to find an optimum number of processes in GridSearchCV( ..., n_jobs = ... )?如何在 GridSearchCV( ..., n_jobs = ... ) 中找到最佳进程数?
【发布时间】:2018-10-15 10:08:36
【问题描述】:

我想知道,GridSearchCV( ..., n_jobs = ... ) 使用哪个更好,以便为模型选择最佳参数集,n_jobs = -1@987654323 @ 有一个很大的数字,
比如 n_jobs = 30 ?

基于 Sklearn 文档:

n_jobs = -1 表示计算将在所有 计算机的 CPU。

在我的 PC 上,我有一个 Intel i3 CPU,它有 2 个内核和 4 个线程,这是否意味着如果我设置 n_jobs = -1,它会隐含地等于 @987654327 @ ?

【问题讨论】:

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


    【解决方案1】:

    Kevyn Collins-Thompson 教授的另一个更简单的答案,来自 Python 中的应用机器学习课程:

    如果我的系统中有 4 个内核,n_jobs = 30(以 30 个为例)将与 n_jobs = 4 相同。所以没有额外的效果

    所以可以得到的最大性能总是使用n_jobs = -1

    【讨论】:

      【解决方案2】:

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

      这个很简单:

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

      看到 3-CPU-core 好笑吗?

      在某些可以综合模拟 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 = -1n_jobsn_jobs = 30 这样的大数字?

      对此没有简单的“一刀切”答案:

      Scikit 工具(以及许多其他工具遵循这种做法)过去常常在使用 n_jobs 指令时生成所需数量的并发进程实例(以便从共享 GIL-锁定步进 - 如果对细节感兴趣,请在其他地方阅读更多信息)。

      这个过程实例化不是没有成本的(既在时间方面,即花费大量的 [TIME] 域成本,但在空间方面,即至少花费n_jobs-乘以 [SPACE]-域中单个 python 进程实例的 RAM 分配。

      鉴于此,你的战斗是与双刃剑的战斗。

      尝试“减少”CPU 将使(某些)CPU 内核可能闲置。
      尝试“超额预订”RAM-空间将使您的性能比预期的更差,因为虚拟内存会导致操作系统交换,从而使您的机器学习规模的数据访问时间从 @ 987654338@ 比 ~ 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核有助于提高一个人的处理意图,除此之外,间接成本(上面为[TIME]- 和[SPACE]- 域所勾画的)实际上会恶化任何潜在的积极影响预期。

      在生产中确实在大型数据集上使用过 RandomForestRegressor(),我可以告诉你 [SPACE] 域是你试图增长n_jobs 任何进一步的系统级调整都无法克服这个界限(所以越来越多的超低延迟 RAM 和越来越多(真正的)CPU 内核是进入更大的@987654346 的唯一实用方法@计算计划)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-28
        • 2020-12-01
        • 2017-12-08
        • 2019-09-30
        • 2019-02-01
        • 2018-12-02
        • 2019-03-12
        • 2020-11-09
        相关资源
        最近更新 更多