使用Flask实现本机的模型部署

前言

        模型部署是指将大模型运行在专属的计算资源上,使模型在独立的运行环境中高效、可靠地运行,并为业务应用提供推理服务。其目标是将机器学习模型应用于实际业务中,使最终用户或系统能够利用模型的输出,从而发挥其作用。

一、设置客户端

  1. 运行之前要先运行服务端
  2. url里写入本机ip和端口,后面跟上端口名
  3. 以二进制形式读取图片创建payload字典
  4. 向上面的url服务器发送post请求,传入字典文件
  5. 将返回的json文件解析成字典
import requests# url和端口写成自己的端口
flask_url = "http://192.168.24.39:5012/predict"def predict_result(image_path):image = open(image_path, 'rb').read()payload = {'image': image}r = requests.post(flask_url, files=payload).json()# 向flask_url服务发送一个POST请求,并尝试将返回的JSON响应解析为一个字典。# print(r)if r["success"]:# 输出结果for (i, result) in enumerate(r['predictions']):print(f"{i + 1}.预测类别为{result['label']}:{result['probability']}")else:print('Request failed')if __name__ == '__main__':predict_result('./35/image_06975.jpg')

输出:

二、设置服务端

  1. 服务端初始化一个Flask对象,命名app
  2. @app.route("/predict", methods=["POST"]) 定义了一个路由 以POST方式发送到/predict的请求都会进入下方的函数
  3. 下方函数处理完之后返回flask.jsonify(data),json文件
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, datasets# 初始化Flask app
app = flask.Flask(__name__)  # 创建一个新的Flask应用程序实例
# __name__参数通常被传递给FasK应用程序来定位应用程序的根路径,这样Flask就可以知道在哪里找到模板、静态文件等。
# 总体来说app = flask.Flask(__name__)是FLaSK应用程序的起点。它初始化了一个新的Flask应用程序实例。为后续添加路由、配置等奠定了基础model = None
use_gpu = False# 加载模块进来
def load_model():global model# 加载resnet18网络model = models.resnet18()num_ftrs = model.fc.in_featuresmodel.fc = nn.Sequential(nn.Linear(num_ftrs, 102))  # 输出神经元为类别数checkpoint = torch.load('best.pth')model.load_state_dict(checkpoint['state_dict'])model.eval()if use_gpu:model.cuda()# 数据预处理
def prepare_image(image, target_size):# 针对不同模型 image的格式不同 但需要统一到RGB格式if image.mode != 'RGB':image = image.convert('RGB')# (按照所使用的模型将输入图片的尺寸修改,并转为tensor)image = transforms.Resize(target_size)(image)image = transforms.ToTensor()(image)image = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image)# 增加一个维度  用于batch测试image = image[None]  # torch 的写法if use_gpu:image = image.cuda()return torch.tensor(image)@app.route("/predict", methods=["POST"])
# @app.route("/predict"):
# 这部分定义了一个路由,表示当客户端发送请求到 /predict URL 时,Flask 应用会执行下方的处理函数。也就是说,任何访问 /predict 的请求都会被这个函数处理。
# methods=["POST"]:
# 这部分指定了允许的 HTTP 请求方法。methods=["POST"] 表示这个路由只接受 POST 请求。
def predict():# 做一个标志 刚开始无图像传入时为false 传入图像时为truedata = {'success': False}if flask.request.method == 'POST':  # 如果收到请求if flask.request.files.get("image"):  # 判断是否为图像image = flask.request.files["image"].read()  # 将收到的图像进行读取,内容为二进制image = Image.open(io.BytesIO(image))  # 将接收到的二进制图片转换成16进制  # 将二进制数据转换为图像对象# 利用上面的预处理函数将读入的图像进行预处理image = prepare_image(image, target_size=(224, 224))preds = F.softmax(model(image), dim=1)  # 得到各个类别的概率results = torch.topk(preds.cpu().data, k=3, dim=1)  # 概率最大的前3个结果# torch.topk用于返回输入张量中每行最大的k个元素及其对应的索引results = (results[0].cpu().numpy(), results[1].cpu().numpy())# 将data字典增加一个key,value,其中value为ist格式data['predictions'] = list()for prob, label in zip(results[0][0], results[1][0]):r = {"label": str(label), "probability": float(prob)}# 将预测结果添加至data字典data['predictions'].append(r)data["success"] = Truereturn flask.jsonify(data)  # 将最后结果以json格式文件传出if __name__ == '__main__':load_model()  # 先加载模型app.run(host='192.168.24.41', port='5012')  # 开启服务   服务器进入监听状态 等待用户发送信息# host 参数指定 IP 地址:# host = '127.0.0.1': 仅能从本机访问。# host = '0.0.0.0': 允许来自任何设备(网络)访问。# host = '192.168.24.41': 仅允许来自该特定IP地址的请求(通常是局域网内的某台设备)。# host = '127.0.0.1': 这表示Flask应用仅能在本机上访问。例如,只有在同一台计算机上打开浏览器,才能通过http: // 127.0.0.1: 5012 / 访问Flask应用。其他计算机无法通过这个IP访问。# host = '0.0.0.0': 这表示Flask应用会监听来自任何网络接口的请求,适用于让其他设备(比如局域网内的其他设备)也能访问该应用。通过局域网访问时,其他设备可以使用http: // < 你的局域网IP >: 5012 / 访问。# host = '192.168.24.41': 这意味着Flask仅监听来自该特定IP地址(通常是局域网IP)的请求。如果你在局域网中,其他设备可以使用http: // 192.168.24.41: 5012 / 访问。

输出:

如果最后的状态码是200,证明请求成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/453731.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12 django管理系统 - 注册与登录 - 登录

为了演示方便&#xff0c;我就直接使用models里的Admin来演示&#xff0c;不再创建用户模型了。 ok&#xff0c;先做基础配置 首先是在base.html中&#xff0c;新增登录和注册的入口 <ul class"nav navbar-nav navbar-right"><li><a href"/ac…

黑马软件测试第一篇_Linux

Linux 操作系统 说明: 所有硬件设备组装完成后的第⼀一层软件, 能够使⽤用户使⽤用硬件设备的软件 即为操作系统 常见分类 桌⾯面操作系统: Windows/macOS/Linux移动端操作系统: Android(安卓)/iOS(苹果)服务器器操作系统: Linux/Windows Server嵌⼊入式操作系统: Android(底…

linux线程 | 同步与互斥 | 线程池以及知识点补充

前言&#xff1a;本节内容是linux的线程的相关知识。本篇首先会实现一个简易的线程池&#xff0c; 然后再将线程池利用单例的懒汉模式改编一下。 然后再谈一些小的知识点&#xff0c;比如自旋锁&#xff0c; 读者写者问题等等。 那么&#xff0c; 现在开始我们的学习吧。 ps:本…

吴恩达深度学习笔记(6)

正交化 为了提高算法准确率&#xff0c;我们想到的方法 收集更多的训练数据增强样本多样性使用梯度下降将算法使算法训练时间更长换一种优化算法更复杂或者更简单的神经网络利用dropout 或者L2正则化改变网络框架更换激活函数改变隐藏单元个数 为了使有监督机制的学习系统良…

ansible playbooks

文章目录 一&#xff0c;ansible剧本二&#xff0c;ansible playbooks主要特性三&#xff0c;yaml基本语法规则四&#xff0c;剧本playbooks的组成结构五&#xff0c;yaml编写1.示例2.运行playbook2.1 运行2.2 检查yaml文件的语法是否正确2.3 检查tasks任务2.3 检查生效的主机2…

maven创建父子项目

创建父类 创建子模块 添加文件夹 配置tomcat 参考 然后启动项目即可 参考 https://blog.csdn.net/gjtao1130/article/details/115000022

Linux——shell 编程基础

基本介绍 shell 变量 环境变量&#xff08;也叫全局变量&#xff09; 位置参数变量 预定义变量 运算符 条件判断 流程控制 if 单分支&多分支 case 语句 for循环 while 循环 read 读取控制台输入 函数 系统函数 basename 获取文件名 dirname 获取目录路径 自定义函数 综…

DataWhale10月动手实践——Bot应用开发task03学习笔记

一、工作流 1. 工作流的定义 工作流由多个节点组成&#xff0c;这些节点可以包括大语言模型&#xff08;LLM&#xff09;、代码模块、逻辑判断工具、插件等。每个节点需要不同的信息来执行其功能。工作流的核心含义是&#xff1a;对工作流程及其操作步骤之间的业务规则进行抽…

中国信通院联合中国电促会开展电力行业企业开源典型实践案例征集

自2021年被首次写入国家“十四五”规划以来&#xff0c;开源技术发展凭借其平等、开放、协作、共享的优秀创作模式&#xff0c;正持续成为推动数字技术创新、优化软件生产模式、赋能传统行业转型升级、助力企业降本增效的重要引擎。电力是国民经济的重要基础性产业&#xff0c;…

开源神器!CodeFormer:一键去除马赛克,高清修复照片视频

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; 微信公众号&#xff5c;搜一搜&…

Docker安装Mysql数据库

不同的应用程序可能依赖于不同版本的 MySQL 或具有不同的配置需求。通过 Docker&#xff0c;每个 MySQL 实例都可以运行在独立的容器中&#xff0c;与宿主机以及其他容器的环境相互隔离。这有效避免了因不同应用对 MySQL 版本、依赖库等方面的差异而导致的冲突。例如&#xff0…

盛元广通数字化实验动物中心LIMS综合管理系统

盛元广通数字化实验动物中心LIMS综合管理系统通过集成各种功能&#xff0c;从实验申请、伦理审批、笼位预约、动物采购到开展动物实验、数据归档等全流程智能化管理&#xff0c;保证了实验信息随时可查&#xff0c;管理可视化、流程简单化。实验动物中心采用电脑端、APP和微信小…

LangSplat和3D language fields简略介绍

LangSplat: 3D Language Gaussian Splatting 相关技术拆分解释&#xff1a; 3dgs&#xff1a;伟大无需多言SAM&#xff1a;The Segment Anything Model&#xff0c;是图像分割领域的foundational model&#xff0c;已经用在很多视觉任务上&#xff08;如图像修复、物体追踪、图…

Linux目录

一、虚拟机环境配置 1.安装虚拟机 安装步骤 新建虚拟机-->典型安装-->选择稍后安装操作系统-->选择系统类型和版本&#xff08;这里安装的是CentOS7 64位&#xff09;-->选择虚拟机文件路径&#xff08;建议每台虚拟机单独存放并且路径不要有中文&#xff09;--&…

商淘云连锁管理系统

商淘云连锁管理系统助力连锁企业实现“人货账”全方位数字化管理&#xff0c;它依托连锁品牌进销存管理实现门店订货、线下收银、线上商城、会员营销等一体化管理。 门店订货补货支持连锁直营、加盟 不同门店不同进货价、不同门店不同商品、不同门店在线或者账期支付、门店PC或…

Go语言Gin框架的常规配置和查询数据返回json示例

文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案&#xff0c;这一篇文章…

跨界创新|使用自定义YOLOv11和Ollama(Llama 3)增强OCR文本识别

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Electron-(三)网页报错处理与请求监听

在前端开发中&#xff0c;Electron 是一个强大的框架&#xff0c;它允许我们使用 Web 技术构建跨平台的桌面应用程序。在开发过程中&#xff0c;及时处理网页报错和监听请求是非常重要的环节。本文将详细介绍 Electron 中网页报错的日志记录、webContents 的监听事件以及如何监…

CTFHUB技能树之XSS——过滤关键词

开启靶场&#xff0c;打开链接&#xff1a; 看上去跟上一题应该差不多&#xff0c;应该只是添加多点过滤规则吧 直接拿xss平台的代码试试&#xff1a; <sCRiPt sRC//xs.pe/6b6></sCrIpT> 这时候突然听到xss平台的上线语音提醒&#xff1a; 成功得到flag&#xff1…

react里实现左右拉伸实战

封装组件&#xff1a; 我自己写的一个简单的组件&#xff0c;可能有bug。不想自己写&#xff0c;建议用第三方库实现。 新建一个resizeBox.tsx文件写上代码如下&#xff1a; import React, { ReactNode, useState, useEffect, useRef } from react; import styles from &quo…