当我在 PBS 调度程序上运行 python 脚本(使用 Miniconda)时,出现标题中提到的错误。我认为 numpy 正在做一些多线程/处理,但我无法阻止它这样做。我将这些行添加到我的 PBS 脚本中:
export MKL_NUM_THREADS=1
export NUMEXPR_NUM_THREADS=1
export OMP_NUM_THREADS=1
export OPENBLAS_NUM_THREADS=1
export VECLIB_MAXIMUM_THREADS=1
我也将这些行添加到我的
main.py
,只是为了好的措施:
import os
os.environ["OMP_NUM_THREADS"] = "1"
os.environ["OPENBLAS_NUM_THREADS"] = "1"
os.environ["MKL_NUM_THREADS"] = "1"
os.environ["VECLIB_MAXIMUM_THREADS"] = "1"
os.environ["NUMEXPR_NUM_THREADS"] = "1"
import numpy as np # Import numpy AFTER setting these variables
但无济于事---我仍然遇到同样的错误。我将我的脚本运行为
qsub -q <QUEUE_NAME> -lnodes=1:ppn=36 path/to/script.sh"
告诉您如何停止所有/最不需要的多线程/多处理的两个答案:
https://stackoverflow.com/a/48665619/3670097,https://stackoverflow.com/a/51954326/3670097
总结了如何从脚本中做到这一点:https://stackoverflow.com/a/53224849/3670097
我去了每个 numpy 计算密集型函数并将其放在上下文管理器中:
import threadpoolctl
with threadpoolctl.threadpool_limits(limits=1, user_api="blas"):
D, P = np.linalg.eig(M, right=True)
TL;DR - 使用
joblib.Parallel
而不是 multiprocessing.Pool
:
from joblib import Parallel, delayed
Parallel(n_jobs=-1,backend='loky')(delayed(f)(x) for x in iterator)
来自 https://stackoverflow.com/a/57505958/3528321 的运行时修复:
try:
import mkl
mkl.set_num_threads(1)
except:
pass
看起来主要问题来自使用
multiprocessing.Pool
。当我切换到joblib.Parallel
时,我不再收到这些消息。你也可以试试
with parallel_backend("loky", inner_max_num_threads=1):
res = Parallel(n_jobs=-1)(delayed(f)(p) for p in it())
但这可能会矫枉过正并且可能会失败(请参阅我的问题以获得最小的工作示例)。