训练出了一个Pytorch 文本生成模型,想要用Flask+Gunicorn的方法部署。但是请求模型进行生成的接口时,一直没有结果,最后导致timeout。
我的模型生成接口大概长这样:
model = load_model()
@app.route('/generate')
def generate_texts():
text = model.generate()
return text
当我用gunicorn部署:
gunicorn -c gunicorn_conf.py news_server:app > logs/runlog.txt 2>&1 &
我的gunicorn_conf.py文件长这样的:
import multiprocessing
preload_app = True
debug = True
bind = '0.0.0.0:9091'
workers = 3
threads = 6
backlog = 32
一个error。
worker_class = 'gevent'
worker_connections = 10
pidfile = 'logs/gunicorn.pid'
accesslog = 'logs/access.log'
access_log_format = '%(h)s %(t)s %(U)s %(q)s'
部署并没有发现什么异常。但是每次请求这个模型生成文本接口时,一直得不到结果,最后超时。
经过一天的debug和查资料,发现国外一个老哥有很类似的问题。
https://stackoverflow.com/questions/67069183/worker-timeout-when-preloading-pytorch-model-in-flask-app-on-render-com
问题原因
Pytorch会在和Gunicorn的preload_app选项为True时出现bug。应该是gunicorn的共享内存机制和Pytorch有一些冲突。
解决方案
将gunicorn的preload_app设置为False。
preload_app的作用主要是在启动app时能节省一点时间,进程之间共享内存。但是有很大的副作用,具体可以参考这篇文章:https://zhuanlan.zhihu.com/p/371115835
Original: https://blog.csdn.net/Ang_Quantum/article/details/122496024
Author: Ang_Quantum
Title: 解决Pytorch模型在Gunicorn部署无法运行或者超时问题
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/745740/
转载文章受原作者版权保护。转载请注明原作者出处!