doc*_*rer 7 python linux parallel-processing multiprocessing openblas
我在并行计算集群的不同处理器上运行Python 3.6脚本作为多个单独的进程.最多35个进程同时运行没有问题,但第36行(以及更多)在第二行崩溃并出现分段错误import pandas as pd.有趣的是,第一行import os不会引起问题.完整的错误消息是:
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
Traceback (most recent call last):
File "/home/.../myscript.py", line 32, in <module>
import pandas as pd
File "/home/.../python_venv2/lib/python3.6/site-packages/pandas/__init__.py", line 13, in <module>
__import__(dependency)
File "/home/.../python_venv2/lib/python3.6/site-packages/numpy/__init__.py", line 142, in <module>
from . import add_newdocs
File "/home/.../python_venv2/lib/python3.6/site-packages/numpy/add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "/home/.../python_venv2/lib/python3.6/site-packages/numpy/lib/__init__.py", line 8, in <module>
from .type_check import *
File "/home/.../python_venv2/lib/python3.6/site-packages/numpy/lib/type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "/home/.../python_venv2/lib/python3.6/site-packages/numpy/core/__init__.py", line 16, in <module>
from . import multiarray
SystemError: initialization of multiarray raised unreported exception
/var/spool/slurmd/job04590/slurm_script: line 11: 26963 Segmentation fault python /home/.../myscript.py -x 38
Run Code Online (Sandbox Code Playgroud)
Pandas和一些其他软件包安装在虚拟环境中.我复制了虚拟环境,因此每个venv中运行的进程不超过24个.例如,上面的错误脚本来自在虚拟环境中运行的脚本python_venv2.
无论有多少进程从特定的Pandas实例导入,每次都会在第36个进程上发生此问题.(我甚至没有削弱并行计算集群的能力.)
因此,如果它不是对访问Pandas的进程数量的限制,那么它是否限制了运行Python的进程数量?为什么35是限制?
是否可以在机器上安装多个Python副本(在单独的虚拟环境中?),这样我就可以运行超过35个进程?
分解错误信息
您的错误消息包括以下提示:
OpenBLAS blas_thread_init: pthread_create: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1024 current, 2067021 max
Run Code Online (Sandbox Code Playgroud)
该RLIMIT_NPROC变量控制用户可以拥有的进程总数。更具体地,因为它是一个每处理设定,当fork(),clone(),vfork(),和c之间,由过程调用时,RLIMIT_NPROC该过程值与该进程的父用户的总过程计数。如果超过了该值,那么您将遇到的一切都将关闭。
该错误消息表明OpenBLAS无法创建其他线程,因为您的用户使用了所有RLIMIT_NPROC给定的线程。
由于您是在集群上运行,因此用户不太可能运行多个线程(例如,如果您正在使用个人计算机并浏览网络,播放音乐等),那么可以断定OpenBLAS正在尝试启动多个线程。
OpenBLAS如何使用线程
OpenBLAS可以使用多个线程来加速线性代数。您可能需要多个线程来快速解决一个更大的问题。您可能需要更少的线程来同时解决许多较小的问题。
OpenBLAS有几种方法来限制其使用的线程数。这些是通过以下方式控制的:
export OPENBLAS_NUM_THREADS=4
export GOTO_NUM_THREADS=4
export OMP_NUM_THREADS=4
Run Code Online (Sandbox Code Playgroud)
优先级为OPENBLAS_NUM_THREADS> GOTO_NUM_THREADS> OMP_NUM_THREADS。(我认为这意味着OPENBLAS_NUM_THREADS重写OMP_NUM_THREADS;但是,OpenBLAS将忽略OPENBLAS_NUM_THREADS并GOTO_NUM_THREADS在使用进行编译时USE_OPENMP=1。)
如果没有设置上述变量,则OpenBLAS将使用与您的计算机上的内核数(您的计算机上的32个内核)相等的线程数运行
您的情况
您的群集具有32核CPU。您正在尝试运行36个Python实例。每个实例对于Python需要1个线程,对于OpenBLAS需要32个线程。您还需要1个线程用于SSH连接和1个线程用于Shell。这意味着您需要36 *(32 + 1)+ 2 = 1190个线程。
解决该问题的核选项是使用:
export OPENBLAS_NUM_THREADS=1
Run Code Online (Sandbox Code Playgroud)
这应该使您减少到36 *(1 + 1)+ 2 = 74个线程。
由于您有备用容量,因此可以调整OPENBLAS_NUM_THREADS为更高的值,但是由您单独的Python进程拥有的OpenBLAS实例将相互干扰。因此,在获得一个解决方案的速度与获得多个解决方案的速度之间需要权衡。理想情况下,您可以通过在每个节点上运行更少的Python并使用更多的节点来解决这一折衷。
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |