- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我设置了一个简单的实验来检查多核 CPU 在运行 sklearn GridSearchCV
和 KNeighborsClassifier
时的重要性。我得到的结果让我感到惊讶,我想知道我是否误解了多核的好处,或者我没有做对。
完成 2-8 个作业的时间没有差异。怎么来的 ?我注意到 CPU 性能选项卡上的差异。当第一个单元格运行时,CPU 使用率约为 13%,最后一个单元格逐渐增加到 100%。我期待它能更快地完成。也许不是线性更快,也就是 8 个作业会比 4 个作业快 2 倍,但会快一点。
我是这样设置的:
我用的是jupyter-notebook,cell指的是jupyter-notebook cell。
我已经加载了 MNIST 并在 X_play
中使用了 0.05
测试大小 3000
位。
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
和 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)
结果
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
图像。
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
最佳答案
以下是一些可能导致此行为的原因
n_job
都会出现以下行为
n_job=1
和 n_job=2
时,每个线程的时间(GridSearchCV 对模型进行全面训练和测试的每个模型评估时间)为 2.9 秒(总体而言时间~2分钟)n_job=3
时,时间为3.4s(总时间1.4分钟)n_job=4
时,时间为3.8s(总时间58秒)n_job=5
时,时间为4.2s(总时间51秒)n_job=6
时,时间为4.2s(总时间~49秒)n_job=7
时,时间为4.2s(总时间~49秒)n_job=8
时,时间为4.2s(总时间~49秒)现在如您所见,每个线程的时间增加了,但总体时间似乎减少了(尽管在 n_job=4 之后,差异并不是完全线性的)并且保持在
n_jobs>=6 ` 这是因为初始化和释放线程会产生成本。参见 this github issue和 this issue .
此外,可能还有其他瓶颈,例如数据太大而无法同时广播到所有线程、线程抢占 RAM(或其他资源等)、如何将数据推送到每个线程线程等
我建议您阅读 Ahmdal 定律,该定律指出通过公式给出的并行化可以实现的加速在理论上存在界限 图片来源:Ahmdal's Law : Wikipedia
最后,这也可能是由于数据大小和您用于训练的模型的复杂性所致。
这里是 a blog post解释有关多线程的相同问题。
关于python - 增加 n_jobs 对 GridSearchCV 没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50993867/
当我在cross_val_score()中使用参数n_jobs时。 当我的数据规模较小时,它效果很好,但当我扩大数据规模时,多处理似乎不起作用。 怎么会这样? 附注:我使用 IPython 最佳答案
我正在运行一个代码来进行二进制分类并在之后预测标签。该代码与一个大小为 257673 行和 47 列的特定数据库完美运行。当我尝试使用 91690 行和 10 列之一(当然更小)时,我收到错误调用:
当我将 n_jobs 变量传递给 sklearn 中的 LinearRegression 时,我收到一个错误。 根据documentation它应该支持 n_jobs 变量。 我做错了吗? >>> s
这不是一个真正的问题,但我想了解: 在 Win7 4 核 8 GB 系统上从 Anaconda distrib 运行 sklearn 在 200.000 个样本*200 个值表上拟合 KMeans 模
我经常用 GridSearchCV 用于超参数调整。例如,用于调整正则化参数 C在 Logistic Regression .每当我使用的估算器有自己的 n_jobs参数我很困惑在哪里设置它,在估计器
我开发了一个 Python 脚本,它基本上读取 excel 文件并使用 sklearns GridSearchCV 训练模型,使用 n_jobs 语句: def create_table():
尝试通过 n_jobs 参数将 gridsearch CV 与多个作业一起使用,我可以使用 htop 看到它们都已启动并运行,但它们都卡在/分配在同一个核心上,每个使用 25%(我使用的是4核机)。我
def test_n_jobs_parallel(): # Test to check the functioning of n_jobs parameter. for kernel in k
我想知道,哪个更好地与 GridSearchCV( ..., n_jobs = ... ) 一起使用来为模型选择最佳参数集, n_jobs = -1 或 n_jobs 较大的数字, 如 n_jobs
有人使用 sklearn 类的“n_jobs”吗?我在 Anaconda 3.4 64 位中使用 sklearn。 Spyder 版本是 2.3.8。将某些 sklearn 类的“n_jobs”参数设
我目前在使用 scikit 学习库中的 GridSearchCV 方法时遇到问题。我已经为此苦苦挣扎了一个星期,而且似乎还无法解决。当调用它来优化 C 参数上的线性 SVM 时,它会一直卡住。奇怪的是
我一直在使用带有 4 个 NVIDIA GPU 的 Keras 框架来训练 NN 模型。 (数据行数:~160,000,列数:5)。现在我想通过使用 GridSearchCV 来优化它的参数。 但是,
感谢Philip Cloud的伟大answer to a previous question ,我深入研究了 scikit 中 pairwise_distances 的源代码。 相关部分是: def
我在 scikit learn 中编写了自定义转换器并构建了管道。现在我正在尝试使用 GridSearchCV 调整此管道。一切工作正常,直到我尝试设置 n_jobs=-1 来加速该过程。 GUI J
我设置了一个简单的实验来检查多核 CPU 在运行 sklearn GridSearchCV 和 KNeighborsClassifier 时的重要性。我得到的结果让我感到惊讶,我想知道我是否误解了多核
我正在尝试使用 GridSearchCV 来评估具有不同参数集的不同模型。逻辑回归和 k-NN 不会导致问题,但当 n_jobs=-1 时,决策树、随机森林和一些其他类型的分类器不起作用。 for c
我正在运行 GridSearchCV,其中基本估计器是 RandomForestRegressor。我发现在估计器和网格搜索之间拆分处理器会更有效,因此在机器的 24 个可用处理器中,我将 n_job
我陷入了“困境”。这是我的代码的结构: 行为类似于抽象类的基类 可以实例化的子类 一种设置参数并使用 n_jobs=-1 调用 RandomizedSearchCV 或 GridSearchCV 的方
我正在尝试使用 sklearn 的逻辑回归训练一个巨大的数据集。我已经设置了参数n_jobs=-1(也尝试过n_jobs = 5, 10, ...),但是当我打开htop时,我可以看到它仍然只使用一个
在 sklearn.model_selection.cross_val_score 中使用 n_jobs = -1 作为参数时出现错误。我是深度学习和 ANN 的初学者,根据 this 中的讲师在 k
我是一名优秀的程序员,十分优秀!