0%

Pytorch/ONNX 模型部署II -- Using Flask

上篇主要介绍Pytorch转ONNX,由于业务需求暂时不在离线手机/车机端嵌入式,因此暂时对ONNX2NCNN不继续深入。既然ONNX model支持c,c++,java调用,那么serving的高效部署还是可行的。
这里选择了python简单调用的Flask部署ONNX模型。要注意的是本文的涉及的Flask仅供调试以保证模型转化和调用可行性,需要生产环境调用参考Deploying a Flask server in production

既然是python调用,那么Torch模型不用转换也可以尝试Flask部署。只是在实际应用中我们不需要任何“训练”,简而言之,只需要inference过程。那么显然直接用pytorch模型的意义不大,并且会导致效率低下。因此,一般来说需要转torchscript或者ONNX,或者其他inference 引擎支持的格式。

这里选用了ONNX, 本文默认模型已经成功打包成.onnx格式。Torch2ONNX转换可以参考上文 Pytorch 模型部署I—Torch2ONNX, 或者以下官方文档:

参考链接:
Pytorch 官方文档系列:torch.onnxPytorch2onnx and using onnxruntime

ONNX 模型压缩和可视化:onnx-simplifier可视化 Netron

Flask调用pytorch模型官方文档: Deplying Pytorch in Python via flask

完整代码: Flask基于onnx模型调用

安装flask 和 简单flask脚本

安装

1
pip install Flask==1.0.3 torchvision

app.py

1
2
3
4
5
6
7
8
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True, port=5000)

然后运行:

1
python app.py

用浏览器打开 https://localhost:5000/ 就可以看到Hello World!

调用pytorch或者onnx模型,直接用地址获取输入语句

这里有两个小的改动:

1
2
3
@app.route('/query', methods=['GET'])
# and
input_sentence = request.args.get('text')

第一个将我们的功能,定义到端口 https://localhost:5000/query 下触发。第二个,制定输入语句为”text=“后面的内容。比如要检测”我想去机场“,就需要输入 https://localhost:5000/query?text=我想去机场。
至于中间模型初始化(读取模型),和模型预测(test)部分,直接用python代码即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from flask import Flask, render_template, request, redirect, jsonify
app = Flask(__name__)
import ...
# Init
def init(model):
pass
# test model
def test(model,input):
pass

@app.route('/query', methods=['GET'])
def predict():
# read test_sentence
input_sentence = request.args.get('text')

# run inference
results= test(model,input_sentence)
return results

if __name__ == '__main__':
app.run(debug=True, port=5000) #run app in debug mode on port 5000

让同一网络下的小伙伴测试你的服务

修改最后的app.run部分为:

1
2
if __name__ == '__main__':
app.run(debug=True, port=5000,host='0.0.0.0')

自己调用时还是和上面一致,使用localhost开头的即可。小伙伴需要用 https://yourip:5000/query?text=随便输入什么

只是想趁热打铁写一下自己的坑……