62

部門内の他のメンバーと共有しているコンピューティング サーバーで定期的にジョブを実行する必要があります。10 個のジョブを開始するときは、10 個のコアだけを使用したいと考えています。実行ごとに単一のコアで少し時間がかかるかどうかは気にしません。他の人の領域に侵入したくないだけです。これにより、仕事を放棄する必要があります。10 個のソリッド コアが必要なだけです。

Python 2.7.3 と numpy 1.6.1 に基づく Redhat で Enthought 7.3-1 を使用していますが、問題はより一般的です。

4

5 に答える 5

50

うまくいけば、これですべてのシナリオとシステムが修正されることを願っています。

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

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

2.1. ターミナルルートexport OPENBLAS_NUM_THREADS=1export MKL_NUM_THREADS=1

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

os.environ[VAR]スレッド数を設定するときは、文字列でなければならないことに注意してください。また、 numpy/scipy をインポートする前に、この環境変数を設定する必要がある場合があります。

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

于 2018-02-07T13:54:56.850 に答える
20

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

import mkl
mkl.set_num_threads(2)
于 2016-10-26T07:16:32.740 に答える
12

numpy の最近のバージョンでは、 も設定する必要があることがわかりましたNUMEXPR_NUM_THREADS=1

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

于 2014-02-10T09:41:48.307 に答える
-9

私にとって、使用をやめたので解決策は簡単でしたnumpy.dot

import numpy as np

a = np.random.rand(1e6)
b = np.random.rand(1e6, 10)

# potentially uses multiple threads
dotted = np.dot(a, b)

# single-thread
summed = np.sum(a[:, np.newaxis] * b, axis=0)

assert np.all(dotted == summed)
于 2015-08-11T11:15:15.440 に答える