web-dev-qa-db-ja.com

Python:numpyのマルチスレッド化をどのように停止しますか?

これはばかげた質問のように思えるかもしれませんが、部門内の他の人と共有する計算サーバーで定期的にジョブを実行する必要があり、10個のジョブを開始するときは、10個のコアだけを使用し、もっと;実行ごとに1つのコアを使用してもう少し時間がかかるかどうかは気にしません。他の領域に侵入したくないので、ジョブを再利用する必要があります。 10個のソリッドコアが必要なだけです。

より具体的には、Python 2.7.3およびnumpy 1.6.1に基づいている)RedhatでEnthought 7.3-1を使用していますが、質問はより一般的です。何時間もこの質問に対する答えのようなもので、何の役にも立たないので、誰かがマルチスレッドをオフにする可能性のあるnumpyのスイッチを知っているなら、私に知らせてください。

47
MasDaddy

をセットする MKL_NUM_THREADS環境変数を1に設定します。ご想像のとおり、この環境変数は、Enthoughtのnumpyビルドの一部として含まれているMath Kernel Libraryの動作を制御します。

これは、スタートアップファイル.bash_profileでexport MKL_NUM_THREADS=1。また、スクリプト内からそれを実行して、プロセス固有にすることもできます。

26
Bi Rico

うまくいけば、これはあなたがいるかもしれないすべてのシナリオとシステムを修正します。

  1. OpenBLASまたはMKLを使用しているかどうかを確認するには、numpy.__config__.show()を使用します

この時点から、これを行うにはいくつかの方法があります。

2.1。ターミナルルートexport OPENBLAS_NUM_THREADS=1またはexport MKL_NUM_THREADS=1

2.2(これが私の好みの方法です)pythonスクリプトimport osで、行os.environ['OPENBLAS_NUM_THREADS'] = '1'またはos.environ['MKL_NUM_THREADS'] = '1'を追加します。

[〜#〜]ノート[〜#〜]os.environ[VAR]を設定する場合、スレッド数は文字列でなければなりません!また、この環境変数before importing numpy/scipyを設定する必要がある場合もあります。

OpenBLASまたはMKL以外にもおそらく他のオプションがありますが、ステップ1はそれを理解するのに役立ちます。

22
SARose

スレッド数を動的に設定し、環境変数を介してグローバルに設定したくない場合は、次のようにすることもできます。

import mkl
mkl.set_num_threads(2)
15
knub

私はこれをビリコの回答へのコメントとして残したでしょうが、私には必要な特権がありません。 numpyの最近のバージョンでは、NUMEXPR_NUM_THREADS = 1も設定する必要があることがわかりました

私の手では、MKL_NUM_THREADS = 1を設定しなくてもこれで十分ですが、状況によっては両方を設定する必要がある場合があります。

9
R_Beagrie