限制numpy中的线程数

时间:2015-06-11 21:12:20

标签: python multithreading 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']

所以我知道它正在使用blas,但我无法弄清楚如何使用1个线程进行矩阵乘法。

5 个答案:

答案 0 :(得分:35)

尝试设置以下所有内容:

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

有时候看到引入多线程的确切位置有点棘手。

答案 1 :(得分:10)

关于在python脚本中执行 而不是在bash提示符下执行操作,根据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的评论重新发布的答案。)

答案 2 :(得分:10)

有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之后做到这一点。他们提交更改后,我将对其进行更新。

答案 3 :(得分:7)

尝试了以上一些幸运的解决方案后,我在Numpy threadpoolctl中找到了对docs的引用。此方法有效,即使已导入numpy也可以使用它。

with threadpool_limits(limits=1, user_api='blas'):
  # single threaded numpy code...

只需确保使用在执行操作时列出的user_api

from threadpoolctl import threadpool_info
from pprint import pprint
import numpy
pprint(threadpool_info())

答案 4 :(得分:0)

我可以通过以下方式在运行时修复此问题:

import mkl
mkl.set_num_threads(1)

我使用以下代码使此代码段不太可能在脚本/程序包中引起问题:

try:
    import mkl
    mkl.set_num_threads(1)
except:
    pass