经常我们使用python训练得到了一个深度学习模型,前向计算的代码都是python编写的。虽然可以将前向计算的代码转为c++编写,提供模型部署的sdk,但这种做法需要专门的部署工程师来实现,比较费时。如果要尽快实际使用模型测试效果的话,使用web服务封装后提供推理能力也是比较常见的做法。
个人一般习惯使用flask来搭建这种简易的web服务,因为使用比较简单。
基于flask的程序写好后,需要部署服务。因为flask自带的app.run()方法是不能实际使用的(因为flask自带的WSGI服务器性能很差)。
需要测试下不同的部署方式之间的差异,不然随便选择一种不太严谨。
所有的程序都运行在同一个docker容器中,局域网内另一台机器用ab客户端。
机器性能
cpu: i7-6800K CPU @ 3.40GHz
内存:32G
使用apache ab作为测试工具,测试命令为
ab -n 100000 -c 1000 http://192.168.20.216:5001/
模拟的是10万请求,1000并发,测试全部完成时间。
测试了几种部署方式,最终发现,gunicorn + meinheld的方式最好。
最简单的flask代码,
flask_app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
如果只使用gevent来部署的话,代码flask_gevent_app.py为
from gevent import monkey
# 下面这句不加也能启动服务,但是你会发现Flask还是阻塞式单线程,在一个请求未返回时,
# 其他请求也会阻塞,所以请添加这句变成协程异步操作,可以单线程同时处理多个请求
monkey.patch_all()
from gevent.pywsgi import WSGIServer
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__=="__main__":
server = WSGIServer(('0.0.0.0', 7770), app)
server.serve_forever()
服务启动命令为
python flask_gevent_app.py
使用gunicorn加gevent的方式,服务启动命令为
gunicorn -w 1 -k gevent -b 0.0.0.0:7770 flask_app:app
如果只使用meinheld来部署的话,代码flask_meinheld_app.py为
from meinheld import server
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
server.listen(("0.0.0.0", 7770))
server.run(app)
服务启动命令为
python flask_meinheld_app.py
使用gunicorn加meinheld的方式,服务启动命令为
gunicorn -w 1 --worker-class=“egg:meinheld#gunicorn_worker” -b 0.0.0.0:7770 flask_app:app。
————————————————
版权声明:本文为CSDN博主「MC-Zhang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:python的深度学习模型使用flask部署时不同部署方式的性能差距_BlowfishKing的博客-CSDN博客