答えて

3

いいえ、scikit-learnはGILでどんなトリックも再生しません。代わりに、すべての並列処理にjoblibを使用します。これにより、複数のプロセスが処理を開始します。カスタムジョブライブラリParallelを使って、あなたが望むものを達成することができます。

複数のクラシファイアを異なる設定で同じデータセットに訓練して最適なものを見つける場合は、並列性を扱うGridSearchCVクラスの使用を検討してください。

+0

あなたのコメントをありがとうございます。残念ながら、別のスレッドを使用する並列処理(より大きなアプリケーションの他の部分との互換性のために)のために外部ライブラリに依存する必要があるため、この問題は実際には解決されません。したがって私はGILを解放するsvmの代わりのライブラリを探したいと思っています。それを行うには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のプルリクエストとしてあなたの変更を提出してください。 また、scikit-learn見積もりはスレッドセーフではないことに注意してください。スレッド間で見落とし見積もりインスタンスを使用してください。 – ogrisel

2

いくつかのSklearn Cythonクラスは、0.15(2014年初めにリリースされる)とlibsvmラッパーのように、意思決定ツリー(例えばランダムフォレストで使用される)など、パフォーマンスクリティカルセクションで内部的にGILをリリースします。

これは一般的なルールではありません。あなたがGILをリリースするために変更可能なsklearnのパフォーマンスクリティカルなcythonコードを特定した場合は、プルリクエストを送信してください。

関連する問題