【YOLOv5模型部署】——TensorRT推理引擎安装与使用基于Flask的项目部署

声明:笔记是做项目时根据B站博主视频学习时自己编写,请勿随意转载!

温馨提示:对于我的电脑没有Nvidia的独显,只有Intel的集显,最后导出时无法识别Nvidia显卡设备!!就没成功!! 如果你的torch与我一样之前安装的CPU版本,那么很可能最后与我一样!


一、模型部署概述

算法要落地到实际应用,这就叫模型部署

模型部署是将训练好的机器学习或深度学习模型集成到实际应用中,使其能够对外提供服务的过程。只有将模型部署到实际应用中,才能发挥其作用,为企业或个人带来实际效益。

主要包括在线部署离线部署两种。

  • 在线部署:是指将训练好的模型直接部署到实时应用场景中,以实时处理和预测数据。其主要优势在于实时性高效性。其算法原理是将训练好的模型加载到内存中,然后通过输入数据流进行处理和预测。

具体步骤:①加载训练好的模型文件、②将输入数据流转换为模型所需的格式、③通过模型进行处理和预测,④输出预测结果。

  • 离线部署:则是将训练好的模型部署到非实时应用场景中,以批量处理和预测数据。它的主要优势在于数据安全计算资源利用率。离线部署的算法原理是将训练好的模型保存到磁盘中,然后通过批量输入数据进行处理和预测。

具体步骤包括:①训练好的模型保存到磁盘中、②将批量输入数据加载到内存中、③通过模型进行处理和预测,④将预测结果保存到磁盘中。


大模型小模型的部署方式区别:

  • 大模型通常参数较多、层数较深,因此具有更强的表达能力和更高的准确度。但是,这也意味着大模型需要更多的计算资源和时间来训练和推理。在部署大模型时,往往需要考虑到服务器的性能、内存和存储等要求。

常见的部署方式包括将模型部署为Web服务,或者将模型打包成Docker镜像后部署到云服务器上。这些方式可以充分利用云端的强大计算资源,满足大模型对性能的需求。

  • 小模型通常参数较少、层数较浅,具有轻量级、高效率、易于部署等优点。这些模型适用于数据量较小、计算资源有限的场景,例如移动端应用嵌入式设备等。

在部署小模型时,可以考虑将模型直接部署到这些设备上,或者使用一些轻量级的框架来实现。这样既可以节省计算资源,又可以实现快速响应和实时处理。


训练框架推理引擎的不同角色:

  • 训练框架主要用于模型的训练阶段,它提供了构建、训练和验证机器学习模型的工具和方法。训练框架通常包含了大量的优化算法和技巧,以及丰富的数据处理和模型调优功能,帮助研究人员和开发者更高效地训练出高质量的模型。
  • 当模型训练完成后,需要将其部署到实际应用中进行推理时,就需要使用推理引擎了。

推理引擎是实施问题求解的核心执行机构,它主要负责在设备端高效地运行模型,进行前向推理。与训练框架相比,推理引擎更关注于模型的执行效率和性能优化,以满足实际应用中对于实时性、准确性和资源消耗等方面的要求。


二、TensorRT推理引擎

TensorRT是NVIDIA开发的一种高性能深度学习推理优化器和运行时加速库(引擎),主要用于加速深度学习应用在生产环境中的部署

目标是为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可以支持TensorFlow、Caffe、Mxnet、Pytorch等几乎所有的深度学习框架,与NVIDIA的GPU结合,它能在这些框架中进行快速和高效的部署推理。

模型部署时不再使用训练时的Torch框架,主要有以下几个原因:

  • 资源消耗与性能:训练阶段,为了加快训练速度,通常会使用多GPU分布式训练,这在资源消耗上是非常大的。然而,在实际部署时,出于成本考虑,往往不会使用过多的GPU资源,甚至会选择使用CPU进行模型的推理。

TensorRT正是针对这种情况,通过优化内存使用和网络结构,减少推理过程中的内存消耗,提高系统整体效率,从而实现低延迟和高吞吐量的推理。

  • 跨平台支持:TensorRT支持主流的GPU架构,如NVIDIA的CUDA架构,这使得它可以在不同平台上部署和运行优化后的模型,增加了模型的灵活性和可移植性。
  • 模型优化:TensorRT提供了灵活的API和工具,可以根据需求进行网络结构的剪枝、融合和量化,实现模型的定制化优化。此外,它还能针对特定的硬件平台(如NVIDIA GPU)优化模型,从而实现更快的推理速度。

1、环境安装

①CUDA

下载链接如下:

CUDA-11-6-0下载icon-default.png?t=N7T8https://developer.nvidia.com/cuda-11-6-0-download-archive

选择对应电脑系统的版本,右下角下载,下载后安装一直点“Next”即可!这样安装完一般都在C盘的以下文件路径:


②CUDNN

下载链接如下:

CUDNN下载icon-default.png?t=N7T8https://developer.nvidia.com/rdp/cudnn-archive

这里下载上面这个压缩包,解压复制里面的4个文件:

将这4个文件粘贴在CUDA的路径下:


若前两步安装正确,在终端中输入nvcc -V会显示如下:


③TensorRT

TensorRT安装icon-default.png?t=N7T8https://developer.nvidia.com/nvidia-tensorrt-download

下载解压后里面的文件如下:

这里的python文件夹里面有一些预编译好的库文件,需要根据我们的python版本用pip进行安装。具体操作如下:

  • 查看我们的python版本为3.8.19,则需要pip安装第三个cp38的版本
  • 从文件路径处输入“cmd”回车直接可进入目标目录的cmd窗口:
  • 激活环境后直接输入pip命令+文件名即可安装对应cp38版本的tensorrt:

此外lib文件夹中的文件如下,需要把它们复制粘贴在刚才CUDA安装位置的bin文件夹里:

粘贴位置如下(C盘):


④zlibwapi.dll

若之前训练安装的是CU116版本的Pytorch,可不必这一步!!其他版本的似乎没有这个文件

zLibDll文件icon-default.png?t=N7T8https://www.winimage.com/zLibDll/

将压缩包里zlibwapi.dll这个应用扩展程序也粘贴在CUDA的bin文件夹中:


2、模型导出

①pip install onnx

打开yolov5的项目文件夹的export.py文件,可见上面注释“Format”支持导出很多种格式,默认的模型格式是Pytorch。

“Requirements”提示我们需要安装requirements.txt和onnx,requirements.tx之前已经有了,onnx可以理解为一个“中间格式适配器”,很多格式都可以先转换为onnx格式然后再转换为其他格式:

下面安装下onnx:

pip install onnx


②导出命令

export.py的导出使用方法注释“Usage”中也有,include后面的根据“Format”第二列中选择对应格式的字段,比如TensorRT格式对应engine

终端中输入以下代码运行导出,发现报错说“必须运行在GPU”上:

再代码后指定设备--device 0即可:

python export.py --weights yolov5s.pt --include engine --device 0

对于我的电脑没有Nvidia的独显,只有Intel的集显,所以这里无法识别设备!!就没成功!! 


某站作者大大(@你可是处女座啊)导出完成后的界面如下,给出了不同的用法如detect.py、val.py、torchhub用法等:

yolov5s.pt权重文件所在目录会出现一个名为yolov5s.engine的对应tenorrt格式的权重文件。


③torch和tensorrt效果对比

  • 使用torch运行detect.py

运行速度:

  • 使用tensorrt运行detect.py(权重文件改为yolov5s.engine即可)

运行效果:


发现使用tensorrt的时间还臂用torch的时间慢了0.7ms,这是为什么呢?

因为torch的输入维度是384x640,而tensorrt的输入维度是640x640(模型在部署落地应用时一般输入维度都是固定的,所以tensorrt在加速时维度是定死的,不可改的),之所以是640x640是因为导出tensorrt格式时为指定维度:

python export.py --weights yolov5s.pt --include engine --device 0

若想导出tensorrt格式时将维度定为384x640以便与torch的检测速度对比,则重新导出:

python export.py --weights yolov5s.pt --include engine --device 0 img 384 640
  • 重新使用tensorrt运行detect.py文件(注意指定对应的权重文件),结果如下,可见速度提升了不少:


拓:若想导出tensorrt格式时指定半精度推理,可用下面导出方法:

python export.py --weights yolov5s.pt --include engine --device 0 img 384 640 --half

导出后,再次运行detect.py文件(注意指定对应的权重文件),结果如下,速度又提升了点:

不只是导出tensor格式时可指定img大小,运行detect.py时也可指定img的维度,只是该维度不能超过导出时最大的384x640,例如运行detetc.py时指定img192x640:

可发现检测速度又有了提升:


三、基于Flask的YOLOv5项目部署

1、基于文件的模型检测

 主要文件:

2、基于图像的模型检测

这里由于上面受显卡限制,不再详细写过程,可参考原视频:

基于Flask的模型部署icon-default.png?t=N7T8http:// https://www.bilibili.com/video/BV1Mk4y1i7v1/?share_source=copy_web&vd_source=8f7729bb666414c7bb823ad003dc6e38


往期精彩

STM32专栏(9.9)icon-default.png?t=N7T8http://t.csdnimg.cn/A3BJ2

OpenCV-Python专栏(9.9)icon-default.png?t=N7T8http://t.csdnimg.cn/jFJWe

AI底层逻辑专栏(9.9)icon-default.png?t=N7T8http://t.csdnimg.cn/6BVhM

机器学习专栏(免费)icon-default.png?t=N7T8http://t.csdnimg.cn/ALlLlSimulink专栏(免费)icon-default.png?t=N7T8http://t.csdnimg.cn/csDO4电机控制专栏(免费)icon-default.png?t=N7T8http://t.csdnimg.cn/FNWM7 

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

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

相关文章

访问数组索引时超出边界引发 ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException 是 Java 中非常常见的一种运行时异常。它是在访问数组时,如果访问的索引超出了数组的有效范围时抛出的异常。为了更好地理解这种异常的工作机制、产生原因以及如何处理,让我们详细分解这个问题,并从多个角度进…

STM32基础篇:RTC × Unix时间戳 × BKP

Unix时间戳 最早是在Unix系统使用的,之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前,Linux、Windows、安卓这些系统,其底层的计时系统都是使用Unix时间戳。 Uinx时间戳(Unix Timestamp)定义为从UTC/…

实验室ICPR 2024论文分享┆DS MYOLO:一种基于状态空间模型的驾驶场景可靠目标检测器

论文分享简介 本推文详细介绍了一篇实验室的最新论文成果《DS MYOLO: A Reliable Object Detector Based on SSMs for Driving Scenarios》,该论文已被第27届国际模式识别大会(ICPR)接收,论文的第一作者为李杨。论文提出了一种基…

Elasticsearch Mapping 详解

1 概述 映射的基本概念 Mapping 也称之为映射,定义了 ES 的索引结构、字段类型、分词器等属性,是索引必不可少的组成部分。 ES 中的 mapping 有点类似与DB中“表结构”的概念,在 MySQL 中,表结构里包含了字段名称,字…

CRIO与Windows下LabVIEW开发对比

LabVIEW在CRIO和Windows平台上开发时,尽管同属于一个编程环境,但在硬件架构、实时性能、模块化设计等方面存在显著差异。CRIO系统通常应用于工业自动化和嵌入式控制,具有实时操作系统支持和强大的I/O扩展能力;而Windows系统则更适…

《机器学习》文本数据分析之关键词提取、TF-IDF、项目实现 <上>

目录 一、如何进行关键词提取 1、关键词提取步骤 1)数据收集 2)数据准备 3)模型建立 4)模型结果统计 5)TF-IDF分析 2、什么是语料库 3、如何进行中文分词 1)导包 2)导入分词库 3&#xff09…

今年读过最绝的大模型神书死磕这本大模型神书!看完直接脱胎换骨!!

书名📖:《大语言模型:基础与前沿》 该书深入阐述了大语言模型(Large Language Model, LLM)的基本概念和算法、研究前沿以及应用,内容全面且系统性强,适合👨🏻‍&#x1…

Prometheus + Grafana + nVisual 实现运维监控全面可视化

Prometheus主要实现采集、存储、查询设备数据指标、告警等功能;Grafana通过Prometheus的API以仪表板的形展示数据,同时在线提供了大量监测数据展示模版。然而,实际运维中我们不仅需要实时监测数据,还需要了解设备的物理位置、拓扑…

3.js - modelPosition.z = sin((modelPosition.x+uTime)*10.0)*0.05;

哈 1、完整的动态波纹效果吧 main.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 顶点着色器 import basicVertexShader from ./shader/11-01/raw/vertex.glsl?raw // 片元着色器 import basicFragmentShad…

使用docker安装jenkins,然后使用jenkins本地发版和远程发版

使用docker安装jenkins,然后使用jenkins本地发版和远程发版 1、安装docker 1.安装必要的一些系统工具 sudo yum install docker-ce 2.添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.更新…

内推|京东|后端开发|运维|算法...|北京 更多岗位扫内推码了解,直接投递,跟踪进度

热招岗位 更多岗位欢迎扫描末尾二维码,小程序直接提交简历等面试。实时帮你查询面试进程。 安全运营中心研发工程师 岗位要求 1、本科及以上学历,3年以上的安全相关工作经验; 2、熟悉c/c、go编程语言之一、熟悉linux网络编程和系统编程 3、…

102.二叉树的层次遍历的算法实现及详解

二叉树的层次遍历 题目 102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3…

解析查看elf文件的构成

x86下用clang编译一段c代码,编译成elf文件,读elf文件,dump出里面的所有段,并打印出段中的数据和含义以及汇编的内容 编写C代码 首先,编写一个简单的C程序,例如命名为example.c: 使用Clang编…

您知道tar、xz、zip这三种不同压缩方式的区别吗?

tar、xz、zip是三种不同的压缩和打包格式,它们在压缩算法、使用场景、兼容性等方面存在一定的差异。以下是对这三种格式的比较: 1. 压缩算法 tar:tar本身并不进行压缩,它只是一种打包工具,将多个文件和目录打包成一个…

springboot整合Logback

Logback介绍 描述 Logback是由log4j创始人设计的另外一种开源日志组件,性能比log4j要好。相对是一个可靠、通用、快速而又灵活的Java日志框架。 Logback主要分三个模块 1、logback-core:其他两个模块的基础模块 2、logback-classic:它是lo…

10、Django Admin修改标题

admin from django.contrib import admin from .models import Category, Origin, Hero, Villain # 添加以下代码 admin.site.site_header "系统管理" admin.site.site_title "管理员界面" admin.site.index_title "欢迎来到这里&#xff…

TCP如何关闭连接(详细版)

关闭连接的⽅式通常有两种,分别是 RST 报⽂关闭和 FIN 报⽂关闭。 如果进程异常退出了,内核就会发送 RST 报⽂来关闭,它可以不⾛四次挥⼿流程,是⼀个暴⼒关闭连接的⽅式。 安全关闭连接的⽅式必须通过四次挥⼿,它…

【STM32】通用定时器TIM(输入捕获)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 前言 输入捕获简介 输入捕获配置 初始化IO口 输入捕获初始化 选择触发源及从模式 测量频率方法 输入捕获代码 IC.h IC.c 输入捕获测占空比 前言 建议先阅读这篇博客&#xf…

Unity编辑器开发 Immediate Mode GUI (IMGUI)

1. 简介: IMGUI是代码驱动gui系统,由 OnGUI 函数驱动: void OnGUI() {if (GUILayout.Button("Press Me")){ Debug.Log("Hello!");} } IMGUI常用于: 创建 in-game debugging displays and tools&#xff1b…

vs2019编译opencv+contribute+gpu

1、提前准备 vs2019、opencv4.4.0、opencv-contribute4.4.0、CUDA Toolkit 11.8(不能高于自己电脑的CUDA版本)、CUDNN8.9.6 ps:先提前准备环境 1)cmd中查看:nvidia-smi查看自己的显卡信息,不存在下述信息…