web-dev-qa-db-ja.com

numpyのスレッド数を制限する

私のnumpyライブラリは4つのスレッドを使用しているようで、_OMP_NUM_THREADS=1_を設定してもこれは止まりません。

numpy.show_config()を使用すると、次の結果が得られます。

_atlas_threads_info:
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/lib64/atlas']
    define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
    language = f77
    include_dirs = ['/usr/include']
blas_opt_info:
    libraries = ['ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/lib64/atlas']
    define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
    language = c
    include_dirs = ['/usr/include']
atlas_blas_threads_info:
    libraries = ['ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/lib64/atlas']
    define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
    language = c
    include_dirs = ['/usr/include']
openblas_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/lib64/atlas']
    define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
    language = f77
    include_dirs = ['/usr/include']
_

だから私はそれがブラスを使用していることを知っていますが、行列の乗算に1つのスレッドを使用する方法を理解できません。

29
drjrm3

次のすべてを設定してみてください。

export MKL_NUM_THREADS=1
export NUMEXPR_NUM_THREADS=1
export OMP_NUM_THREADS=1

正確にマルチスレッドが導入されている場所を確認するのは少し難しい場合があります。

37

前述の3つ以上の環境変数があります。以下は、環境変数と、その変数を使用して生成されるスレッドの数を制御するパッケージの完全なリストです。 import numpyを実行する前にこれらの変数を設定する必要があることに注意してください。

OMP_NUM_THREADS: openmp,
OPENBLAS_NUM_THREADS: openblas,
MKL_NUM_THREADS: mkl,
VECLIB_MAXIMUM_THREADS: accelerate,
NUMEXPR_NUM_THREADS: numexpr

したがって、実際には次のことができます。

import os
os.environ["OMP_NUM_THREADS"] = "4" # export OMP_NUM_THREADS=4
os.environ["OPENBLAS_NUM_THREADS"] = "4" # export OPENBLAS_NUM_THREADS=4 
os.environ["MKL_NUM_THREADS"] = "6" # export MKL_NUM_THREADS=6
os.environ["VECLIB_MAXIMUM_THREADS"] = "4" # export VECLIB_MAXIMUM_THREADS=4
os.environ["NUMEXPR_NUM_THREADS"] = "6" # export NUMEXPR_NUM_THREADS=6

2018年11月の時点で、Numpy開発者はimport numpyを実行した後にもこれを可能にすることに取り組んでいることに注意してください。これらの変更をコミットしたら、この投稿を更新します。

11
Amir

これを行うことに関して、bashプロンプトではなく、python script内から this thread あなた以下を実行できます(上記の回答と同じコマンド)。

import os
os.environ["MKL_NUM_THREADS"] = "1" 
os.environ["NUMEXPR_NUM_THREADS"] = "1" 
os.environ["OMP_NUM_THREADS"] = "1" 

しかし、あなたはそれをの前に置く必要がありますあなたはimport numpyどうやらnumpyはインポート時にこれをチェックするだけです。

(これは上記の@kivesコメントに基づく回答として再投稿されます。)

10
seth127

次の方法で、実行時にこれを修正することができました。

import mkl
mkl.set_num_threads(1)

次のコードを使用して、このスニペットがスクリプト/パッケージで問題を引き起こす可能性を低くしています。

try:
    import mkl
    mkl.set_num_threads(1)
except:
    pass
0
The Unfun Cat