繁体   English   中英

如何使用cherrypy和pytorch调试python中的内存泄漏

[英]How to debug memory leak in python with cherrypy and pytorch

我有 cherripy python 应用程序,它最终会吃掉我所有的 RAM。
如何调试内存泄漏?

我有一个pytorch模型,我将它包装成cherrypy以提供简单的rest-api 进行推理。

cherrypy.tree.mount(MyServer(), '/')
cherrypy.config.update({
    'server.socket_port': 8080,
    'server.socket_host': "0.0.0.0",
    'server.thread_pool': 30,
    'log.access_file': "access1.log",
    'log.screen': True
})
try:
    cherrypy.engine.start()
    cherrypy.engine.block()
except KeyboardInterrupt:
    cherrypy.engine.stop()

其中Myserver is

class MyServer(object):
    @cherrypy.expose
    def index(self):
        return "healthy"

    @cherrypy.expose('/inference')
    def inference(self):
        cl = cherrypy.request.headers['Content-Length']
        rawbody = cherrypy.request.body.read(int(cl))
        body = json.loads(rawbody)

        result = doSomePyTorchStuff(body)

        return json.dumps(result)

最初,该应用程序需要大约 800 mb 的内存,主要用于将一些二进制文件(预训练模型)存入内存。 随着每一个新的请求,内存使用量不断增加,2 天后看到应用程序在我的 GPU 上占用了14G的内存,什么都不做!

在 CPU 而不是 GPU 上运行它时,我看到了相同的结果。 23G很容易消耗,甚至更快。
我确实在 docker 容器中运行我的应用程序,但是在没有它的情况下运行时 - 结果是相同的 - 内存不断消耗。

有人可以指出我正确的方向吗? 目前我无法缩小问题的范围,甚至不确定是因为cherrypy还是因为pytorch ,还是因为其他原因。

似乎您的模型每次在推理调用时(或在实例化服务器期间)都会加载。 有时模型加载是内存和耗时的,所以如果你经常这样做,你可能会面临内存泄漏。

通常的做法是将火炬模型实例化一次(例如在单例中),然后对其进行多次推断(例如在MyServer.inference )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM