在Google Cloud VM上加速和优化scikit-learn

我在Google Cloud VM上的Ubuntu 16.04系统中运行Jupyter Notebook。该VM配备了8个CPU和32GB内存(可以轻松增加)。当我运行一些机器学习脚本时,我发现VM并未完全负载。我注意到在GridSearchCV中添加n_jobs = 16有帮助:VM的负载达到100%,计算速度也更快了。

有两个问题:

  • 我应该查看scikit-learn函数的哪些其他参数,以确保充分利用VM的全部能力?例如在fit、transform、predict方法中使用这些参数。
  • 除了CPU和内存之外,VM还有哪些其他参数我应该调整以加速机器学习任务?

谢谢,@


回答:

在sklearn的并行化方面,一切都由n_jobs控制(很多都被底层的BLAS/LAPACK构建所隐藏;请参见下文!)。

在您的示例中,有两个不同的层次:

  • A:在算法级别的并行化,适用于某些方法
    • 例如RandomForestClassifier
    • 在算法级别激活:例如clf = RandomForestClassifier(n_jobs=10)
    • 从文档中很难看出粒度和效果:对于RandomForest,如果n_jobs <= n_estimators,你可以获得接近线性的加速(因为每个单独的估计器都可以独立处理!)
  • B:在外部GridSearchCV上的并行化
    • 在GridSearch级别激活:例如clf = GridSearchCV(clf_, parameters, n_jobs=10)
    • 如果n_grid_search_trials >= n_jobs,这将实现接近线性的加速

如果使用了A(再次说明:并非所有方法都支持),它也会用于其方法如predict和transform。

在这两个候选者中,B的粒度稍微粗一些,更像是令人尴尬的并行情况。如果满足完全加速的条件(见上文);我只会在fit期间使用这种方法。当需要时,可以在拟合后重置估计器的n_jobs。但预计这不会有很大帮助。

其他(更明显的硬件方面):

  • SSD与HDD(如果学习过程有点I/O密集型;没有测试很难判断)

另一个非常重要的事情

  • 使用可用的最快BLAS/LAPACK实现,并确保其构建时支持并行化(这些例程中花费了大量时间;BLAS示例:矩阵-向量乘法;LAPACK示例:解线性方程组)
    • 设置/链接是在numpy/scipy安装时完成的;不是sklearn
      • 虽然我不确定使用像liblinearlibsvm等第三方软件(由sklearn引入)时会发生什么;这些也将使用BLAS
      • 我认为这些库带有自己的简化BLAS代码,如这里所示,这意味着我们不需要关心
    • 常见的候选者有:ATLAS、OpenBLAS、Intel的MKL(直觉上:从慢到快)等等…
    • Anaconda分发版的一个优势是它默认自带MKL

Related Posts

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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