当前位置: 首页 > news >正文

使用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,证明请求成功

相关文章:

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

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

基于SSM的校园跑腿网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 课题来源及研究的目的和意义 随着网络技术的不断完善与发展&#xff0c;各种互联网公司不断如雨后春笋般不断涌现&#xff0c;丰富了人们生活的各个方面。近年来由于 Online To 0ffline即线上到线下(020)模式的发展和兴起&…...

【Java】正则表达式详解

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…...

Java知识巩固(七)

目录 面向对象 面向对象三大特征 封装 继承 多态 多态 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 浅拷贝 深拷贝 面向对象 万物皆为对象&#xff0c;也就是描述某个事物解决问题的过程中所发生的事情。 面向对象三大特征 封装 封装是指把一个对象的状态信息&…...

Ubuntu22.04 更换源

Ubuntu22.04 更换网易163源 1、编辑/etc/apt/sources.list文件 1 sudo nano /etc/apt/sources.list 2、清空文件内容&#xff0c;拷贝下列163源到文本。 1 2 3 4 5 6 7 8 deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse deb http://mirro…...

江恩理论和波浪理论的结合

结合波浪理论和江恩理论需要综合考虑市场波动的形态以及时间和价格的关系。这两者都是技术分析中的重要工具&#xff0c;能够帮助投资者更好地理解市场的趋势和未来的走势。 波浪理论&#xff08;Elliott Wave Theory&#xff09; 波浪理论是由Ralph Nelson Elliott提出的&…...

AJAX——AJAX 取消请求

利用 abort&#xff08;&#xff09;方法取消请求 本文分享到此结束&#xff0c;欢迎大家评论区相互讨论学习&#xff0c;下一篇继续分享AJAX中请求重复发送问题的学习。...

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…...

嵌入式QT中基本工程模板分析

大家好,今天主要来分享一下,如何分析一下QT的工程代码文件。 第一:QT工程分析...

Linux网络:UDP socket - 简单聊天室

Linux网络&#xff1a;UDP socket - 简单聊天室 聊天通信架构ServerInetAddrUdpServerMessageRoutermain Client测试 聊天通信架构 本博客基于Linux实现一个简单的聊天通信服务&#xff0c;以熟悉Linux的网络接口。 总代码地址&#xff1a;[UDPsocket-简单聊天通信] 文件结构…...

Codeforces Round 646 (Div. 2) E. Tree Shuffling(树,贪心)

题目链接 Codeforces Round 646 (Div. 2) E. Tree Shuffling 思路 考虑一个节点 u u u&#xff0c;显然它子树中的操作可以由它本身和祖先来进行。如果它的祖先有比它花费更小的&#xff0c;直接跳过节点 u u u。 我们分别记录每一个子树中位置不对的 0 0 0和 1 1 1的个数&…...

HCIE-Datacom题库_11_IPsecVPN【17道题】

一、单选题 1.IPsecSA(SecurityAssociation&#xff0c;安全联盟)有两种生成方式&#xff0c;分别是手工方式和IKE自动协商方式&#xff0c;以下关于这两种方式的描述中&#xff0c;错误的是哪一项? 手工方式和IKE方式建立的SA都支持动态刷新 IKE方式建立的SA,其生存周期由…...

Dongle Sentinal在Jenkins下访问不了的问题

背景&#xff1a; 工作站部署的jenkins的脚本无法正常打包&#xff0c;定位后发现是本地获取不了license&#xff0c;但是使用usb over network的远程license都能获取并正常打包 分析&#xff1a; 获取不了license的原因是本地无法识别dongle。根据提供信息&#xff0c;之前…...

X射线衍射(X-ray Diffraction,XRD)小白版

文章目录 实验过程原理晶体构成X射线波长diffraction 干涉效应 Braggs Law晶体间距d散射角度θ半波长λ/2公式 公式名称由来应用设备 实验过程 In the X-ray experiment , a sample is placed into the center of an instrument and illuminated with a beam of X-rays. 在X射…...

Nordic 定时器系统app timer[获取时间戳]

获取时间戳 想要在Nordic 定时器系统中获取时间戳,也就是是在调用app_timer的时候时间戳要有效,我们可以看看定时器系统初始化: ret_code_t app_timer_init(void) {ret_code_t err_code;drv_rtc_config_t config {.prescaler APP_TIMER_CONFIG_RTC_FREQUENCY,.int…...

【Linux】实验:mkdir 命令 、 tee 命令

#1024程序员节&#xff5c;征文# 1.命令说明 本文主要实验 linux 的两个命令&#xff1a;mkdir -p 路径、 tee 创建文件。 命令&#xff1a;mkdir -p 路径 说明&#xff1a;该命令将自动创建路径下的目录及子目录&#xff0c;结尾可以/ 也可以不带/&#xff0c;默认都是建文…...

asp.net core mvc发布时输出视图文件Views

var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorPages();builder.Services.AddControllersWithViews(ops > {//全局异常过滤器&#xff0c;注册ops.Filters.Add<ExceptionFilter>(); })// Views视图文件输出到发布目录&#xff0c;视图文…...

服务器模块测试

目录 测试逻辑 测试工具 测试 测试逻辑 我们可以使用一个简单的业务处理逻辑来进行测试。 最简单的&#xff0c;我们业务逻辑就直接返回一个固定的字符串 void Message(const PtrConnection&con,Buffer* inbuffer) //模拟用户新数据回调 {inbuffer->MoveReadOf…...

ATTCK 框架讲解

摘要 ATT&CK框架作为MITRE公司开发的网络攻击行为知识库&#xff0c;自2015年发布以来&#xff0c;已成为信息安全领域的重要工具。该框架通过提炼和归纳真实世界中的网络威胁事件&#xff0c;以攻击者的视角构建了一套系统化的战术和技术分类体系。本文详细阐述了ATT&…...

ADC在STM32F1系列的使用详解

目录 1. ADC简介 2. 逐次逼近型ADC&#xff08;ADC0809&#xff09; 3. ADC框图&#xff08;STM32&#xff09; 4. ADC基本结构 5. 输入通道 6. 转换模式 6.1 单次转换 6.1.1 非扫描模式 6.1.2 扫描模式 6.2 连续转换 6.2.1 非扫描模式 6.2.2 扫描模式…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...