【发布时间】:2021-08-04 01:46:47
【问题描述】:
我有一个使用库numpy, scipy, sklearn, matplotlib 的有点大的代码。我需要限制 CPU 使用率以阻止它消耗我计算集群中的所有可用处理能力。在this answer 之后,我实现了以下代码块,该代码块在脚本运行后立即执行:
import os
parallel_procs = "4"
os.environ["OMP_NUM_THREADS"] = parallel_procs
os.environ["MKL_NUM_THREADS"] = parallel_procs
os.environ["OPENBLAS_NUM_THREADS"] = parallel_procs
os.environ["VECLIB_MAXIMUM_THREADS"] = parallel_procs
os.environ["NUMEXPR_NUM_THREADS"] = parallel_procs
我的理解是,这应该将使用的核心数量限制为 4,但显然这并没有发生。这是htop 为我的用户和该脚本显示的内容:
有 16 个进程,其中 4 个显示 CPU 百分比高于 100%。这是lscpu的摘录:
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 2
Core(s) per socket: 12
Socket(s): 2
我还在我的代码中使用multiprocessing 库。我使用multiprocessing.Pool(processes=4) 设置了相同数量的进程。如果没有上面显示的代码块,脚本坚持使用尽可能多的内核,显然完全忽略了multiprocessing。
然后我的问题是:当我使用上面的代码时,我有什么限制?我应该如何解释htop 输出?
【问题讨论】:
-
您的 Python 代码是多线程的还是故意使用多个进程(如
multiprocessing模块)?您设置的环境变量可能只会对可能在内部使用线程的库代码产生影响。但是,如果您使用自己的线程,您可能仍会并行多次调用这些库。 -
我确实在我的代码中使用
multiprocessing库。我使用multiprocessing.Pool(processes=4)设置了相同数量的进程。我不得不添加问题中显示的代码块,否则脚本坚持使用尽可能多的内核,显然忽略了multiprocessing。 -
正在使用的内核总数可能是进程数和线程数的乘积(例如 4*4)。库代码不会知道
multiprocessing代码(或者实际上可能是并行运行的其他库代码)。如果您使用的库执行自己的线程,您可能不需要添加自己的并行处理。 -
这似乎与最近的问题有关:stackoverflow.com/questions/67474542/…
标签: python multithreading numpy htop