深度学习-模型部署

news2024/10/22 11:46:16

文章目录

  • 一、定义与目的
  • 二、模型部署
    • 1.部署步骤
    • 2.部署方式
  • 三、框架对比
    • 1.Django
    • 2.Pyramid
    • 3.Flask
  • 四、代码实现
    • 1.服务端代码
      • (1)初始化flask并定义全局变量
      • (2)加载模型
      • (3)图像预处理
      • (4)预测端点
      • (5)主程序运行
    • 2.客服端代码
    • 3.总结

一、定义与目的

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

二、模型部署

1.部署步骤

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

2.部署方式

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

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

三、框架对比

Django、Pyramid和Flask都是Python中流行的Web框架,它们各自具有独特的优点和缺点。

1.Django

优点:

  • 功能全面:Django是一个“全包式”的框架,提供了丰富的内置功能,如ORM(对象关系映射)、用户认证、内容管理等,非常适合快速开发。
  • 文档完善:Django的官方文档非常详细,易于理解,对于新手来说非常友好。
  • 社区支持强大:Django拥有一个庞大的社区和大量的第三方包可供选择,这使得开发者能够轻松地找到解决方案和支持。
  • 安全性高:Django具有集成的安全功能,如防止跨站请求伪造(CSRF)和SQL注入攻击的机制,能够最大程度地保护系统的安全性。

缺点:

  • 学习曲线较陡:对于初学者来说,Django提供的功能可能会显得过于复杂,需要一定的时间去学习和掌握。
  • 灵活性较低:由于Django的全包式设计,它在一些情况下可能不如其他框架灵活。
  • 性能问题:在处理高负载应用程序时,Django的性能可能不如一些轻量级的框架。

2.Pyramid

优点:

  • 灵活性和可扩展性:Pyramid的设计哲学是“尽可能少地强制开发人员做出选择”,它提供了一组基本的工具和功能,但允许开发人员根据项目需求选择使用的组件和库。
  • 高性能:Pyramid在设计上注重性能,采用了一些优化技术,如延迟加载和缓存机制,以提供快速响应和高并发处理能力。
  • 适用于大型应用程序:由于Pyramid的灵活性和可扩展性,它非常适合构建大型和复杂的Web应用程序。
    缺点:
  • 社区及资源相对较少:与Django和Flask相比,Pyramid的社区和第三方资源可能较少。
  • 学习曲线:虽然Pyramid提供了灵活的选择,但对于初学者来说,可能需要更多的时间来理解和选择适合项目的组件和库。

3.Flask

优点:

  • 轻量级:Flask是一个轻量级的框架,代码量少,灵活性高,适合快速开发小型应用程序。
  • 简单易学:Flask的设计理念简洁明了,入门相对容易,对于初学者来说非常友好。
  • 可扩展性强:Flask提供了丰富的扩展库,开发者可以根据需求选择合适的扩展来扩展功能。
  • 社区支持良好:Flask有一个庞大的社区,提供了丰富的资源和支持。
    缺点:
  • 功能相对较少:相比于一些大型框架如Django,Flask的功能相对较少,需要依赖扩展库来实现一些功能。
  • 安全性考虑:由于Flask的轻量级特性,安全性方面的考虑需要开发者自行关注。
  • 不适合大型应用:由于Flask的轻量级特性,它可能不适合开发大型复杂的应用程序。

综上所述,Django、Pyramid和Flask各有其优缺点,选择哪个框架取决于项目的具体需求、开发者的偏好和经验水平。

四、代码实现

下面为大家提供一个基于Flask框架的Web服务的代码,该服务使用PyTorch加载了一个预训练的ResNet18模型,并对用户上传的图像进行分类预测。

1.服务端代码

(1)初始化flask并定义全局变量

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应用程序实例

model = None
use_gpu = False

导入必要库(注意确保所以库都以安装,未安装可以使用pip命令安装),然后创建一个Flask应用实例app,定义model用于存储加载的模型、use_gpu用于指示是否使用GPU进行模型推理。

(2)加载模型

def load_model():
    global model
    # 加载resent18网络
    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()
  • load_model函数加载了一个预训练的ResNet18模型,并修改了最后的全连接层以适应102个分类(类别数自己根据自己任务来)。
  • 从best.pth文件中加载模型权重(best.pth文件可以通过链接: https://pan.baidu.com/s/1RFNufQoLzuDZasgBdE7MdQ?pwd=qbw1 提取码: qbw1 获取)。
  • 设置模型为评估模式。
  • 如果use_gpu为真,则将模型移至GPU。

(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)

prepare_image函数接收一个PIL图像和目标尺寸,将图像转换为RGB模式(如果尚未转换),调整图像大小,并将其转换为张量,进行标准化,并通过判断移至GPU。

(4)预测端点

@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, traget_size=(224, 224))

            preds = F.softmax(model(image), dim=1)   # 得到各个类别的概率
            results = torch.topk(preds.cpu().data, k=3, dim=1)  # 概率最大的前3个结果
            results = (results[0].cpu().numpy(), results[1].cpu().numpy())

            # 将data字典增加一个key,value,其中value为list格式
            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)      # json类型可以被多种语言解析
  • /predict端点设计为接收POST请求,其中包含要分类的图像。
  • 如果请求成功且包含图像文件,则读取图像,调用上述函数进行预处理,并通过模型进行推理。
  • 通过torch.topk获取预测结果的前三个最高概率的类别和相应的概率,将结果以JSON格式返回。

(5)主程序运行

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')
    # app.run(host='192.000.00.00', port='5012')

2.客服端代码

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()
    # 向flask_urL服务发送一个POST请求,并尝试将返回的JSON响应解析为一个Puthon字典

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


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

3.总结

这部分代码片段主要讲述了服务端打开端口,然后客户端向运行在上述服务器上的Flask应用发送HTTP POST请求,以预测给定图像的分类。在客户端运行之前,我们需要先运行服务端代码,将端口打开,以便能够接收客户端发送的请求。这里展示的是本机发送请求,如果想发送请求到A电脑,需要另一台电脑运行服务端代码,并将服务端主程序运行注释部分取消注释,将IP地址更改为A电脑的IP,然后B电脑即可运行客户端代码,注意,这里客户端IP也应改为A电脑IP。

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

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

相关文章

MyBatis入门之一对一关联关系(示例)

【图书介绍】《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》(杨章伟,刘祥淼)【摘要 书评 试读】- 京东图书 …

CTFHUB技能树之SQL——字符型注入

开启靶场,打开链接: 直接指明是SQL字符型注入,但还是来判断一下 (1)检查是否存在注入点 1 and 11# 返回正确 1 and 12# 返回错误 说明存在SQL字符型注入 (2)猜字段数 1 order by 2# 1 order…

InnoDB引擎(架构,事务原理,MVCC详细解读)

目录 架构分析 逻辑存储结构​ 内存结构​ Buffer Pool​ ChaneBuffer 自适应哈希​ LogBuffer​ 磁盘结构​ 后台线程​ 事务原理​ redolog日志 undolog日志​ MVCC​ 三个隐藏字段​ undolog版本链 readview​ RC(读已提交原理分析)​ RR(可重复读原理分析…

MySQL 数据库的备份与恢复:最佳实践与深度探讨

MySQL 数据库的备份与恢复:最佳实践与深度探讨 在现代应用程序和企业系统中,数据库是其核心组件之一,负责存储和管理大量的关键数据。MySQL 作为一种广泛应用的开源数据库管理系统,支持高性能和可扩展性,被广泛应用于…

aws 把vpc残留删除干净

最近忘了把vpc 删干净导致又被收了冤大头钱 在删除vpc 的收发现又eni在使用,但是忘了是哪个资源在占用 先用命令行把占用的资源找出来停掉 使用 AWS 命令行界面(CLI)来查看 VPC 的使用情况 列出子网: aws ec2 describe-subnets …

每日一道算法题(Leetcode 20)

Whats past is prologue. 凡是过去,皆为序章。 题目 分析 1. 我们可以用栈的结构来解决这道题。 2. 我们使用while循环,每次读取字符串中一个元素进行操作,直到最后读取到 \0为止。 3. 如果遇见 (, [ ,{ 这三种左括号,则把该左…

SWAT-MODFLOW地表水与地下水耦合技术——建议收藏!

原文链接:SWAT-MODFLOW地表水与地下水耦合技术——建议收藏!https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247623317&idx1&sn87516da827641ffd124519f929e5da26&chksmfa8da372cdfa2a643b7b806b806b31e025382b9896723d891ffd030…

【Dash】feffery_antd_components 按钮组件的应用

一、feffery_antd_componenet 中的 AntdFloatButton 和 AntdFloatButtonGroup AntdFloatButton 和 AntdFloatButtonGroup 是两个用于创建悬浮按钮和悬浮按钮组的组件。 AntdFloatButton 是单个悬浮按钮组件,它提供了多种属性来定义按钮的外观及行为。AntdFloatBut…

2024双十一最建议买的东西有哪些?双11购物清单大全分享

双十一即将来临,各大品牌都推出了令人心动的优惠活动,让我们能够以更加实惠的价格拥有心仪的好物。其中数码家电的产品,也是迎来了一波降价高潮,因此对于数码家电爱好者而言,双十一是入手的绝佳时机!本期我…

HTML+CSS实现点赞效果

效果演示 HTMLCSS实现点赞效果 HTML <div class"heart-container" title"Like"><input type"checkbox" class"checkbox" id"Give-It-An-Id"><div class"svg-container"><svg viewBox&qu…

AD9680(adc直采芯片)使用说明

写这篇文章之前我是没有使用过AD9680的芯片&#xff0c;但是使用过GMS011芯片&#xff08;是国内24S&#xff09;下的公司出来的芯片&#xff0c;寄存器和管脚全对标。 在这里我就大概说一下芯片的说用方法 一、硬件设计 该芯片支持双通道射频直采 支持协议JESD204B 14位 采样…

深度学习面试笔试之前向神经网络-多层感知器、损失函数、反向传播

深度学习面试笔试之前向神经网络-多层感知器、损失函数、反向传播 1. 什么是神经网络1.1 什么是感知器1.2 神经网络的结构1.3 为什么神经网络具有非线性切分能力 2. 神经网络的计算过程2.1 计算过程2.2 随机初始化模型参数2.3 激活函数2.3.1 激活函数有哪些2.3.2 优缺点2.3.3 为…

32.第二阶段x86游戏实战2-遍历技能2(技能二叉树基址)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

爱快路由器配置腾讯云动态域名DDNS详细说明

直白点说就是让爱快路由器自动配置当前公网IP地址给域名&#xff0c;动态域名DDNS不清楚的请自行百度&#xff0c; 这里就可以看见操作日志&#xff0c;那么我们一步一步来配置它吧&#xff0c;首先登录爱快路由器&#xff0c;如下图&#xff1a; 那么腾讯云我们怎么找到ID和…

什么是乐观锁、悲观锁?

什么是乐观锁、悲观锁&#xff1f; 乐观锁&#xff1a;乐观锁和悲观锁是并发控制的两种方式&#xff0c;用来确保在多线程或多用户访问共享资源时&#xff0c;数据的一致性和完整性。 悲观锁&#xff08;Pessimistic Lock&#xff09; 悲观锁假设并发操作会经常发生&#xf…

内卷中的营销大斗法:破局与挑战

如今&#xff0c;各个行业内卷严重&#xff0c;企业在营销领域展开了激烈的大斗法。 内卷&#xff0c;是指一种社会或文化模式在发展到一定阶段后&#xff0c;无法实现自我突破&#xff0c;只能在内部不断精细化、复杂化。商业领域的内卷表现为企业间在产品、服务、价格等方面…

Unity通过高德开放平台获取天气信息

一、注册高德开放平台账号&#xff0c;获取天气接口Key 1、构建自己的应用 网址&#xff1a;https://lbs.amap.com/api/webservice/guide/api/weatherinfo 最终调用api的地址形式&#xff1a; https://restapi.amap.com/v3/weather/weatherInfo?city110101&key<用户…

比瓴科技入选国家工业信息安全发展研究中心SBOM工作组首批成员单位

近日&#xff0c;由开放原子开源基金会主办&#xff0c;开源风险评估与治理技术实验室承办的2024开放原子开源生态大会软件物料清单&#xff08;SBOM&#xff09;分论坛在北京成功举办。 在会议上&#xff0c;国家工业信息安全发展研究中心&#xff08;简称“中心”&#xff0…

Florence-2视觉语言模型简明教程

近年来&#xff0c;计算机视觉领域见证了基础模型的兴起&#xff0c;这些模型无需训练自定义模型即可进行图像注释。我们已经看到了用于分类的 CLIP [2]、用于对象检测的 GroundingDINO [3] 和用于分割的 SAM [4] 等模型——每个模型都在其领域表现出色。但是&#xff0c;如果我…