Skip to content

Python 内存泄露

在使用 ONNXRuntime 进行推理,发现有大量内存泄露。

使用 memory_profiler 进行内存检查。

安装 memory_profiler

bash
pip install memory_profiler

使用:

python
from memory_profiler import profile

只要是需要检查的函数都使用 @profile 装饰即可,这样可以在控制台看见它每一行的内存变化情况。

总结原因:ONNXRuntime 会引用输入数据,例如 NumPy 数组,并且执行结束也不会释放,导致所有中间的视图对象和切片对象都无法释放。中间操作了 NumPy 的函数都有明显的内存泄露。

这说明使用这种搭配(Python + ONNXRuntime)进行推理还不是一个好策略。NumPy 很早就曝出内存泄露的问题,而且 ONNXRuntime 放在服务端还没有特别稳定,性能没有明显提高,所以不如使用 C++ 下专用的推理工具(如 TensorRT)进行操作,如果一定要使用 Python 可以使用 Python 混合编程,Python 与 C++/PyBind11 进行混合写库的体验很好。使用了 C++ 编程就可以完美释放性能,没有 GIL 的限制。

解法:目前是只要推理就创建一个新的推理对象 onnxruntime.InferenceSession(),因为推理的时间对比创建模型的时间少太多了。这是模型不大的情况下,如果模型大了可能对性能也会有显著影响。可能需要构造资源池对象来解决。