tensorflow执行到session.run的时候发现内存泄漏原因排查

场景:加载训练好的模型进行推理
代码大体实现流程:输入—》模型—》结果
模型为一个单独的类,其中在调用模型的时候需要import 类,然后加载模型在类中init ()函数。也就是说当运行代码的时候先加载模型,然后模型等待别的函数调用进行推理。
实际上是每次都需要调用session.run()函数。在这个过程中发现在循环调用session.run()出现了内存泄漏的问题。
首先session 是self.session=tf.Session(),曾改成:

with tf.Session as sess:
       self.session = sess
       ...
       result = self.session.run(**)

发现并没有作用。
然后各种考虑到每次调用是否都创建了graph,所以加入

with tf.Graph().as_default():
      result = self.sess.run(**)

没有效果
加入

tf.reset_default_graph()

然后没有效果。内存照样增长,按理说run的时候应该是根据输入在已经构建好的模型图上进行运算,模型加载完成应该已经构建好了,那么内存的增长有可能是在每次调用的时候都创建新的op,导致越来越多,可tf这个框架应该有回收变量的机制吧,通过查找也没发现有python 那样的gc.collect()。百思不得其姐,因为使用的cpu版本的,那出现问题会不会是tensorflow 这个框架本身对于cpu的利用默认是没有限制,或者限制在一个比较大的范围,在占用没有到达封顶的时候会一直开辟新的内存。最好查找到一篇帖子发现在创建session的时候可以指定线程数量,通过限定线程的数量发现问题确实得到解决:

代码如下:
This will create a session that runs one op at a time, and only one thread per op
sess = tf.Session(config=
    tf.ConfigProto(inter_op_parallelism_threads=1,
                   intra_op_parallelism_threads=1))
int32 intra_op_parallelism_threads:线程池中线程的数量,一些独立的操作可以在这指定的数量的线程中进行并行,如果设置为0代表让系统设置合适的数值。

int32 inter_op_parallelism_threads:每个进程可用的为进行阻塞操作节点准备的线程池中线程的数量,设置为0代表让系统选择合适的数值。需要注意的是,第一个创建的会话会为将来创建的所有会话设置这个线程的数值,除非use_per_session_threads被设置为True,或者是session_inter_op_thread_pool被配置。


参考文献:
[1] https://stackoverflow.com/questions/38615121/limit-tensorflow-cpu-and-memory-usage
[2]https://www.jianshu.com/p/b9a442bcfd2e

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值