回答

3

不,scikit学习不玩GIL的任何技巧。相反,它使用joblib来表示它的所有并行性,它产生了多个进程来完成它的工作。您可以使用自定义joblib Parallel构造实现您想要的效果。

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

+0

感谢您的意见,不幸的是,这个问题实际上并没有解决,因为我需要依赖外部库来实现使用不同线程的并行机制(用于与更大应用程序的其他部分兼容)。因此,我想为svm找到一个替代库来释放GIL ..或者欺骗scikits.learn来做到这一点。你可能有什么建议吗? –

+1

您可能想在子流程中运行scikit-learn代码。它生成的分类器可以被酸洗,所以你可以很容易地在它们之间传输它们;唯一的问题是以有效的方式传输训练数据(可能通过文件系统?)。 –

+1

另外,libsvm包装器是用[Cython](http://cython.org)编写的。我认为将封装器代码打包为[发布GIL]应该相当简单(http://docs.cython.org/src/userguide/external_C_code.html#acquiring-and-releasing-the-gil)。如果你这样做,并且它解决了你的问题,请在github上提交你的更改作为pull请求。 另请注意,scikit-learn估计器并不意味着线程安全:跨线程使用不相关的估计器实例。 – ogrisel

2

一些sklearn Cython类在性能关键部分内部释放GIL,例如0.15(2014年初发布)和libsvm包装器所做的决策树(例如在随机森林中使用)。

虽然这不是一般规则。如果您确定sklearn中可以更改为释放GIL的性能关键的cython代码,请随时发送pull请求。