有人使用sklearn-classes的"n_jobs"吗?我在 Anaconda 3.4 64 位中使用 sklearn。Spyder版本是2.3.8。将某些 sklearn 类的"n_jobs"参数设置为非零值后,我的脚本无法完成其执行。为什么会这样?
一些scikit-learn工具,如GridSearchCV和cross_val_score,在内部依赖于Python的多处理模块,通过将n_jobs>1作为参数传递来并行执行到多个Python进程。
摘自 Sklearn 文档:
问题是Python多处理会进行分叉系统调用 出于性能原因,无需遵循 exec 系统调用。 许多库喜欢(某些版本的)OSX下的Accelerate/vecLib, (部分版本)MKL,GCC 的 OpenMP 运行时,nvidia 的 Cuda(和 可能还有很多人),管理自己的内部线程池。在 调用 fork,子进程中的线程池状态已损坏: 线程池认为它有很多线程,而只有主线程 线程状态已分叉。可以更改库 让他们检测分叉何时发生并重新初始化线程 在这种情况下的池:我们为OpenBLAS做了这件事(在master中合并了上游 自 0.2.10 以来),我们为 GCC 的 OpenMP 运行时贡献了一个补丁(不是 但已审查)。