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

我想知道,在使用 GridSearchCV( ..., n_jobs = ... ) 选择模型的最佳参数集时,n_jobs = -1n_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的 GridSearchCV())会检测CPU核心的数量,以合理安排并发(独立)进程的执行,这是在请求使用 n_jobs = -1 设置的情况下进行的。

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

在某些虚拟化机器的情况下,可以模拟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 PHYSICALpsutil:          1 CPUs LOGICALpsutil:          psutil.cpu_freq(  per_cpu = True  ) not able to report. ?( v5.1.0+ )psutil:          5.0.1psutil:          psutil.cpu_times( per_cpu = True  ) not able to report. ?( vX.Y.Z+ )psutil:          5.0.1psutil:          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.5NumPy version:     1.10.4Python 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?     TrueVML available?     TrueVML/MKL version:   Intel(R) Math Kernel Library Version 11.3.1 Product Build 20151021 for 32-bit applicationsNumber of threads used by default: 4 (out of 4 detected cores)-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-='''

…在使用GridSearchCV选择模型的最佳参数集时,
n_jobs = -1n_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 的整体效果受到 阿姆达尔定律(重新表述的版本,而不是附加开销天真的版本) 的影响,因此会有CPU核心的实际最优峰值(最大值),超过这个峰值,额外开销(如上所述的 [TIME][SPACE] 领域)实际上会恶化任何潜在的积极影响期望。

在生产环境中确实使用了大型数据集的 RandomForestRegressor(),我可以告诉你 [SPACE] 领域是你试图增加 n_jobs 的最大敌人,没有任何系统级调优能克服这个界限(因此,更多更低延迟的RAM和更多(真实的)CPU核心是进入更大 n_jobs 计算计划的唯一实际方法)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注