当前位置: 首页 > 面试题库 >

同时运行的多个Python实例限制为35个

胡泓
2023-03-14
问题内容

我在并行计算集群的不同处理器上将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

熊猫和其他一些软件包已安装在虚拟环境中。我已经复制了虚拟环境,因此每个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

RLIMIT_NPROC变量控制用户可以拥有的进程总数。更具体地,因为它是一个每处理设定,当fork()clone()vfork(),和c之间,由过程调用时,RLIMIT_NPROC该过程值与该进程的父用户的总过程计数。如果超过了该值,那么您将遇到的一切都将关闭。

该错误html" target="_blank">消息表明OpenBLAS无法创建其他线程,因为您的用户使用了所有RLIMIT_NPROC给定的线程。

由于您是在集群上运行,因此用户不太可能运行多个线程(例如,如果您正在使用个人计算机并浏览网络,播放音乐等),那么可以断定OpenBLAS正在尝试启动多个线程。

OpenBLAS如何使用线程

OpenBLAS可以使用多个线程来加速线性代数。您可能需要多个线程来快速解决一个更大的问题。您可能需要更少的线程来同时解决许多较小的问题。

OpenBLAS有几种方法来限制其使用的线程数。这些是通过以下方式控制的:

export OPENBLAS_NUM_THREADS=4
export GOTO_NUM_THREADS=4
export OMP_NUM_THREADS=4

优先级为OPENBLAS_NUM_THREADS> GOTO_NUM_THREADS> OMP_NUM_THREADS。(我 认为
这意味着OPENBLAS_NUM_THREADS重写OMP_NUM_THREADS;但是,OpenBLAS将忽略OPENBLAS_NUM_THREADSGOTO_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

这应该使您减少到36 *(1 + 1)+ 2 = 74个线程。

由于您有备用容量,因此可以调整OPENBLAS_NUM_THREADS为更高的值,但是由您单独的Python进程拥有的OpenBLAS实例将相互干扰。因此,在获得一个解决方案的速度与获得多个解决方案的速度之间需要权衡。理想情况下,您可以通过在每个节点上运行更少的Python并使用更多的节点来解决这一折衷。



 类似资料:
  • 问题内容: 我正在尝试创建86个task.py实例以同时运行。 问题答案: 等待命令完成。改为使用:

  • 问题内容: 如何运行多个python脚本?此刻我像这样跑一个。 我已经尝试过了,但是不起作用:仅运行第一个脚本。另外,我尝试使用这样的单个文件; 但是,这也不起作用。 问题答案: 使用Bash: 这就是整个脚本。它将同时运行两个Python脚本。 Python本身可以做同样的事情,但要花更多的时间输入,对于眼前的问题来说是一个不好的选择。 我认为尽管您采取错误的方法来解决问题很可能,但我想听听您的

  • 我的查询如下: > 在我的应用程序中,我需要在计划中同时运行多个pyspark应用程序。是否有任何方法可以同时从spark驱动程序运行多个pyspark应用程序,从而创建单独的sparkcontext对象? 如果第一个查询的答案是否定的,那么我可以运行一个应用程序从驱动程序,另一个从执行程序,但我可以一次运行它。 null 配置:VM-1:Hadoop主节点、Spark驱动程序和执行程序、Mong

  • 我有一个作业,它在集群环境中的多个服务器上运行。但是,我想限制作业只在一台服务器中运行,其他服务器不应该运行同一作业,一旦其他服务器启动了它。 我已经使用一些数据库表探索了Spring批处理具有锁机制,但仅在Spring中寻找任何解决方案。

  • 我试图运行两个ChangeFeedProcessor实例,它们都指向同一个集合,并在一个Cosmos帐户中使用同一个租约集合。我在这两个实例中都指定了唯一的主机名 我的意图是根据逻辑分区(根据Microsoft文档)将提要负载分布在各个实例之间 当我试图启动第二个实例时,我在控制台中得到以下异常。 com.azure.data.cosmos.internal.changeFeed.implemen

  • 我的应用程序在两个jboss版本jboss 4和jboss 7之间扩展。Jboss 4 intance正在通过eclipse运行。当我尝试通过[Jboss_HOME]/bin/standalone.bat运行Jboss 7时,它不会启动,并显示以下错误。 调用"C:\jboss as-7.1.1。最终\bin\standalone.conf.bat"警告JBOSS_HOME可能指向不同的安装-可能