为了账号安全,请及时绑定邮箱和手机立即绑定

增加n_jobs对GridSearchCV没有影响

增加n_jobs对GridSearchCV没有影响

眼眸繁星 2021-04-02 11:07:03
我设置了一个简单的实验,以在运行sklearnGridSearchCV时检查多核CPU的重要性KNeighborsClassifier。我得到的结果令我感到惊讶,我想知道我是否误解了多核的好处,或者我做得不好。2-8个工作之间的完成时间没有差异。怎么来的 ?我已经注意到“ CPU性能”选项卡上的差异。在第一个单元运行时,CPU使用率约为13%,而最后一个单元则逐渐增加到100%。我期望它能更快完成。也许不是线性地更快,也就是8个工作将比4个工作快2倍,但要快一点。这是我的设置方式:我正在使用jupyter-notebook,单元格是指jupyter-notebook单元格。我已经加载了MNIST,并在中使用0.05了3000数字的测试大小X_play。from sklearn.datasets import fetch_mldatafrom sklearn.model_selection import train_test_splitmnist = 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并设置一个GridSearchCVfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.model_selection import GridSearchCVknn_clf = KNeighborsClassifier()param_grid = [{'weights': ["uniform", "distance"], 'n_neighbors': [3, 4, 5]}]然后,我为8个n_jobs值完成了8个单元格。我的CPU是具有4核8线程的i7-4770。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)结果Parallel(n_jobs=1)]: Done  18 out of  18 | elapsed:  2.0min finishedParallel(n_jobs=2)]: Done  18 out of  18 | elapsed:  1.4min finishedParallel(n_jobs=3)]: Done  18 out of  18 | elapsed:  1.3min finishedParallel(n_jobs=4)]: Done  18 out of  18 | elapsed:  1.3min finishedParallel(n_jobs=5)]: Done  18 out of  18 | elapsed:  1.4min finishedParallel(n_jobs=6)]: Done  18 out of  18 | elapsed:  1.4min finishedParallel(n_jobs=7)]: Done  18 out of  18 | elapsed:  1.4min finishedParallel(n_jobs=8)]: Done  18 out of  18 | elapsed:  1.4min finished第二次测试随机森林分类器的使用要好得多。测试大小为0.5,30000图片。from sklearn.ensemble import RandomForestClassifierrf_clf = RandomForestClassifier()param_grid = [{'n_estimators': [20, 30, 40, 50, 60], 'max_features': [100, 200, 300, 400, 500], 'criterion': ['gini', 'entropy']}]
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

以下是一些可能导致此行为的原因

  • 随着数量的增加 线程数,初始化和释放每个线程会产生明显的开销。我在i7 7700HQ上运行了您的代码,每次增加时,我都会看到以下行为n_job

    • n_job=1n_job=2每个线程的时间(时间由每模型GridSearchCV评价充分训练模型和测试)为2.9s(总时间约2分钟)

    • n_job=3,时间为3.4s(总时间1.4分钟)

    • n_job=4,时间为3.8S(总时间58秒)

    • n_job=5,时间为4.2s(总时间51秒)

    • n_job=6,时间为4.2秒(总时间约为49秒)

    • n_job=7,时间为4.2秒(总时间约为49秒)

    • n_job=8,时间为4.2秒(总时间约为49秒)

  • 现在您可以看到,每个线程的时间增加了,但总体时间似乎有所减少(尽管超过了n_job=4 the different was not exactly linear) and remained constained withn_jobs> = 6`,这是由于初始化和释放线程会产生成本)。请参见github问题和本期。

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

  • 我建议您阅读有关Ahmdal定律的信息,该定律指出通过并行化可以实现加速的理论界限,该界限由以下公式提供: 

  • //img1.sycdn.imooc.com//6075609300016f2d07870161.jpg

  • Image Source:Ahmdal定律:Wikipedia

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

这是一篇博客文章,解释了有关多线程的相同问题。


查看完整回答
反对 回复 2021-04-13
  • 1 回答
  • 0 关注
  • 378 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信