ホームページ >バックエンド開発 >Python チュートリアル >NumPy をインポートした後、Joblib ワーカーが 1 つのコアでスタックするのはなぜですか?
マルチプロセッシング コア アフィニティの問題
特定のシナリオで、NumPy ライブラリをインポートし、joblib モジュールを使用して CPU 負荷の高いループを並列化しようとすると、 、ループに割り当てられたワーカー プロセスがすべて 1 つのコアに限定され、パフォーマンスの向上が妨げられていることが観察される場合があります。
この問題は、NumPy と基盤となる OpenBLAS ライブラリ (多くの場合使用される) の間の相互作用が原因で発生します。マルチスレッド操作用。デフォルトでは、これらのライブラリはコア アフィニティ設定に干渉し、すべてのワーカー プロセスが同じコアに割り当てられる可能性があります。
解決策: タスク アフィニティをリセットする
簡単な方法解決策は、影響を受けるモジュールをインポートした後に os.system() 関数を使用してタスク アフィニティをリセットすることです。コマンド os.system("taskset -p 0xff %d" % os.getpid()) を実行すると、コア アフィニティがリセットされ、ワーカー プロセスが使用可能なすべてのコアに分散できるようになります。
OpenBLAS CPU アフィニティ リセットを無効にする
または、OpenBLAS の CPU アフィニティ リセット動作を実行時またはビルド時に無効にすることもできます。実行時に環境変数 OPENBLAS_MAIN_FREE を 1 に設定すると、ライブラリはコア アフィニティを調整できなくなります。あるいは、OpenBLAS コンパイル プロセス中に、Makefile.rule に NO_AFFINITY=1 を追加すると、この動作が永久に無効になります。
以上がNumPy をインポートした後、Joblib ワーカーが 1 つのコアでスタックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。