pytorch模型网页部署——Flask
创始人
2024-03-08 01:47:55
0

一、Flask用法

Flask是python的轻量级web框架,可用来做简单的模型部署。Flask的基本用法如下:

step1:定义Flask类的对象,即创建一个基于Flask的服务器

step2:定义公开的路由及路由对应的调用函数

step3:运行服务器

"""基于flask的web网页"""
from flask import Flask     # 导入flask库app = Flask(__name__)       # 创建Flask类的对象,可理解为建立一个基于flask框架的服务器# 公开路由的名称【my_fcn】,同时修饰下一行定义的函数。
# 定义的函数名要与公开的路由名称一致。
# 后续访问网页的url格式为:http://ip:port/路由名称
@app.route("/my_fcn")
def my_fcn():return "hello world"    # 访问网页时返回内容会显示在网页上if __name__ == "__main__":app.run(host='0.0.0.0', port=8000)      # 运行服务器。可通过get/post参数请求数据

运行结果:

二、在基于flask的网页上部署模型

在基于flask的网页上部署模型,其实只需在上述例子中定义的函数【my_fcn】中添加模型预测的代码即可。示例如下:

"""基于flask的web网页"""
import numpy as np
import cv2
import torch
import torchvision
from flask import Flask     # 导入flask库app = Flask(__name__)       # 创建Flask类的对象,可理解为建立一个基于flask框架的服务器# 公开路由的名称【my_fcn】,同时修饰下一行定义的函数。
# 定义的函数名要与公开的路由名称一致。
# 后续访问网页的url格式为:http://ip:port/路由名称
@app.route("/my_fcn")
def my_fcn():# 加载图片,并将图片转为0到1之间的浮点数张量img = cv2.imread("rose.jpg")img = cv2.resize(img, (224, 224))img_tensor = torch.tensor(img).permute(2, 0, 1).unsqueeze(0).float()/255.0model = torchvision.models.resnet50(pretrained=True)model.eval()output = model(img_tensor)output = torch.nn.functional.softmax(output,1)output = torch.argmax(output)return "class index={}".format(output.numpy())if __name__ == "__main__":app.run(host='0.0.0.0', port=8000)      # 运行服务器。可通过get/post参数请求数据

运行结果:

三、远程客户端访问网页服务器模型进行推理 

当需要在远程客户端请求服务器进行推理时,需要将图像的数据post到服务器,第二节的方法就需要进行改进了,具体方法是将图像数据编码为二进制以post方法提交,服务器解析后进行推理。

举例:web服务器部署了基于resnet50的分类模型,远程客户端读取了一张图片,并提交给服务器进行推理,服务器将推理结果返回给客户端。

代码如下:

3.1 服务器代码:server.py

# server.pyimport numpy as np
from flask import Flask, request, jsonifyimport json
import torch
import torchvisionapp = Flask(__name__)model = torchvision.models.resnet50(pretrained=True)
model.eval()# 推理过程
def run_inference(in_tensor):with torch.no_grad():out_tensor = model(in_tensor)out_tensor = torch.nn.functional.softmax(out_tensor, 1)output = torch.argmax(out_tensor)return output# flask服务器
@app.route('/predict', methods=['GET', 'POST'])     # 注意,这里开放GET、POST请求
def predict():# 客户端post时,包含将输入张量尺寸以json字符串,input_input = "{"shape": [C, W, H]}",因此需要重新解析为json并提取尺寸in_shape = json.load(request.files['in_shape'])# 客户端post时,将图像数据以二进制形式发送,因此需要将图像重新从二进制转换会tensor,并resizein_blob = request.files['in_blob'].read()in_tensor = torch.from_numpy(np.frombuffer(in_blob, dtype=np.float32))in_tensor = in_tensor.view(*in_shape['shape'])output = run_inference(in_tensor)  # 推理output = '{}'.format(output)return jsonify(output)          # 以json返回结果if __name__ == "__main__":app.run(host='0.0.0.0', port=8000)

3.2 客户端代码:client.py

# 首先运行【server.py】,然后运行本文件,实现请求推理本地图像的预测结果。
# client.pyimport torch
import cv2
import io
import json
import requests# config
IMG_NAME = 'dog.jpg'
MY_URL = 'http://192.168.1.103:8000/predict'# 处理图像数据
img = cv2.imread(IMG_NAME)
img = cv2.resize(img, (224, 224))       # resnet输入张量shape=3x224x224
in_tensor = torch.tensor(img).permute(2, 0, 1).unsqueeze(0).float()/255.0
blob = io.BytesIO(bytearray(in_tensor.numpy()))      # 将输入张量转为numpy,再转为二进制进行post请求
shape = io.StringIO(json.dumps({'shape': [1, 3, 224, 224]}))    # 将输入张量尺寸postmy_files = {'in_shape': shape, 'in_blob': blob}
r = requests.post(url=MY_URL, files=my_files)
response = json.loads(r.content)        # 由于服务器返回结果为json,因此需要解析json内容print("the class index of '{}' is: {}".format(IMG_NAME, response))

运行结果:

四、缺点

由于HTTP是串行的,当大量并发请求时,这种方式只能应答完一个请求后才会应答下一个,改进方法可通过使用Sanic框架,实现异步并行处理。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...