关于同时运行多个tensorflow模型时线程创建失败
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。
大致意思如下
inter_op_parallelism_threads
:该参数用于控制 TensorFlow 操作之间的并行度,即不同操作之间的并发执行。它指定了 TensorFlow 运行时使用的线程数,以便同时运行多个操作。增加此参数的值可以提高 TensorFlow 在执行多个操作时的并行性,从而加快整体的计算速度。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的
本文来自博客园,作者:Un-Defined,转载请保留本文署名Un-Defined,并在文章顶部注明原文链接:https://www.cnblogs.com/EIPsilly/p/17417234.html