[英]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.