首页 > 其他分享 >【深度学习】(12)--模型部署 <连接客户端与服务端>

【深度学习】(12)--模型部署 <连接客户端与服务端>

时间:2024-10-20 21:46:34浏览次数:9  
标签:12 -- image 部署 Flask flask model 模型 服务端

文章目录

模型部署

一、模型部署的定义与目的

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

二、模型部署的步骤

  1. 导出模型:将训练好的模型导出为可部署的格式。
  2. 部署模型:将导出的模型部署到生产环境中,通常是以一个服务或一个库的形式。
  3. 测试模型:在生产环境中对模型进行测试,以确保其能够正常工作,并且输出结果符合预期。
  4. 监控模型:在生产环境中对模型进行监控,以便及时发现并解决问题。

三、模型部署的方式

模型的部署方式多种多样,可以根据具体的应用场景和需求而定。以下是一些常见的模型部署方式:

  1. 云端部署:将模型部署到云端服务器上,通过API接口提供服务,实现远程调用。这种方式可以实现大规模的分布式计算和存储,同时提供高可用性和可扩展性。在云端部署中,需要考虑数据的安全性和隐私保护,以及模型的并发处理能力。
  2. 嵌入式设备部署:将模型部署到嵌入式设备中,如智能手机、智能音箱、智能家居等。这种方式可以实现本地化的智能化应用,具有实时性、低延迟的优点。在嵌入式设备部署中,需要考虑设备的计算能力、存储空间等限制,以及模型的轻量化设计。
  3. 边缘计算部署:将模型部署到边缘设备上,如路由器、摄像头等。这种方式可以实现本地数据的实时处理和智能化分析,减少数据传输的延迟和成本。在边缘计算部署中,需要考虑设备的计算能力和数据处理能力,以及模型的实时性要求。
  4. 移动端部署:将模型部署到移动端设备上,如智能手机、平板电脑等。这种方式可以实现移动设备的智能化应用,提高用户体验。在移动端部署中,需要考虑设备的功耗和性能限制,以及模型的轻量化设计。
  5. FPGA和GPU部署:FPGA(Field-Programmable Gate Array)部署是将深度学习模型部署到FPGA芯片上,实现高效的硬件加速,提高模型的运行速度和效率。GPU(Graphics Processing Unit)部署是将深度学习模型部署到GPU上,利用GPU的并行计算能力,提高模型的运行速度和效率。这两种方式适用于对计算性能要求较高的场景,如实时图像处理、视频分析等。

四、Flask框架

  • 优点

    1. 轻量级Flask是一个轻量级的框架,代码量少,灵活性高,适合快速开发小型应用程序。
    2. 简单易学:Flask的设计理念简洁明了,入门相对容易,对于初学者来说非常友好。可扩展性强:Flask提供了丰富的扩展库,开发者可以根据需求选择合适的扩展来扩展功能。
    3. 社区支持良好:Flask有一个庞大的社区,提供了丰富的资源和支持。
  • 缺点

    1. 功能相对较少:相比于一些大型框架如Django,Flask的功能相对较少,需要依赖扩展库来实现一些功能。
    2. 安全性考虑:由于Flask的轻量级特性,安全性方面的考虑需要开发者自行关注。
    3. 不适合大型应用:由于Flask的轻量级特性,它可能不适合开发大型复杂的应用程序。

五、实现模型部署

1. 搭建服务端

1.1 初始化Flask app
"""-----初始化Flask app-----"""
app = flask.Flask(__name__) # 创建一个Flask应用程序实例
model = None
use_gpu = False
1.2 加载模型

本片使用自带的残差网络模型,将网络模型输出转化为自己要求的输出类别数量:

def load_model():
    global model
    # 加载resnet18网络
    model = models.resnet18()
    num_ftrs = model.fc.in_features
    model.fc = nn.Sequential(nn.Linear(num_ftrs,102))

    checkpoint = torch.load('best.pth')
    model.load_state_dict(checkpoint['state_dict'])
    model.eval()
    # 是否使用gpu
    if use_gpu:
        model.cuda()
1.3 数据预处理

将图像转换为模型输入所需的格式:

def prepare_image(image,target_size):
    if image.mode !='RGB':
        image = image.convert('RGB')
    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)

    image = image[None]
    if use_gpu:
        image = image.cuda()
    return torch.tensor(image)
1.4 构建装饰器

@app.route是一个装饰器,用于将特定的URL路径绑定到一个视图函数上。当Web服务器接收到与该URL路径匹配且方法也匹配的HTTP请求时,就会调用相应的视图函数来处理该请求

@app.route("/predict",methods = ["POST"])
def predict():
    # 做一个标志,刚开始无图像传入时为false,传入图像时为true
    data = {"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))

            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)

            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)
            data["success"] = True

    return flask.jsonify(data)
1.5 完整代码
import io
import flask
import torch
import jsonify
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应用程序实例

model = None
use_gpu = False

"""-----加载模型进来-----"""
def load_model():
    global model
    # 加载resnet18网络
    model = models.resnet18()
    num_ftrs = model.fc.in_features
    model.fc = nn.Sequential(nn.Linear(num_ftrs,102))

    checkpoint = torch.load('best.pth')
    model.load_state_dict(checkpoint['state_dict'])
    model.eval()
    # 是否使用gpu
    if use_gpu:
        model.cuda()

"""-----数据预处理-----"""
def prepare_image(image,target_size):
    if image.mode !='RGB':
        image = image.convert('RGB')
    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)

    image = image[None]
    if use_gpu:
        image = image.cuda()
    return torch.tensor(image)

# @app.route是一个装饰器,用于将特定的URL路径绑定到一个视图函数上。
# 当Web服务器接收到与该URL路径匹配且方法也匹配的HTTP请求时,就会调用相应的视图函数来处理该请求。
@app.route("/predict",methods = ["POST"])
def predict():
    # 做一个标志,刚开始无图像传入时为false,传入图像时为true
    data = {"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))

            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)

            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)
            data["success"] = True

    return flask.jsonify(data)

if __name__ == '__main__':
    print("Loading PyTorch model and Flask starting server...")
    print("Please wait until server has fully started")
    load_model() #加载模型
    # 再开启服务
    app.run(port='5012') # 端口

2. 搭建客户端

2.1 服务端网址

用于连接服务端:

-- 127.0.0.1:表示本地地址
-- 5012:表示端口
flask_url = 'http://127.0.0.1:5012/predict'
2.2 发送请求
def predict_result(image_path):
    image = open(image_path,'rb').read()
    payload = {'image':image}

    r = requests.post(flask_url,files=payload).json()
    # 向服务端发送一个POST请求,并尝试将返回的JSON响应解析为一个Python字典

    if r['success']:
        for (i,result) in enumerate(r['predictions']):
            print('{}.预测类别为{}:的概率{}'.format(i+1,result['label'],result['probability']))
    else:
        print('Reqquest failed')
2.3 完整代码
import requests
flask_url = 'http://127.0.0.1:5012/predict'

def predict_result(image_path):
    image = open(image_path,'rb').read()
    payload = {'image':image}

    r = requests.post(flask_url,files=payload).json()
    # 向服务端发送一个POST请求,并尝试将返回的JSON响应解析为一个Python字典

    if r['success']:
        for (i,result) in enumerate(r['predictions']):
            print('{}.预测类别为{}:的概率{}'.format(i+1,result['label'],result['probability']))
    else:
        print('Reqquest failed')

if __name__ == '__main__':
    predict_result('./train/6/image_07162.jpg')

六、运行使用

先行运行服务端,使得服务端打开,然后再运行客户端就可以连接上服务端,并使用服务端函数进行操作。

总结

本篇介绍了,如何进行模型部署,将客户端与服务端连接在一起,使客户可以借用服务端来操作。

标签:12,--,image,部署,Flask,flask,model,模型,服务端
From: https://blog.csdn.net/m0_74896766/article/details/143099690

相关文章

  • WordPress如何优雅地删除没有包含图片的文章
    作为一个在乎用户体验的 SEOer 来说,子凡我不太能够接受文章没有配图,不然就总感觉少了点东西,当然这也是对文章质量的一种提升,但是由于网站中可能会存在一些老旧的文章没有包含任何图片,导致内容显得单薄,影响用户体验。为了提高网站内容的整体质量,删除这些没有图片的文章是一个有效......
  • 模型的部署:服务端与客户端建立连接(Flask)
    目录一、服务端部署(使用Flask)1.安装Flask2.加载模型(这里以识别图片的类型模型为例)3.定义API端点4.运行Flask应用二、客户端请求1.安装HTTP客户端库2.发送请求请求成功示例:监控与日志总结在机器学习模型的部署过程中,服务端与客户端之间的有效通信是至关重要的。F......
  • 10.19-10.20 练习
    其实是复健。上一次碰电脑是期末考试完(7月),上上次是noip(2023年11月)。1.P9752[CSP-S2023]密码锁__record要求:语文没问题,会基础语法,有生活常识。枚状态,判断。几乎没有复杂度要求。Code#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;intn,ans;int......
  • 基本数据类型及其使用
    一.整型数据类型  //java的整型数据类型默认为int,1字节=8比特//在申明long类型变量是要在后面跟L或l的后缀 二.表数范围的记忆技巧:①.指数n=(字节数×比特)/2 ②.左不减右减一左边公式=-(2**n)右边公式=2**n-1 三.浮点型数据(由于float的精度差,一般不用) //在申明floa......
  • 三,TreeMap和HashMap,TreeSet和HashMap的区别以及方法使用上的不同
    TreeMap和HashMap的区别TreeMap:基于红黑树实现。提供了范围查询和排序功能。所有操作的时间复杂度为O(logn)。不允许键为null。键必须实现Comparable接口或提供一个Comparator。HashMap:基于哈希表实现。提供快速的查找、插入和删除操作。平均时间复杂度为O(1),......
  • 变量定义及其的使用
    一.变量:程序中最为基本的单元  作用:能存储同一类型内不断变化的数据  要素:数据类型、变量名、存储的值 二.申明变量格式1:数据类型变量名=变量值;    例如:intnum=19格式2:数据类型变量名;       变量名=变量值;    例如:intage......
  • MySQL5.7 InnoDB在线DDL操作
    MYSQL官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html目录在线DDL原理在线DDL支持情况IndexOperations(索引操作)PrimaryKeyOperations(主键操作)ColumnOperations(列操作)TableOperations(表操作)pt-osc方式在线DDL和pt-osc对比参考在线DDL原理MySQL5.6......
  • 二叉搜索树的结构
    #include<iostream>#include<string>usingnamespacestd;typedefstructTreeNode*Tree;structTreeNode{ intv; TreeLeft,Right; intlevel;};TreeNewNode(intV){ TreeT=(Tree)malloc(sizeof(structTreeNode)); T->v=V; T->Le......
  • KeyShot基础操作5 - 动画篇
    --本篇导航--动画界面动画类型动画时间轴导出动画一些例子注:本人目前只会简单的动画,摄像机运镜、速度曲线这些还控制不好。以下均为简单演示。动画界面KeyShot中的动画每次只能是一个动作,如果需要对同一个对象创建复杂的动画,就需要对其多次添加不同的动画效果。做......
  • 黑马JavaWeb-day02
    什么是JavaScript?JavaScript:简称Js,是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能使网页可交互JavaScript和Java是完全不同的语言,无论是概念还是设计。但是基础语法类似。JavaScriptJavaScript引入方式内部脚本:将JS代码定义在HTML页面中JavaScript代码必......