模型的部署:服务端与客户端建立连接(Flask)

embedded/2024/10/21 1:10:06/

目录

一、服务端部署(使用Flask)

1.安装Flask

2.加载模型(这里以识别图片的类型模型为例)

3.定义API端点

4.运行Flask应用

二、客户端请求

1.安装HTTP客户端库

2.发送请求

请求成功示例:

监控与日志

总结


在机器学习模型的部署过程中,服务端与客户端之间的有效通信是至关重要的。Flask作为一个轻量级的Python Web框架,非常适合用于构建快速、可扩展的API服务,以支持模型的推理请求。本文将详细介绍如何使用Flask来搭建服务端,并展示客户端如何与之建立连接。

一、服务端部署(使用Flask)

1.安装Flask

首先,确保你的Python环境中已经安装了Flask。如果没有安装,可以使用pip进行安装

pip install Flask

2.加载模型(这里以识别图片的类型模型为例)

在你的Flask应用中,你需要加载已经训练好的机器学习模型。这通常涉及读取模型文件(如TensorFlow的SavedModel、PyTorch的.pth文件等)并初始化模型实例

import io  
import flask  
import torch  
import torch.nn.functional as F  
from PIL import Image  
from torch import nn  
from torchvision import transforms, models  # 初始化Flask应用  
app = flask.Flask(__name__)  # 创建一个新的Flask应用实例  
# __name__参数用于定位应用的根路径,以便Flask找到模板、静态文件等。  
# app = flask.Flask(__name__)是Flask应用的起点,初始化应用实例。  # 定义一个全局变量model,初始化为None  
# 和一个标志use_gpu,初始化为False,表示是否使用GPU进行加速  
model = None  
use_gpu = False def load_model():  """加载预训练模型,你也可以轻松地使用自己的模型。"""  global model  # 声明使用全局变量model  # 加载resnet18网络结构  model = models.resnet18()  # 获取全连接层的输入特征数  num_ftrs = model.fc.in_features  # 修改全连接层,输出特征数为102(根据你的任务设置类别数)  model.fc = nn.Sequential(nn.Linear(num_ftrs, 102))  # 加载预训练权重  checkpoint = torch.load('best.pth')  model.load_state_dict(checkpoint['state_dict'])  # 将模型设置为评估模式  model.eval()  # 如果use_gpu为True,则将模型移至GPU  if use_gpu:  model.cuda()  def prepare_image(image, target_size):  """准备图像数据,包括转换模式、调整大小、归一化等。"""  # 如果图像不是RGB模式,则转换为RGB模式  if image.mode != 'RGB':  image = image.convert('RGB')  # 调整图像大小  image = transforms.Resize(target_size)(image)  # 将图像转换为Tensor  image = transforms.ToTensor()(image)  # 归一化图像(根据ImageNet数据集的均值和标准差)  image = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image)  # 增加一个batch_size维度  image = image[None]  # 如果use_gpu为True,则将图像移至GPU  if use_gpu:  image = image.cuda()  return  image

3.定义API端点

接下来,定义API端点来处理客户端的请求。这里我们将创建一个POST端点来接收数据并返回模型的推理结果。

@app.route("/predict", methods=["POST"])  
def predict():  """处理客户端的预测请求。"""  # 初始化一个字典,用于存储响应数据  data = {"success": False}  # 检查请求方法是否为POST  if flask.request.method == 'POST':  # 检查请求中是否包含名为"image"的文件  if flask.request.files.get("image"):  # 读取图像文件内容  image_bytes = flask.request.files["image"].read()  # 使用PIL打开图像  image = Image.open(io.BytesIO(image_bytes))  # 预处理图像  image = prepare_image(image, target_size=(224, 224))  # 使用模型进行预测,并应用softmax函数获取概率分布  preds = F.softmax(model(image), dim=1)  # 获取概率最高的前3个结果及其索引  results = torch.topk(preds.cpu().data, k=3, dim=1)  # 将结果转换为NumPy数组  results = (results[0].cpu().numpy(), results[1].cpu().numpy())  # 初始化预测结果列表  data['predictions'] = list()  # 遍历结果,并构建响应字典  for prob, label in zip(results[0][0], results[1][0]):  r = {"label": str(label), "probability": float(prob)}  data['predictions'].append(r)  # 设置成功标志为True  data["success"] = True  # 返回JSON格式的响应数据  return flask.jsonify(data)  

4.运行Flask应用

最后,运行你的Flask应用,使其监听指定的端口。

if __name__ == '__main__':  # 打印加载模型和启动Flask服务的消息  print("Loading PyTorch model and Flask starting server ...")  print("Please wait until server has fully started")  # 加载模型  load_model()  # 启动Flask服务,指定主机IP和端口号  app.run(host='0.0.0.0', port=5012)  # 注意:这里指定的IP地址应该是服务器所在的IP地址,确保客户端可以访问。

运行成功示例:

二、客户端请求

1.安装HTTP客户端库

在客户端,你需要一个HTTP客户端库来发送请求并接收响应。Python中常用的库有requests。所以需要按安装reauest库

pip install requests

2.发送请求

使用requests库发送POST请求到Flask服务端,并包含需要推理的数据。

import requests  # 导入requests库,用于发送HTTP请求  # 定义Flask服务器的URL,用于发送图像预测请求  
flask_url = 'http://192.168.24.45:5012/predict'  # 定义一个函数,用于预测给定图像路径的结果  
def predict_result(image_path):  # 以二进制读模式打开图像文件,并读取其内容  image = open(image_path, 'rb').read()  # 创建一个字典,将图像数据作为文件内容发送  payload = {'image': image}  # 使用requests.post发送POST请求到Flask服务器,并接收JSON格式的响应  r = requests.post(flask_url, files=payload).json()   # 检查响应中的'success'字段,判断请求是否成功  if r['success']:  # 如果成功,遍历预测结果并打印每个预测类别的标签和概率  for (i, result) in enumerate(r['predictions']):   print('{}.预测类别为{}:的概率:{}'.format(i + 1, result['label'], result['probability']))  # 打印'OK'表示所有预测结果已成功打印  print('OK')  else:  # 如果失败  # 打印'Request failed'表示请求失败  print('Request failed')  # 当脚本作为主程序运行时,调用predict_result函数并传入一个图像路径  
if __name__ == '__main__':  predict_result('imagr_file')#传入发送文件
请求成功示例:

监控与日志

  1. 日志记录
    在服务端和客户端都配置日志记录,记录请求、响应和错误信息。日志可以帮助快速定位问题并进行排查。

  2. 性能监控
    使用监控工具(如Prometheus、Grafana)对服务的性能进行实时监控,包括请求数量、响应时间、错误率等指标。

  3. 告警机制
    配置告警机制,当服务出现异常或性能指标超出阈值时,及时通知相关人员进行处理。

示例:

日志信息

总结

服务端与客户端之间的有效连接是模型部署成功的关键。通过选择合适的部署架构、通信协议和优化策略,可以确保模型的推理请求能够高效、安全地进行。同时,完善的监控和日志机制能够帮助及时发现并解决问题,保障服务的稳定性和可靠性。希望本文能为你在模型部署过程中提供有价值的参考和指导。


http://www.ppmy.cn/embedded/129143.html

相关文章

C语言实践中的补充知识 Ⅱ

一、在C语言中,% 7.2f 是一个格式说明符,通常用于printf或sprintf等函数中,用于控制浮点数的输出格式。 这里的 % 是格式说明符的开始符号。 7 表示字段宽度。这意味着输出的浮点数将至少占用7个字符的宽度。如果浮点数的实际宽度小于7个字符…

【Flutter】页面布局:流式布局(Wrap、Flow)

在移动应用开发中,布局是非常重要的一部分,尤其是当我们需要处理动态或自适应的内容时。Flutter 提供了几种布局方式来帮助开发者处理复杂的 UI 场景,其中 Wrap 和 Flow 是常用的流式布局组件。它们在处理多个子组件时表现优越,尤…

智发展 智飞跃 亚信安全与新华三深化战略合作

10月16日,亚信安全与新华三集团共同宣布,双方正式签署战略合作协议,双方将基于各自在硬件及软件安全领域的能力和优势,在产品、解决方案、市场拓展等多个领域深入合作,赋能千行百业数字化转型与变革。 亚信安全CEO马红…

【Git】Gitlab进行merge request的时候,出现待合并分支合并了主分支的问题的解决

最近在公司开始用merge request进行代码合并了。 然后不知道为啥,如果待合并分支(A)进行merge request到主分支(B)的时候,如果A和B有冲突,然后我在gitlab上使用页面进行冲突的解决,比…

vector的模拟实现

1.迭代器失效 在上一篇中因为插入导致的扩容,扩容则pos指向的是之前的空间,导致了野指针的出现,没有扩容,使pos的位置意义改变,由于数据挪动,pos不再指向原来的位置,认为上面俩种迭代器失效。(…

LeetCode两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …

Gin框架操作指南08:日志与安全

官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南&#…

MongoDB聚合管道(Aggregation Pipeline)

聚合管道(Aggregation Pipeline)是MongoDB中用于对数据进行处理和分析的一种强大机制。它由一系列的阶段(Stage)组成,每个阶段对输入的数据进行一种特定的操作,然后将结果传递给下一个阶段,就像…