回答

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請求。