最近在使用paddlehub跑ocr,但是跑一段时间后,就会内存溢出导致退出,在github上也有相关issue。

hub Out of memory in a simple programm!! #682

具体解决方案是 修改模型文件源码,手动调用api,释放内存

paddle的api_reference文档里面提到了如下两个释放内存的函数。

1
2
3
4
5
6
7
8
9
# 释放中间 Tensor
# 参数:None
# 返回:None
paddle.inference.Predictor.clear_intermediate_tensor()

# 释放内存池中的所有临时 Tensor
# 参数:None
# 返回:int - 释放的内存字节数
paddle.inference.Predictor.try_shrink_memory()

查看模型位置

使用hub list查看模型

ModuleName Path
ch_pp-ocrv3 /root/.paddlehub/modules/ch_pp_ocrv3
ch_pp-ocrv3_det /root/.paddlehub/modules/ch_pp_ocrv3_det

修改源码

进入/root/.paddlehub/modules/ch_pp_ocrv3,有个module.py文件。在里面可以看到有调用self.rec_predictor.run()的地方,需要在函数返回前插入下面两行,进行内存释放。

1
2
self.predictor.clear_intermediate_tensor()
self.predictor.try_shrink_memory()

/root/.paddlehub/modules/ch_pp_ocrv3_det同理可得。

加上后,观察一段时间,没有内存泄漏情况了。