Scikit-learn 是不是发布了 python GIL?

Posted

技术标签:

【中文标题】Scikit-learn 是不是发布了 python GIL?【英文标题】:Does Scikit-learn release the python GIL?Scikit-learn 是否发布了 python GIL? 【发布时间】:2011-11-15 12:38:06 【问题描述】:

我想在不同的线程中训练多个一类 SVM。 有人知道 scikit 的 SVM 是否发布了 GIL? 我在网上没有找到任何答案。

谢谢

【问题讨论】:

【参考方案1】:

一些 sklearn Cython 类确实在内部发布了性能关键部分的 GIL,例如 0.15 的决策树(例如用于随机森林)(将于 2014 年初发布)和 libsvm 包装器。

但这不是一般规则。如果您发现 sklearn 中的性能关键 cython 代码可以更改以发布 GIL,请随时发送拉取请求。

【讨论】:

【参考方案2】:

不,scikit-learn 不会与 GIL 玩任何技巧。相反,它使用joblib 来实现其所有并行性,这会产生多个进程来完成其工作。您可以使用自定义 joblib Parallel 构造来实现您想要的。

如果您打算在具有不同设置的同一数据集上训练多个分类器以找到最佳分类器,请考虑使用 GridSearchCV 类,它会为您处理并行性。

【讨论】:

感谢您的 cmets,不幸的是问题实际上并没有解决,因为我需要依赖外部库来实现使用不同线程的并行性(为了与更大应用程序的其他部分兼容)。因此,我想为 svm 找到一个替代库来发布 GIL .. 或欺骗 scikits.learn 来做到这一点。您有什么建议吗? 您可能希望在子进程中运行 scikit-learn 代码。它产生的分类器可以腌制,因此您可以很容易地在进程之间转移它们;唯一的问题是以有效的方式传输训练数据(也许通过文件系统?)。 libsvm 包装器也是用Cython 编写的。我认为将包装代码修补到release the GIL 应该非常简单。如果您这样做并且它解决了您的问题,请在 github 上将您的更改作为拉取请求提交。另外:请注意,scikit-learn 估计器并不是线程安全的:跨线程使用不同的估计器实例。 另外,如果你想克隆估算器以在线程中传递它,同时隔离它们,你可以使用from sklearn.base import clone,然后调用clone(estimator)

以上是关于Scikit-learn 是不是发布了 python GIL?的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 决策树是不是支持无序(“枚举”)多类特征?

ImportError:DLL 加载失败:%1 不是有效的 Win32 应用程序 - scikit-learn+

scikit-learn 中的 MultiOutputRegressors 和 MultiOutputClassifiers 是不是也使用目标作为输入?

scikit-learn TruncatedSVD的解释方差比不是降序[重复]

PySpark 中是不是有与 scikit-learn 的 sample_weight 等效的参数?

scikit-learn 中的 minibatch kmeans 是不是通过使用部分拟合进行增量学习?