首页 > 其他分享 >关于同时运行多个tensorflow模型时线程创建失败

关于同时运行多个tensorflow模型时线程创建失败

时间:2023-05-20 15:01:03浏览次数:47  
标签:线程 创建 threads parallelism gpu tensorflow op

OpenMP: "libgomp: Thread creation failed: Resource temporarily unavailable" when code run as regular user

这几天在跑代码的时候,因为模型需要调参,方便起见打算同时运行25个程序。但是在使用bash脚本,同时启动25个进程的时候,发现制启动了12个进程。尝试用vscode打开调试模式,刚刚运行起来,就报错

OpenMP: "libgomp: Thread creation failed: Resource temporarily unavailable" when code run as regular user

看意思是线程资源用完了。

运行指令

ulimit -a

发现用户能开的最大线程数量为4096.

运行指令

ps -u <username> -o nlwp --no-headers | awk '{ sum += $1 } END { print sum }'

返回4010。表示用户已经使用了4010个线程。

运行指令

ps -u <username> -o nlwp,pid,cmd

查看每个进程所占用的具体线程数量。

发现每个跑模型的代码占用了300个线程。如果要25个同时运行,则需要300*25=7500个线程才行。

本人使用的是tensorflow-gpu1.15版本。tensorflow中可以使用tf.ConfigProto()配置Session运行参数

参考tensorflow的API文档 https://www.tensorflow.org/api_docs/python/tf/compat/v1/ConfigProto

其中,ConfigProto有两个属性 inter_op_parallelism_threads intra_op_parallelism_threads 可以调整程序的并行程度。

stack overflow上对这两个属性做出了解释 https://stackoverflow.com/questions/41233635/meaning-of-inter-op-parallelism-threads-and-intra-op-parallelism-threads。

大致意思如下

  1. inter_op_parallelism_threads:该参数用于控制 TensorFlow 操作之间的并行度,即不同操作之间的并发执行。它指定了 TensorFlow 运行时使用的线程数,以便同时运行多个操作。增加此参数的值可以提高 TensorFlow 在执行多个操作时的并行性,从而加快整体的计算速度。
  2. intra_op_parallelism_threads:该参数用于控制 TensorFlow 操作内部的并行度,即单个操作内部的并发执行。它指定了每个操作使用的线程数,以便在操作内部并行地执行子任务。增加此参数的值可以提高 TensorFlow 操作内部并发执行的能力,从而加快单个操作的计算速度。

通常,TensorFlow 会根据系统的线程配置和硬件资源自动确定线程的分配。

所以只要认为设定这连个属性的值,就可以限制每个程序开启的线程数量。

os.environ["CUDA_VISIBLE_DEVICES"] = gpu
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.05)
config = tf.ConfigProto(
    gpu_options = gpu_options,
    inter_op_parallelism_threads = 8,  # 设置较小的值,将线程分配给不同的程序
    intra_op_parallelism_threads = 30  # 设置较大的值,充分利用单个程序的并发性
)
sess = tf.Session(config=config)

上述代码同时限制了可用的gpu的

标签:线程,创建,threads,parallelism,gpu,tensorflow,op
From: https://www.cnblogs.com/EIPsilly/p/17417234.html

相关文章

  • 用ABP Suite创建Blazor Server的应用程序
    这个应用程序我们取名为BlazorOne,意思是集AuthServer、HttpApiHost和BlazorServer3个功能于一体的应用程序。因为ABPSuite支持另外一种模式,是把上述3个功能独立部署。为了由浅入深的介绍ABP的模块化开发,我们先完成BlazorOne吧!#1、#2、我们的解决方案名字叫Study.BlazorOne,其......
  • 使用ln命令在Linux系统中创建连接文件
    在Linux中ln命令用来为文件创建连接,连接类型分为硬连接(HardLink)和符号连接(SymbolicLink)两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。关于软硬连接解释硬连接硬连接是指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是......
  • ISL学习——tensorflow部分指令
    tf.keras.layers.Sequential()#用来描述神经网络的结构,其中Sequential()里面的参数是用来描述从输入层到输出层的网络结构。modnn=tf.keras.Sequential([tf.keras.layers.Dense(units=10,#参数为正整数,表示输出空间的维数为10维......
  • ABAP-MD11计划订单创建
    1DATA:ls_returnTYPEbapireturn1,2ls_plafTYPEplaf,3ls_headerdataTYPEbapiplaf_i1.45ls_headerdata-pldord_profile=ls_plaf-paart.6ls_headerdata-plan_plant=ls_plaf-plwrk.7ls_headerdata-prod_plant=ls_plaf-pwwr......
  • 《mysql高性能》系列3:创建合适的索引
    1概述索引可以认为是存储引擎建立的一种数据结构,用来快速的根据查询条件来找到所需要的数据。由于数据一般存放在磁盘中,每次访问磁盘的时间都会比较长,因此,为了减少对磁盘的访问次数,存储引擎一般使用B-树结构来保存索引。索引可以减少服务器层需要扫描的数据量,可以帮助服务器避免......
  • c++局部静态变量是线程安全的
    mark一下。c++11之前,局部静态变量初始化并不是线程安全的。c++11之后,当局部静态在初始化的过程中,有新的获取,会阻塞等待初始化成功。classInstance{public://... staticGetInstace() { staticInstanceinstance; returninstance; }};new,理论上应该也是可以的,......
  • .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移
    前言接上期文章《.NET6项目连接数据库方式方法》,有人问了我几个问题,现在就这几个问题,拓展延申一下创建实体类、数据库。把ORM框架和数据迁移都写进去。安装ORM框架,这里我们采用EFCore安装EFCore我的项目是在Linux上创建的,使用的是vscode开发工具远程开发。为了方便大家阅读和......
  • 多线程
    进程和线程的基本术语进程:一个程序执行时,系统会给它划分一些内存区域,这就是一个进程线程:一个进程包含多个线程,java程序至少至少包含三个线程,main()主线程、gc()垃圾回收线程和异常处理线程并行:并发:一个CPU执行多个任务,用于商城中的秒杀多线程可以提高程序的相应,对图形化应用......
  • Tensorflow变量管理及模型持久化,实现实现线性回归
    变量管理随着神经网络的结构更加复杂,参数更多时,需要一个更好的方式来传递和管理变量。在TF中提供了通过变量的名字来创建或者获取一个变量的机制,通过这个机制不同函数可以直接通过变量的名字来直接使用变量。这机制主要是通过tf.get_variable和tf.variable_scope实现的。tf.get_......
  • 多线程
    什么是多线程?首先要了解进程,一个进程可以启用多个线程。进程:1.可以看做一个公司,线程就是公司的员工。2.进程A和进程B的内存资源独立不共享3.进程是线程的执行单元线程:1.线程A与线程B之间堆内存和方法区共享,栈是独立的,一个线程一个栈。......