Pytorch内存泄漏Memory Leak

文章目录

  • 1. 问题描述
  • 2. 问题排查
  • 3. 参考

1. 问题描述

  1. 在运行程序是,通过要进行压力测试,在程序的各项性能稳定时才可以进行上线,其中主要的性能指标包含cup,内存,显存,这里遇到的问题就是内存不断飙升的问题,在程序中手动加入del删除变量,在接口处执行gc.collect()进行手动的内存回收,并且加入torch.cuda.empty_cache()清除gpu的显存。压测了一个多小时,发现内存已经相对稳定了,就想着进行服务的上线。
  2. 实际上这种方式只是缓解了内存爆炸的速度而已,抱着侥幸心理不去找到内存泄漏的点的话,线上服务也会早晚出问题。
    实际上另一个坑正在慢慢的酝酿,通过单独测试gc.collect()指令,发现程序在压测20分钟后,仅仅执行gc.collect()这一条指令,就使用了整整10s的时间!!太恐怖了,后面就想到了定时执行gc.collect(),在内存和时间上进行折中,实际上这种方式还是没有真正的解决问题。
  3. 不出所料,在上线后的第一晚上服务就挂了,凌晨四点进行的报警。
    Pytorch内存泄漏Memory Leak_第1张图片
    Pytorch内存泄漏Memory Leak_第2张图片
    每一个小时进行内存的监控,内存泄漏的问题正在一点一点的榨干服务器的内存空间,直到服务挂掉。

2. 问题排查

最难的可能就是进行内存泄漏点的排查了,百度加谷歌都尝试了一下pytorch内存泄漏,大概掌握了一下情况,后来使用了内存分析的火焰图cProfile和memory profiler,使用memory profiler这种装饰器的方式真的是香,将每一行的代码都进行了内存的分析,最终定位了内存泄漏的代码段。
Pytorch内存泄漏Memory Leak_第3张图片

3. 参考

  1. 使用 cProfile 和火焰图调优 Python 程序性能
  2. 记一次Pytorch内存泄露的排查与处理
  3. python内存诊断工具pympler
  4. pytorch内存泄漏分析案例 | list转tensor

你可能感兴趣的:(NLP)