限制numpy中的线程数

2025-02-08 08:52:00
admin
原创
59
摘要:问题描述:看来我的 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1730  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1390  
  随着科技的飞速发展,人工智能(AI)与产品生命周期管理(PLM)的结合正逐渐成为智能化项目管理领域的新趋势。这一融合不仅为企业带来了前所未有的机遇,也对传统的项目管理模式提出了挑战。深入探讨AI与PLM结合在智能化项目管理中的应用、优势以及面临的挑战,对于企业把握未来发展方向具有重要意义。AI与PLM结合的基础AI技术...
plm办公软件   16  
  PLM(Product Lifecycle Management)项目管理软件旨在对产品从概念设计到退役的全生命周期进行有效管理,涵盖产品数据管理、流程管理、协同工作等多个方面。然而,在实际的实施过程中,往往会面临诸多难点,这些难点若不妥善解决,将严重影响软件实施的效果与企业的业务发展。深入剖析这些难点并制定切实可行的...
plm系统简介   14  
  引言在数字化转型的浪潮中,研发数据治理成为企业提升创新能力和竞争力的关键环节。传统的数据治理模式在应对复杂多变的研发数据时,往往显得力不从心。知识图谱技术的兴起,为研发数据治理带来了新的思路和方法。而产品生命周期管理(PLM)系统作为研发数据的重要管理平台,与知识图谱的结合,开创了研发数据治理的新范式。这种新范式不仅能...
plm管理系统   14  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用