如何在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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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