python的深度学习模型使用flask部署时不同部署方式的性能差距

经常我们使用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的方式最好。

部署方式 QPS Time per request
gevent 2332.71 428.687
gunicorn+genvent(worker:1) 2010.75 497.327
gunicorn+genvent(worker:2) 3737.34 267.57
gunicorn+genvent(worker:4) 6508.4 153.648
meinheld 2922.66 342.154
gunicorn+meinheld(worker:1) 4192.53 238.519
gunicorn+meinheld(worker:2) 7566.64 132.159
gunicorn+meinheld(worker:4) 11588.87 86.29

python的深度学习模型使用flask部署时不同部署方式的性能差距_第1张图片
python的深度学习模型使用flask部署时不同部署方式的性能差距_第2张图片
最简单的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.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。

你可能感兴趣的:(python,web,深度学习)