增加 n_jobs 对 GridSearchCV 没有影响

2023-11-21

我设置了简单的实验来检查运行 sklearn 时多核 CPU 的重要性GridSearchCV with KNeighborsClassifier。我得到的结果让我感到惊讶,我想知道我是否误解了多核的好处,或者也许我没有做得正确。

2-8 个作业之间的完成时间没有差异。怎么会 ?我注意到 CPU 性能选项卡上的差异。第一个单元运行时,CPU 使用率约为 13%,最后一个单元的 CPU 使用率逐渐增加到 100%。我原以为它会更快完成。也许不是线性更快,即 8 个作业会比 4 个作业快 2 倍,但要快一点。

我是这样设置的:

我使用的是jupyter-notebook,cell指的是jupyter-notebook cell。

我已经加载了 MNIST 并使用0.05测试尺寸为3000a 中的数字X_play.

from sklearn.datasets import fetch_mldata
from sklearn.model_selection import train_test_split

mnist = fetch_mldata('MNIST original')

X, y = mnist["data"], mnist['target']

X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
_, X_play, _, y_play = train_test_split(X_train, y_train, test_size=0.05, random_state=42, stratify=y_train, shuffle=True)

在下一个单元格中我进行了设置KNN and a GridSearchCV

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

knn_clf = KNeighborsClassifier()
param_grid = [{'weights': ["uniform", "distance"], 'n_neighbors': [3, 4, 5]}]

然后我为 8 个 n_jobs 值创建了 8 个单元格。我的CPU是i7-4770,4核8线程。

grid_search = GridSearchCV(knn_clf, param_grid, cv=3, verbose=3, n_jobs=N_JOB_1_TO_8)
grid_search.fit(X_play, y_play)

Results

Parallel(n_jobs=1)]: Done  18 out of  18 | elapsed:  2.0min finished
Parallel(n_jobs=2)]: Done  18 out of  18 | elapsed:  1.4min finished
Parallel(n_jobs=3)]: Done  18 out of  18 | elapsed:  1.3min finished
Parallel(n_jobs=4)]: Done  18 out of  18 | elapsed:  1.3min finished
Parallel(n_jobs=5)]: Done  18 out of  18 | elapsed:  1.4min finished
Parallel(n_jobs=6)]: Done  18 out of  18 | elapsed:  1.4min finished
Parallel(n_jobs=7)]: Done  18 out of  18 | elapsed:  1.4min finished
Parallel(n_jobs=8)]: Done  18 out of  18 | elapsed:  1.4min finished

第二次测试

随机森林分类器的使用要好得多。测试尺寸为0.5, 30000 images.

from sklearn.ensemble import RandomForestClassifier

rf_clf = RandomForestClassifier()
param_grid = [{'n_estimators': [20, 30, 40, 50, 60], 'max_features': [100, 200, 300, 400, 500], 'criterion': ['gini', 'entropy']}]

Parallel(n_jobs=1)]: Done 150 out of 150 | elapsed: 110.9min finished
Parallel(n_jobs=2)]: Done 150 out of 150 | elapsed: 56.8min finished
Parallel(n_jobs=3)]: Done 150 out of 150 | elapsed: 39.3min finished
Parallel(n_jobs=4)]: Done 150 out of 150 | elapsed: 35.3min finished
Parallel(n_jobs=5)]: Done 150 out of 150 | elapsed: 36.0min finished
Parallel(n_jobs=6)]: Done 150 out of 150 | elapsed: 34.4min finished
Parallel(n_jobs=7)]: Done 150 out of 150 | elapsed: 32.1min finished
Parallel(n_jobs=8)]: Done 150 out of 150 | elapsed: 30.1min finished

以下是一些原因might成为此行为的原因

  • With increasing no. of threads, there is an apparent overhead incurred for intializing and releasing each thread. I ran your code on my i7 7700HQ, I saw the following behaviour with each inceasing n_job
    • when n_job=1 and n_job=2每个线程的时间(GridSearchCV 评估每个模型以完全训练模型并测试模型的时间)为 2.9 秒(总时间约为 2 分钟)
    • when n_job=3,时间为3.4秒(总时间1.4分钟)
    • when n_job=4,时间为3.8秒(总时间58秒)
    • when n_job=5,时间为4.2秒(总时间51秒)
    • when n_job=6,时间为 4.2 秒(总时间约 49 秒)
    • when n_job=7,时间为 4.2 秒(总时间约 49 秒)
    • when n_job=8,时间为 4.2 秒(总时间约 49 秒)
  • 现在如您所见,每个线程的时间增加了,但总体时间似乎减少了(尽管超出了n_job=4 the different was not exactly linear) and remained constained withn_jobs>=6` 这是因为初始化和释放线程会产生成本。看这个 github 问题 and 这个问题.

  • 此外,可能还存在其他瓶颈,例如数据太大而无法同时广播到所有线程、线程对 RAM(或其他资源等)的抢占、数据如何推送到每个线程等。

  • I suggest you to read about Ahmdal's Law which states that there is a theoretical bound on the speedup that can be achieved through parallelization which is given by the formula enter image description here Image Source : Ahmdal's Law : Wikipedia

  • 最后,这可能是由于数据大小和您用于训练的模型的复杂性所致。

Here is 一篇博文解释有关多线程的相同问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

增加 n_jobs 对 GridSearchCV 没有影响 的相关文章

随机推荐

  • h1 标签类别(备用)

    我知道 h1 标签对于 SEO 很重要 所以我所有的标题都是 H1 太棒了 现在 我需要在某些页面上有一个稍微不同的标题 作为文本的第一行 通常 我只是将 h1 复制为 h2 并交替 问题 是否可以在标题标签中添加一个类 我尝试过但没有成功
  • 是否可以在handlebars.js模板中使用JavaScript

    描述说明了一切 如何将 JavaScript 脚本放入车把模板中 我想为我的网站制作一个动态 Paypal 按钮
  • PyQt5:对象没有属性“连接”

    我目前正在关注thisPyQt 中线程的教程 代码来自here 由于它是用 PyQt4 和 Python2 编写的 因此我调整了代码以使其能够与 PyQt5 和 Python3 一起使用 这是 gui 文件 newdesign py cod
  • 优化 ORDER BY

    我正在尝试优化这个排序查询posts by reputation字段 第一个 然后id场 第二 如果没有第一个字段查询 则需要约 0 250 秒 但如果有第一个字段查询 则需要约 2 500 秒 意味着慢了 10 倍 太糟糕了 有什么建议吗
  • 我可以得到Python中“print”语句的输出吗?

    pythonw exe 没有控制台 所以我看不到 print 的输出 但我的程序在 python exe 中正常 在 pythonw exe 中失败 我只想查看 python 解释器的日志和我的 print 语句打印的日志 这可行吗 您可以
  • 如何将 Nginx IP 附加到 Kubernetes Nginx Ingress Controller 中的 X-Forwarded-For

    我想知道 如何将 Nginx IP 附加到 X Forwarded For 我在 Ingress 注释中添加了片段 apiVersion networking k8s io v1beta1 kind Ingress metadata nam
  • 适用于字节数组的哈希码方法?

    数组的最佳哈希方法是什么byte 这些数组是序列化的类对象 包含通过 TCP IP 在应用程序之间传递的 jpeg 图像 数组大小约为200k 任何内置的散列函数都可以 根据您对碰撞的关心程度 您可以选择以下选项 从最多碰撞到最少碰撞 MD
  • 托管在不同域上的 JavaScript 可以读取/修改另一个域的 DOM 吗?

    我有一个关于托管在域 例如 CDN 的域 例如 example com 上但从不同域 例如 example net 下的网站加载的 JavaScript 的潜在安全问题 限制的问题 现在想象一下 加载的 JavaScript 将仅读取 修改
  • 存储过程给出与 tsql 不同的结果集,仅在某些服务器上

    这是我昨天提出的问题的后续 您是否曾经遇到过 SQL Server 2008 返回与 SQL Server 2000 不同的结果集的情况 我最初认为存储过程在 sql2000 和 sql2008 上给出了不同的结果 但我已经做了相当多的缩小
  • CLLocation距离转换

    我在 CLLocationDistance 类型的变量中有距离 我需要将其转换为整数变量 我该怎么做 我有用 CLLocationDistance kilometers int distance kilometers intValue 但它
  • 自动终止 AWS EC2 实例?

    有没有办法让 Amazon Web Services EC2 实例自行终止 亚马逊是否有任何东西允许实例在运行超过一个小时后自行终止 Hara Kiri 我可以更改正在运行的实例上的脚本来自行执行此操作 但这可能会失败 而且我不想编辑图像
  • GridView 分页 - 第一个、最后一个、下一个、上一个

    是否可以添加 GridView 分页的 第一个 最后一个 下一个 上一个 选项 我似乎无法弄清楚 我能得到的只是数字 gt gt 代表最后一个 设置 PagerSettings 部分的 PageText 属性的值
  • 不可分配给编辑器中“Expected>”类型的参数

    我的测试是从命令行通过的 但是我编辑了typescript来源使用Atom 当我在编辑器中打开其中一个测试文件时 我在这一行看到一个错误 expect pageObject name getText toEqual Some name 这是
  • Sigar 不满意链接错误

    我是西格尔的新手 我想运行一个简单的测试来了解如何监控我的系统 I added sigar 1 6 4 and log4j作为外部库 但是当我运行它时 我遇到以下错误 Exception in thread main java lang U
  • 可停靠的Windows。浮动窗口和主窗口菜单集成

    在 Visual Studio 2010 中 可停靠 Windows 似乎在任何情况下都能按预期工作 如果 浮动 文档处于活动状态并且选择了某些菜单 例如 编辑 gt 粘贴 则 浮动 文档仍然具有焦点 并且将针对该 浮动 窗口执行该命令 另
  • 我如何循环遍历 OracleDataReader 的所有列

    我有以下代码 我想循环遍历此查询结果中的所有字段并填充名为 field 的字典 给定一个数据读取器 这可能吗 OracleCommand command connection CreateCommand string sql Select
  • 如何将 Nifti 文件转换为 Numpy 数组?

    我的 Nifti 文件 ii gz 中有 3D 数组 我想将其保存为 3D numpy 数组 我使用 Nibabel 将 Numpy 转换为 Nifti1 我可以反其道而行之吗 From nipy import numpy as np im
  • 为什么 StyleCop 建议在方法或属性调用前加上“this”前缀?

    我一直在尝试遵循 StyleCop 的项目指南 看看最终生成的代码是否更好 大多数规则都是合理的 或者是关于编码标准的意见问题 但有一条规则令我困惑 因为我没有看到其他人推荐它 而且因为我没有看到它有明显的好处 SA1101 对 方法或属性
  • 尽管文件 URL 加载,AngularJS 指令 templateUrl 返回 400

    我在 MVC 5 布局页面中有一个基本指令 其中包含一个搜索指令 我的问题是 templateUrl 无法加载 400 错误 如果我直接在浏览器中输入 URL 我可以毫无困难或错误地加载 html 页面 我无法找出加载页面的 AJAX 调用
  • 增加 n_jobs 对 GridSearchCV 没有影响

    我设置了简单的实验来检查运行 sklearn 时多核 CPU 的重要性GridSearchCV with KNeighborsClassifier 我得到的结果让我感到惊讶 我想知道我是否误解了多核的好处 或者也许我没有做得正确 2 8 个