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

news2024/11/26 11:06:23

目录

一、服务端部署(使用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://127。0.0.1: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.coloradmin.cn/o/2222941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网消息队列Emqx日志配置及日志追踪以及Centos7上的rc.local开机不执行、git提交的小问题

一、物联网消息队列Emqx日志配置及日志追踪 EMQX支持将日志输出到控制台或者日志文件,或者同时使用两者。使用 Docker 部署 EMQX,默认只能通过 docker logs 命令查看 EMQX 日志。EMQX 的默认日志级别为 warning,默认在单日志文件超过10MB(log…

nginx 隐藏版本号与WEB服务器信息

nginx 隐藏版本号与WEB服务器信息 1.安装相关软件2.下载软件包解压并进入3.修改C文件4.编译配置./configure --prefix/usr/local/nginx5.编译安装make && make install5.1.错误处理15.2.错误处理25.2.编译安装make && make install 6.修改nginx配置文件,http节…

【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用

上篇文章: 【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间&…

从0开始深度学习(20)——延后初始化和自定义层

一般情况下,模型参数在被创建时就被立即初始化了,但如果使用了延后初始化技术,就能在首次传入数据后,再初始化参数,旨在输入维度未知的情况下,预定义灵活的模型,动态推断各个层的参数大小。 有时…

robosense 激光雷达安装

官方github 1、ROBOSENSE 驱动安装并运行 1、改雷达型号 2、修改网口地址 3、改变点的类型 https://github.com/RoboSense-LiDAR/rslidar_sdk/blob/main/doc/howto/05_how_to_change_point_type.md 2、ROBOSENSE 点云转换成 velodyne git clone https://github.com/HVikto…

Linux 部署 Harbor 镜像仓库详解

文章目录 安装 Docker安装 Harbor访问 Harbor 安装 Docker 本次部署流程使用的是1台阿里云ECS: Ubuntu 22.04,2核4G开放 9999 端口号 首先需要做的是在当前服务器上,安装好 Docker,参考链接如下: https://blog.csdn.n…

算法(四)前缀和

前缀和也是一个重要的算法,一般用来快速求静态数组的某一连续区间内所有数的和,效率很高,但不支持修改操作。分为一维前缀和、二维前缀和。 重要的前言! 不要死记模板,具体题目可能是前缀和、前缀乘积、后缀和、后缀乘…

qt 构建、执行qmake、运行、重新构建、清除

qt右键功能有 构建、执行qmake、运行、重新构建、清除,下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具, 它根据pro文件生成makefile文件,而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件,源文件…

【C++干货篇】——C/C++内存管理

【C干货篇】——C/C内存管理 文章目录 【C干货篇】——C/C内存管理1.C/C内存分布1.1静态区/数据段:1.2常量区/代码段:1.3栈:1.4堆:1.5. 内存映射区: 2.C语言中动态内存管理方式:malloc/calloc/realloc/free…

[笔记] 关于CreateProcessWithLogonW函数创建进程

函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …

【lca,树上差分】P3128 [USACO15DEC] Max Flow P

题意 给定大小为 n ( 2 ≤ n ≤ 5 1 0 4 ) n(2 \leq n \leq 5 \times 10^4) n(2≤n≤5104) 的树,并给定 m ( 1 ≤ m ≤ 1 0 5 ) m(1 \leq m \leq 10^5) m(1≤m≤105) 条树上的路径(给定两个端点,容易证明两个点树上路径唯一)&…

分布式-单元化架构1

一 两地三中心 1.1 两地三中心* 两地指的是两个城市:同城,异地。三中心指的是三个数据中心:生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统,双中心具备相当的业务处理能力,…

【MySQL】索引的机制、使用

在学习索引知识之前,我们可以先了解一下什么是索引。实际上,索引就是数据库中一个或多个列存储的结构,能够支持数据库管理系统在不扫描整张表的情况下也能查询到数据行,能够大大提升查询效率。举个例子,我们想要找到一…

技术成神之路:设计模式(二十二)命令模式

相关文章:技术成神之路:二十三种设计模式(导航页) 介绍 命令模式(Command Pattern)是一种行为设计模式,允许将请求(命令)封装为对象,从而使您可以使用不同的请求、队列或记录请求日…

硬件基础知识补全计划【一】电阻

一、电阻理论 1.1 电流定义 电流:电流的强弱用电流强度来描述,电流强度是单位时间内通过导体某一横截面的电荷量,简称电流,用I表示。1 秒内有 6.241509310^18 个元电荷通过横截面的电流,定义为 1 安 (A)。 电压&…

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录 一、编译Boost库 二、TCP服务端 三、TCP客户端 四、UDP连接 一、编译Boost库 1. 先去官网下载Boost库源码 2. 点击下载最新的版本 下载Windows环境的压缩包,然后解压 3. 在解压后的目录路径下找到“bootstrap.bat” 打开控制台,在“bootstrap.…

Linux LCD 驱动实验

LCD 是很常用的一个外设,在裸机篇中我们讲解了如何编写 LCD 裸机驱动,在 Linux 下LCD 的使用更加广泛,再搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Framebuffer 设备 先来…

ShardingSphere 分库分表入门实战

分库分表 需求分析 如果我们的平台发展迅速,用户量激增,从数据库层面去思考,哪个表的数据会最大呢? 回顾一下我们的数据库设计: 1)app 应用表 显然不会,成百上千的应用已经多,但…

ESP32移植Openharmony设备开发---(6)Mutex互斥锁

Mutex互斥锁 官方文档:OpenAtom OpenHarmony 基本概念 互斥锁又称互斥型信号量,用于实现对共享资源的独占式处理。当有任务持有时,这个任务获得该互斥锁的所有权。当该任务释放它时,任务失去该互斥锁的所有权。当一个任务持有互…

2024年最新苹果iOS证书申请创建App详细图文流程

iOS 证书设置指南: 对于开发者来说,在没有Mac电脑或对Xcode等开发工具不熟悉的情况下,如何快速完成IOS证书制作和IPA文件提交至开发者中心一直是一个难题。但是现在,有了初雪云提供的极简工具,您可以轻松实现这两个任…