PBS 上的 Python 脚本失败并出现错误 =>> PBS:作业被杀死:ncpus 37.94 超出限制 36(总和)

问题描述 投票:0回答:2

当我在 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/3670097https://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)
python multithreading numpy anaconda pbs
2个回答
1
投票

来自 https://stackoverflow.com/a/57505958/3528321 的运行时修复:

try:
    import mkl
    mkl.set_num_threads(1)
except:
    pass

0
投票

看起来主要问题来自使用

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())

但这可能会矫枉过正并且可能会失败(请参阅我的问题以获得最小的工作示例)。

© www.soinside.com 2019 - 2024. All rights reserved.