n_jobs在sklearn类中无效

4

有人使用sklearn类的“n_jobs”吗?我在Anaconda 3.4 64位中使用sklearn。Spyder版本是2.3.8。将某些sklearn类的“n_jobs”参数设置为非零值后,我的脚本无法完成执行。为什么会发生这种情况?


如果你使用的是Windows系统,那么尝试在你的脚本中加入以下代码:if __name__ == "__main__":。这对我很有帮助。我把它放在脚本的开头,然后用缩进添加了我的其余代码。 - seralouk
1个回答

0

scikit-learn的一些工具,如GridSearchCV和cross_val_score,在内部依赖于Python的multiprocessing模块,通过将n_jobs > 1作为参数传递来并行执行多个Python进程。

摘自Sklearn文档:

问题在于,出于性能原因,Python multiprocessing执行fork系统调用而没有跟随exec系统调用。许多库(如OSX下的某些版本的Accelerate / vecLib,MKL的某些版本,GCC的OpenMP运行时,nvidia的Cuda(以及可能还有其他))管理自己的内部线程池。在调用fork时,子进程中的线程池状态会被破坏:线程池认为它有很多线程,而只有主线程状态已经被fork。可以更改库以使其检测到fork发生的情况,并在这种情况下重新初始化线程池:我们已经为OpenBLAS做到了这一点(自0.2.10以来合并到上游),并向GCC的OpenMP运行时贡献了一个补丁(尚未审核)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接