OpenBLAS blas_thread_init: pthread_create: 资源暂时不可用。

27

我现在遇到了一个问题,在集群中无法运行任何程序。它会给出错误。

OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 64 current, 64 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 64 current, 64 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 64 current, 64 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 64 current, 64 max
Traceback (most recent call last):
  File "hello-world.py", line 1, in <module>
    from keras.models import Sequential
  File "/home/amalli2s/anaconda3/lib/python3.6/site-packages/keras/__init__.py", line 3, in <module>
    from . import utils
  File "/home/amalli2s/anaconda3/lib/python3.6/site-packages/keras/utils/__init__.py", line 2, in <module>
    from . import np_utils
  File "/home/amalli2s/anaconda3/lib/python3.6/site-packages/keras/utils/np_utils.py", line 6, in <module>
    import numpy as np
  File "/home/amalli2s/.local/lib/python3.6/site-packages/numpy/__init__.py", line 142, in <module>
    from . import add_newdocs
  File "/home/amalli2s/.local/lib/python3.6/site-packages/numpy/add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "/home/amalli2s/.local/lib/python3.6/site-packages/numpy/lib/__init__.py", line 8, in <module>
    from .type_check import *
  File "/home/amalli2s/.local/lib/python3.6/site-packages/numpy/lib/type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "/home/amalli2s/.local/lib/python3.6/site-packages/numpy/core/__init__.py", line 16, in <module>
    from . import multiarray
SystemError: initialization of multiarray raised unreported exception

我认为这个问题和这个问题是相同的:Multiple instances of Python running simultaneously limited to 35

根据解决方案,当我设置export OPENBLAS_NUM_THREADS=1时,我最终会得到以下错误:

terminate called after throwing an instance of 'std::system_error'
  what():  Resource temporarily unavailable
Aborted

是否还有其他人遇到了相同的问题或者有解决办法?谢谢。

编辑: 好的,看起来这是因为管理员试图实施一些配置限制所致。现在它又可以正常工作了。

6个回答

66

在Ubuntu服务器上,我运行numpy时遇到了问题。无论是在shell中导入numpy还是运行我的Django应用程序,我都会收到以下错误:

  • PyCapsule_Import无法从中导入模块“datetime”
  • numpy.core._multiarray_umath import (OpenBLAS blas_thread_init:
  • pthread_create failed for thread 25 of 32: Resource temporarily unavailable

由于这个问题让我很疯狂,所以我发布了这篇答案。对我有帮助的是添加以下内容:

import os
os.environ['OPENBLAS_NUM_THREADS'] = '1'

之前

import numpy as np

我猜服务器可能有允许的线程数限制。希望它能帮助到某个人!


1
谢谢,这对我很有帮助。 - DovaX
2
感谢@Ylor和@Haramoz。对我来说,在导入pandas之前,在我的flask应用程序的app.py文件中添加以下解决方案可以解决问题: import os os.environ['OPENBLAS_NUM_THREADS'] = '1' - Corina Roca
1
再补充一点,上述错误在使用Python的多线程与OpenBLAS时经常遇到。OpenBLAS在其FAQ中建议了一种解决方案。这篇文章也提供了一些有用的信息。以上两者均来自于此答案 - jpgard

12

这是给未来遇到此错误的其他人的。集群设置很可能限制用户在交互节点上可以运行的进程数。提示在错误的第二行:

OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 64 current, 64 max

这里将限制设置为64。虽然对于普通CLI使用来说足够了,但对于交互式运行Keras作业(如OP)或在我的情况下尝试运行交互式Dask集群可能不足够。

您可以尝试通过Shell增加限制,例如使用ulimit -u 10000,但无法保证成功。最好像OP一样通知管理员。


我也尝试交互式地运行一个Keras程序,但是遇到了错误。然后集群管理员移除了限制,之后我就能够使用它了。 - Arka Mallick
3
在我这种情况下, `OpenBLAS blas_thread_init:pthread_create无法为24个线程中的第3个线程创建失败:资源暂时不可用OpenBLAS blas_thread_init:RLIMIT_NPROC 4096当前,1540106最大限制` - Jingnan Jia

8

通常,这个问题与可用进程数量的限制有关,这是通过ulimit(在Linux中)实现的:

→ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127590
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096         # <------------------culprit
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

一个临时解决方案是增加这个限制:

ulimit -u unlimited

我遇到的大多数服务器将此值设置为待处理信号的数量。例如:ulimit -i。因此,在上面的示例中,我做了以下更改:

ulimit -u 127590

然后,在我的~/.bashrc文件中添加了一行以便在登录时设置它。

如需更多关于如何永久修复此问题的信息,请查阅:https://serverfault.com/a/485277


3
在Docker中遇到了完全相同的问题,看起来这是一个旧版本的问题。
如果有人遇到了这个问题并且无法升级Docker版本,我找到的解决方法是在容器运行时添加以下选项。
--security-opt seccomp=unconfined

3
如果您是管理者,可以:
  1. 使用命令 ulimit -u [number] 暂时更改进程数量限制

  2. 永久更改进程数量限制,即在 /etc/security/limit.conf 中更改参数 nproc

如果您是用户,可以在 bash 中:
  1. 进行操作
    $ export OPENBLAS_NUM_THREADS=2
    $ export GOTO_NUM_THREADS=2
    $ export OMP_NUM_THREADS=2
  1. 在Python中
    >>> import os
    >>> os.environ['OPENBLAS_NUM_THREADS'] = '1`

解决Python多线程问题的关键是将线程数设置为少于您在群集中设置的限制。


这在bash终端中可以工作,但在jupyter笔记本中仍然失败。我使用以下脚本设置了这些环境变量:import os os.environ['OPENBLAS_NUM_THREADS']='4' os.environ['GOTO_NUM_THREADS']='4' os.environ['OMP_NUM_THREADS']='4' - Parvez Khan

2

在Ylor的回答基础上,不要限制自己只看一个线程,仔细阅读错误输出(以下是我输出的前几行):

OpenBLAS blas_thread_init: pthread_create failed for thread 13 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 2048 current, 384066 max
OpenBLAS blas_thread_init: pthread_create failed for thread 58 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 2048 current, 384066 max
...

找到失败的最小线程数,然后将线程计数设置为少一个(对我来说是12):

>>> import os
>>> os.environ['OPENBLAS_NUM_THREADS'] = '12`

这将最大化你的代码利用线程的能力,同时仍在当前系统限制范围内(如果无法更改)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接