【问题标题】:Speed up and optimize scikit-learn on Google Cloud VM在 Google Cloud VM 上加速和优化 scikit-learn
【发布时间】:2017-12-25 12:07:11
【问题描述】:
我在 Ubuntu 16.04 上的 Google Cloud VM 上运行 Jupyter Notebook。 VM 有 8 个 CPU 和 32 GB 内存(并且可以轻松增加)。
当我运行我的一些 ML 脚本时,我可以看到 VM 没有完全加载。
我注意到为GridSearchCV 添加n_jobs = 16 有助于:VM 机器100% 加载并且计算更快。
有两个问题:
- 我应该寻找哪些 scikit learn 函数的其他参数以确保我使用 VM 的全部功能?例如使用 fit、transform、predict 方法。
- VM 中是否还有其他参数(除了 CPU 和内存)需要更改以加快 ML 任务的速度?
谢谢,
亚历克斯
【问题讨论】:
标签:
python
machine-learning
scikit-learn
google-cloud-platform
virtual-machine
【解决方案1】:
在 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(同样:并非所有事物都支持),它也可用于预测和转换等方法。
在这两个候选者中,B 的粒度(稍微)不那么精细,而embarrassingly parallel 的情况则更多。如果满足完全加速的条件(见上文);我只会在适合的时候使用这种方法。需要时,可以在拟合后重置估计器的n_jobs。但预计这不会有很大帮助。
其他(更明显的硬件方面):
- SSD 与 HDD(如果学习受 IO 限制;不经过测试很难分辨)
另一件非常重要的事情:
- 使用最快的BLAS/LAPACK 实现并确保其构建支持并行化(在这些例程中花费了大量时间;BLAS 示例:矩阵向量乘法;LAPACK 示例:求解系统线性方程组)
- 设置/链接在 numpy/scipy install 完成;不是sklearn
- 虽然我不确定使用liblinear、libsvm 等第三方软件究竟会发生什么。正在使用中(由 sklearn 带来);这也将使用 BLAS
- 我认为这些库带有自己的简化 BLAS 代码,表示为 here,这意味着:我们不在乎
- 通常的候选者是:ATLAS、OpenBLAS、Intel 的 MKL(直觉:从慢到快)等等...
-
Anaconda-distribution 的优势之一是它与MKL 一起提供了开箱即用的功能。