我在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
,这将实现接近线性的加速
- 在GridSearch级别激活:例如
如果使用了A(再次说明:并非所有方法都支持),它也会用于其方法如predict和transform。
在这两个候选者中,B的粒度稍微粗一些,更像是令人尴尬的并行情况。如果满足完全加速的条件(见上文);我只会在fit期间使用这种方法。当需要时,可以在拟合后重置估计器的n_jobs
。但预计这不会有很大帮助。
其他(更明显的硬件方面):
- SSD与HDD(如果学习过程有点I/O密集型;没有测试很难判断)
另一个非常重要的事情: