当我在 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"
Sources:
两个答案告诉您如何停止所有/最不需要的多线程/多处理:
https://stackoverflow.com/a/48665619/3670097 https://stackoverflow.com/a/48665619/3670097, https://stackoverflow.com/a/51954326/3670097 https://stackoverflow.com/a/51954326/3670097
总结如何在脚本中执行此操作:https://stackoverflow.com/a/53224849/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)
Solution
TL;DR - 使用joblib.Parallel
代替multiprocessing.Pool
:
from joblib import Parallel, delayed
Parallel(n_jobs=-1,backend='loky')(delayed(f)(x) for x in iterator)