joblib/threadpoolctl

Python helpers to limit the number of threads used in native libraries that handle their own internal threadpool (BLAS and OpenMP implementations)

解決する問題

科学計算やデータサイエンスのプログラムは、独自のスレッドプールを維持する BLAS や OpenMP などのネイティブライブラリに依存することがよくあります。並列処理をネストすると(たとえば、独自のマルチスレッドコード内で BLAS 操作を実行する場合)、これらの基盤となるプールが CPU を過剰サブスクライブし、速度低下を引き起こす可能性があります。このプロジェクトは、これらのスレッドプールを検査し、使用するスレッド数を制限するツールを提供し、無駄を回避してパフォーマンスを予測可能に保つのに役立ちます。

仕組み

Python プロセスにすでにロードされているネイティブ共有ライブラリ(たとえば、numpy や scipy から)を検査し、そのスレッドプール構成を公開することで機能します。次のことができます。

  • コマンドライン(python -m threadpoolctl -i numpy scipy.linalg)を使用して、各ライブラリのスレッドプールの JSON スナップショットを出力します。
  • Python から threadpool_info() を呼び出して、同じ情報をプログラムで確認します。
  • threadpool_limits コンテキストマネージャーまたは ThreadpoolController オブジェクトを使用して、特定のライブラリファミリ(BLAS や OpenMP など)の最大スレッド数を一時的に設定します。
  • 制限を関数のデコレータとして適用したり、各ワーカースレッドでコントローラーを使用して Python スレッドプール内の制限を管理したりできます。

このプロジェクトは、ライブラリによって制限のセマンティクスが異なる(グローバルなプロセス全体の制限を設定するものもあれば、現在のスレッドのみに影響するものもある)という事実も処理し、意図に一致する API を選択しようとします。

対象読者

これは、ネイティブスレッドプールを使用する数値ライブラリを扱う Python 開発者向けです。たとえば、パフォーマンスに敏感な並列ワークロードで numpy、scipy、scikit-learn、xgboost などを使用する人向けです。Python レベルの並列処理とネイティブの並列処理を組み合わせ、各レイヤーが使用するスレッド数を調整したい場合に特に役立ちます。

ハイライト

  • Python パッケージによってロードされたスレッドプールをすばやく検査するためのコマンドラインツール。
  • シンプルな関数(threadpool_info)と再利用可能なオブジェクト(ThreadpoolController)の両方を備えた Python API。
  • 特定のコードセクションまたは関数内のスレッド数を制限するためのコンテキストマネージャーとデコレータ。
  • BLAS ライブラリ(OpenBLAS、MKL、FlexiBLAS)と OpenMP 実装(libgomp、libiomp、libomp)の両方をサポート。
  • 各ワーカースレッドで制限を設定し、コントローラーを介して全体的な制御を維持することで、Python スレッドプールを処理できます。
  • 実行時に FlexiBLAS バックエンドを切り替えるための実験的な API が含まれています。
  • 拡張可能:スレッド制限 API を公開する他のネイティブライブラリ用にカスタムコントローラーを作成して登録できます。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト