限制numpy中的线程数

eeq64g8w  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(85)

看起来我的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线程的矩阵乘法。

ct2axkht

ct2axkht1#

有一些常见的多CPU库用于数值计算,包括NumPy内部。有一些环境标志,您可以在运行脚本之前设置 * 以限制它们使用的CPUS数量。
尝试设置以下所有内容:

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

字符串
有时候,查看多线程到底是在哪里引入的有点棘手。
其他答案显示了其他库的环境标志。它们也可以工作。

pobjuy32

pobjuy322#

环境变量不止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之后实现这一点。一旦他们提交了这些更改,我将更新这篇文章。

hwazgwia

hwazgwia3#

关于在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只在导入时检查这个。
(this是根据@kη伊韦斯上面的评论作为答案重新发布的。)

p5fdfcr1

p5fdfcr14#

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

from threadpoolctl import threadpool_limits

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())

ycl3bljg

ycl3bljg5#

我可以在运行时通过以下方式解决这个问题:

import mkl
mkl.set_num_threads(1)

字符串
我使用下面的代码来使这个片段不太可能在脚本/包中引起问题:

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

相关问题