限制numpy中的线程数

2025-02-08 08:52:00
admin
原创
53
摘要:问题描述:看来我的 numpy 库正在使用 4 个线程,并且设置OMP_NUM_THREADS=1并不能停止这种情况。numpy.show_config()给出了以下结果:atlas_threads_info: libraries = ['lapack', 'ptf77blas', 'ptcblas'...

问题描述:

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


解决方案 1:

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

尝试设置以下所有内容:

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

有时,要看清楚多线程究竟在哪里引入是有点困难的。

其他答案显示了其他库的环境标志。它们也可能有效。

解决方案 2:

环境变量不止上述 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:

关于从 python 脚本中而不是在 bash 提示符下执行此操作,按照此线程, 您可以执行以下操作(与上面的答案相同的命令):

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

你必须在执行之前import numpy把它放好。显然,numpy 只在导入时检查这一点。

(这是根据上面@kηives 的评论重新发布的答案。)

解决方案 4:

在尝试了上述几种解决方案却无济于事之后,我在 Numpy文档中找到了对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())

解决方案 5:

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

import mkl
mkl.set_num_threads(1)

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

try:
    import mkl
    mkl.set_num_threads(1)
except:
    pass
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用