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

将YOLOv8模型从PyTorch的.pt格式转换为TensorRT的.engine格式

      TensorRT是由NVIDIA开发的一款高级软件开发套件(SDK),专为高速深度学习推理而设计。它非常适合目标检测等实时应用。该工具包可针对NVIDIA GPU优化深度学习模型,从而实现更快、更高效的运行。TensorRT模型经过TensorRT优化,包括层融合(layer fusion)、精度校准(precision calibration)(INT8和FP16)、动态张量内存管理和内核自动调整(kernel auto-tuning)等技术。将深度学习模型转换为TensorRT格式可充分发挥NVIDIA GPU的潜力。

      TensorRT可兼容各种模型格式,包括TensorFlow、PyTorch和ONNX。

      TensorRT模型的主要特点

      (1).Precision Calibration:TensorRT支持精度校准,允许根据特定的精度要求对模型进行微调(fine-tuned)。这包括对INT8和FP16等精度较低的格式的支持,这可以在保持可接受的精度水平的同时进一步提高推理速度。

      (2).Layer Fusion:TensorRT优化过程包括层融合,即将神经网络的多个层组合成一个操作。这通过最小化内存访问和计算来减少计算开销并提高推理速度。

      (3).Dynamic Tensor Memory Management:TensorRT可有效管理推理过程中的张量内存使用情况,从而减少内存开销并优化内存分配。这可提高GPU内存利用率。

      (4).Automatic Kernel Tuning:TensorRT采用自动内核调整,为模型的每一层选择最优化的GPU内核。这种自适应方法可确保模型充分利用GPU的计算能力。

      TensorRT中的部署选项

      (1).Deploying within TensorFlow:此方法将TensorRT集成到TensorFlow中,使优化的模型可以在TensorFlow环境中运行。对于混合了受支持层和不受支持的层(a mix of supported and unsupported layers)的模型,此方法非常有用,因为TF-TRT可以高效处理这些层。

      (2).Standalone TensorRT Runtime API:提供精细控制,非常适合性能关键型应用程序。它更复杂,但允许自定义实现不受支持的运算符。

      (3).NVIDIA Triton Inference Server:支持各种框架模型的选项。它特别适合云端或边缘端推理(cloud or edge inference),提供并发模型(concurrent model)执行和模型分析等功能。

      训练生成TensorRT支持的.engine格式模型

      训练代码如下所示:

import argparse
import colorama
from ultralytics import YOLO
import torchdef parse_args():parser = argparse.ArgumentParser(description="YOLOv8 train")parser.add_argument("--yaml", required=True, type=str, help="yaml file")parser.add_argument("--epochs", required=True, type=int, help="number of training")parser.add_argument("--task", required=True, type=str, choices=["detect", "segment"], help="specify what kind of task")args = parser.parse_args()return argsdef train(task, yaml, epochs):if task == "detect":model = YOLO("yolov8n.pt") # load a pretrained modelelif task == "segment":model = YOLO("yolov8n-seg.pt") # load a pretrained modelelse:print(colorama.Fore.RED + "Error: unsupported task:", task)raiseresults = model.train(data=yaml, epochs=epochs, imgsz=640) # train the modelmetrics = model.val() # It'll automatically evaluate the data you trained, no arguments needed, dataset and settings remembered# model.export(format="onnx") #, dynamic=True) # export the model, cannot specify dynamic=True, opencv does not supportmodel.export(format="onnx", opset=12, simplify=True, dynamic=False, imgsz=640)model.export(format="torchscript") # libtorchmodel.export(format="engine", imgsz=640, dynamic=False, verbose=False, batch=1, workspace=2) # tensorrt fp32# model.export(format="engine", imgsz=640, dynamic=True, verbose=True, batch=4, workspace=2, half=True) # tensorrt fp16# model.export(format="engine", imgsz=640, dynamic=True, verbose=True, batch=4, workspace=2, int8=True, data=yaml) # tensorrt int8if __name__ == "__main__":# python test_yolov8_train.py --yaml datasets/melon_new_detect/melon_new_detect.yaml --epochs 1000 --task detectcolorama.init()args = parse_args()if torch.cuda.is_available():print("Runging on GPU")else:print("Runting on CPU")train(args.task, args.yaml, args.epochs)print(colorama.Fore.GREEN + "====== execution completed ======")

      使用INT8量化导出TensorRT:会执行训练后量化(post-training quantization, PTQ),即在模型训练完成后,无需重新训练即可对模型进行量化。TensorRT 使用校准进行PTQ。

      注:确保使用TensorRT模型权重进行部署的同一设备以INT8精度进行导出,因为校准结果可能因设备而异

      配置INT8导出:使用导出Ultralytics YOLO模型时提供的参数将极大地影响导出模型的性能。还需要根据可用的设备资源来选择它们,但是默认参数应该适用于大多数 Ampere(或更新版本)架构的NVIDIA独立GPU。使用的校准算法是"ENTROPY_CALIBRATION_2"。

      workspace:控制转换模型权重时设备内存分配的大小(以GiB为单位)。

      (1).根据校准需求和资源可用性调整workspace。虽然较大的workspace可能会增加校准时间,但它允许TensorRT探索更广泛的优化策略,从而有可能提高模型性能和准确性。相反,较小的workspace可以减少校准时间,但可能会限制优化策略,影响量化模型的质量。

      (2).默认值workspace=4(GiB),如果校准崩溃(没有警告就退出),则可能需要增加此值

      (3).如果workspace的值大于设备可用的内存,TensorRT将在导出期间报告UNSUPPORTED_STATE,这意味着应该降低workspace的值

      (4).如果workspace设置为最大值并且校准失败/崩溃,请考虑减少imgsz和batch的值以减少内存要求。

      切记:INT8的校准是针对每个设备的,借用"高端"GPU进行校准可能会导致在另一台设备上运行推理时性能不佳

      batch:用于推理的最大批次大小(batch-size)。推理期间可以使用较小的批次,但推理不会接受大于指定值的批次。

      在校准过程中,将使用提供的两倍批次大小。使用小批次可能会导致校准过程中的缩放不准确。这是因为该过程会根据它看到的数据进行调整。小批次可能无法捕获整个值范围,从而导致最终校准出现问题,因此批次大小会自动加倍。如果没有指定批次大小batch=1,则校准将以batch=1*2 运行,以减少校准缩放错误。

      NVIDIA的实验使他们建议使用至少500张代表模型数据的校准图像,并使用INT8量化校准。这是一个指导原则,而不是硬性要求,你需要试验哪些内容才能使你的数据集表现良好。由于使用TensorRT进行INT8校准需要校准数据,因此确保在TensorRT的int8=True时使用数据参数并使用data="my_dataset.yaml",这将使用验证中的图像进行校准。当使用INT8量化导出到TensorRT时没有传递任何数据值时,默认将使用基于模型任务的"small"示例数据集之一,而不是抛出错误。

      注:TensorRT将生成一个校准.cache,可以重复使用以加速使用相同数据导出未来模型权重,但当数据差异很大或批次值发生剧烈变化时,这可能会导致校准效果不佳。在这种情况下,应重命名现有.cache并将其移动到其他目录或完全删除。

      将YOLO与TensorRT INT8结合使用的优势:

      (1).减少模型大小:从FP32到INT8的量化可以将模型大小减小4倍(在磁盘或内存中),从而缩短下载时间、降低存储要求并减少部署模型时的内存占用。

      (2).更低功耗:INT8导出的YOLO模型的精度运算减少,与FP32模型相比,功耗更低,尤其是对于电池供电(battery-powered)的设备。

      (3).提高推理速度:TensorRT针对目标硬件优化模型,可能提高GPU、嵌入式设备和加速器上的推理速度。

      注:使用导出到TensorRT INT8的模型进行前几次推理调用时,预处理、推理和/或后处理时间(preprocessing, inference, and/or postprocessing times)可能会比平时更长。在推理过程中更改imgsz时也可能会出现这种情况,尤其是当imgsz与导出期间指定的值不同时(导出imgsz设置为TensorRT"最佳"配置文件)。

      使用YOLO和TensorRT INT8的缺点:

      (1).评估指标下降:使用较低的精度意味着mAP、精度、召回率或用于评估模型性能的任何其他指标可能会有所下降。

      (2).增加开发时间:找到数据集和设备的INT8校准的"最佳"设置可能需要大量测试。

      (3).硬件依赖性:校准和性能提升可能高度依赖于硬件,并且模型权重的可转移性较差。

      TensorRT的性能改进可能因所使用的硬件而异

      注:以上文字描述主要来自:https://docs.ultralytics.com/integrations/tensorrt/

      Windows10 Anaconda上配置TensorRT环境

      (1).配置Ultralytics CUDA开发环境,执行以下命令:

# install cuda 11.8
# install cudnn v8.7.0: copy the contents of bin,include,lib/x64 cudnn directories to the corresponding CUDA directories
conda create --name ultralytics-env-cuda python=3.8 -y
conda activate ultralytics-env-cuda
conda install -c pytorch -c nvidia -c conda-forge pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=11.8 ultralytics # pytorch 2.2.2git clone https://github.com/fengbingchun/NN_Test
cd NN_Test/demo/Python

      (2).从https://developer.nvidia.com/nvidia-tensorrt-8x-download 下载TensorRT 8.5 GA版本:TensorRT-8.5.3.1.Windows10.x86_64.cuda-11.8.cudnn8.6.zip,解压缩:

      A.将bin、include目录下内容拷贝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8对应目录下

      B.将lib下的所有静态库拷贝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\lib\x64目录下

      C.将lib下的所有动态库拷贝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin目录下

      (3).进入到python目录,执行以下命令:

pip install tensorrt-8.5.3.1-cp38-none-win_amd64.whl

      注:不能使用10.2 GA版本,否则会报Error: Unsupported SM: 0x601,在 https://docs.nvidia.com/deeplearning/tensorrt/release-notes/ 中有描述:NVIDIA Pascal (SM 6.x) devices are deprecated in TensorRT 8.6

     注:无论指定是FP32、FP16还是INT8训练完生成的最终文件名都为best.engine,这里手动调整文件名

      在网上下载了200多幅包含西瓜和冬瓜的图像组成melon数据集,使用生成的best.engine进行预测,代码如下所示:

import colorama
import argparse
from ultralytics import YOLO
import os
import torchimport numpy as np
np.bool = np.bool_ # Fix Error: AttributeError: module 'numpy' has no attribute 'bool'. OR: downgrade numpy: pip unistall numpy; pip install numpy==1.23.1def parse_args():parser = argparse.ArgumentParser(description="YOLOv8 predict")parser.add_argument("--model", required=True, type=str, help="model file")parser.add_argument("--dir_images", required=True, type=str, help="directory of test images")parser.add_argument("--dir_result", required=True, type=str, help="directory where the image results are saved")args = parser.parse_args()return argsdef get_images(dir):# supported image formatsimg_formats = (".bmp", ".jpeg", ".jpg", ".png", ".webp")images = []for file in os.listdir(dir):if os.path.isfile(os.path.join(dir, file)):# print(file)_, extension = os.path.splitext(file)for format in img_formats:if format == extension.lower():images.append(file)breakreturn imagesdef predict(model, dir_images, dir_result):model = YOLO(model) # load an model# model.info() # display model information # only *.pt format supportimages = get_images(dir_images)# print("images:", images)os.makedirs(dir_result) #, exist_ok=True)for image in images:if torch.cuda.is_available():results = model.predict(dir_images+"/"+image, verbose=True, device="cuda")else:results = model.predict(dir_images+"/"+image, verbose=True)for result in results:# print(result)result.save(dir_result+"/"+image)if __name__ == "__main__":# python test_yolov8_predict.py --model runs/detect/train10/weights/best_int8.engine --dir_images datasets/melon_new_detect/images/test --dir_result result_detect_engine_int8colorama.init()args = parse_args()if torch.cuda.is_available():print("Runging on GPU")else:print("Runting on CPU")predict(args.model, args.dir_images, args.dir_result)print(colorama.Fore.GREEN + "====== execution completed ======")

      执行结果如下图所示:

      预测结果图像如下所示:

      GitHub:https://github.com/fengbingchun/NN_Test

相关文章:

将YOLOv8模型从PyTorch的.pt格式转换为TensorRT的.engine格式

TensorRT是由NVIDIA开发的一款高级软件开发套件(SDK),专为高速深度学习推理而设计。它非常适合目标检测等实时应用。该工具包可针对NVIDIA GPU优化深度学习模型,从而实现更快、更高效的运行。TensorRT模型经过TensorRT优化,包括层融合(layer …...

Hello SLAM(在Linux中实现第一个C++程序)

首先需要安装vim编辑器,输入命令 sudo apt install vim 在Ubuntu上安装好vim编辑器后,创建路径(/home/slambook/ch2),在该路径下创建一个cpp文档(touch hello.c),通过vim编辑器进行…...

IPD推行成功的核心要素(十五)项目管理提升IPD相关项目交付效率和用户体验

研发项目往往包含很多复杂的流程和具体的细节。因此,一套完整且标准的研发项目管理制度和流程对项目的推进至关重要。研发项目管理是成功推动创新和技术发展的关键因素。然而在实际管理中,研发项目管理常常面临着需求不确定、技术风险、人员素质、成本和…...

C++ 鼠标轨迹API【神诺科技SDK】

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型,如直线或曲线路径。然而,这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现,使得神诺科技 能够通过深度学习技术,学习并模拟更自然的鼠标移动行为。 二.…...

设计模式|观察者模式

观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…...

python自动化运维 通过paramiko库和time库实现服务器自动化管理

目录 一.前言 二. 代码实现以及解析 2.1导入必要的库 2.2定义服务器信息 2.3创建 SSH 客户端连接函数 2.4执行远程命令函数 2.5获取系统信息函数 2.6重启服务函数 2.7 主函数 三.致谢 一.前言 在数字化时代,IT 基础设施的规模和复杂性不断增长&am…...

HTML常用的转义字符——怎么在网页中写“<div></div>”?

一、问题描述 如果需要在网页中写“<div></div>”怎么办呢&#xff1f; 使用转义字符 如果直接写“<div></div>”&#xff0c;编译器会把它翻译为块&#xff0c;类似的&#xff0c;其他的标签也是如此&#xff0c;所以如果要在网页中写类似于“<div…...

shell-awk文本处理工具

1、awk概述 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言&#xff0c;也是行处理软件&#xff0c;通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …...

如何在测试中保护用户隐私!

在当今数据驱动的时代&#xff0c;用户隐私保护成为了企业和开发团队关注的焦点。在软件测试过程中&#xff0c;处理真实用户数据时保护隐私尤为重要。本文将介绍如何在测试中保护用户隐私&#xff0c;并提供具体的方案和实战演练。 用户隐私保护的重要性 用户隐私保护不仅是法…...

ARCGIS PRO DSK GraphicsLayer创建文本要素

一、判断GraphicsLayer层【地块注记】是否存在&#xff0c;如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…...

看板项目之vue代码分析

目录&#xff1a; Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面Q2、组合饼状图如何实现Q3、vue项目如何实现环境的切换Q4、vue怎么实现vue里面去调用js文件里面的函数 Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面 …...

lua 游戏架构 之 游戏 AI (七)ai_dead

定义一个名为ai_dead的类&#xff0c;继承自ai_base类。这个类用于处理游戏中AI在死亡状态下的行为逻辑。以下是对代码的具体解释&#xff1a; 1. **引入基类**&#xff1a; - 使用require函数引入ai_base类&#xff0c;作为基础类。 2. **定义ai_dead类**&#xff1a; …...

前端开发知识(一)-html

1.前端开发需掌握的内容&#xff1a; 2.前端开发的三剑客&#xff1a;html、css、javascript Vue可以简化JavaScpript流程。 Element&#xff08;饿了么开发的&#xff09; &#xff1a;前端组件库。 Ngix&#xff1a;前端服务器。 3.前端开发工具&#xff1a;vscode 1)按…...

身份证如何查验真伪?C#身份证二要素、三要素接口集成

身份证不仅是我们的身份证明&#xff0c;更是社会生活中的“通行证”&#xff0c;现在人们的衣食住行都离不开身份证。但对于提供服务的平台而言&#xff0c;如何对用户提供的身份信息进行真伪核验便成为了一大难题。别担心&#xff0c;今天小编为服务平台带来了身份证二要素、…...

C++ | Leetcode C++题解之第290题单词规律

题目&#xff1a; 题解&#xff1a; class Solution { public:bool wordPattern(string pattern, string str) {unordered_map<string, char> str2ch;unordered_map<char, string> ch2str;int m str.length();int i 0;for (auto ch : pattern) {if (i > m) {…...

Pytorch使用教学7-张量的广播

PyTorch中的张量具有和NumPy相同的广播特性&#xff0c;允许不同形状的张量之间进行计算。 广播的实质特性&#xff0c;其实是低维向量映射到高维之后&#xff0c;相同位置再进行相加。我们重点要学会的就是低维向量如何向高维向量进行映射。 相同形状的张量计算 虽然我们觉…...

生成式AI:对话系统(Chat)与自主代理(Agent)的和谐共舞

生成式AI&#xff1a;对话与行动的和谐共舞 我们正站在一个令人激动的时代门槛上——生成式AI技术飞速发展&#xff0c;带来了无限的可能性。一个关键问题浮现&#xff1a;AI的未来是对话系统&#xff08;Chat&#xff09;的天下&#xff0c;还是自主代理&#xff08;Agent&am…...

唯众物联网(IOT)全功能综合实训教学解决方案

一、引言 在信息技术日新月异的今天&#xff0c;物联网&#xff08;IoT&#xff09;作为推动数字化转型的关键力量&#xff0c;其触角已延伸至我们生活的方方面面&#xff0c;深刻地重塑了工作模式、生活习惯乃至社会结构的每一个角落。面对这一前所未有的变革浪潮&#xff0c…...

24证券从业考试报名『个人信息表』填写模板❗

24证券从业考试报名『个人信息表』填写模板❗ 1️⃣居住城市、通讯地址&#xff1a;写自己现居住的地址就可以。 2️⃣学历&#xff1a;需要注意的是学历填写的是考生已经取得的学历&#xff0c;在校大学生已经不具有报名资格&#xff0c;选择大专以上&#xff0c;或者是高中学…...

深度学习系列70:模型部署torchserve

1. 流程说明 ts文件夹下&#xff0c; 从launcher.py进入&#xff0c;执行jar文件。 入口为model_server.py的start()函数。内容包含&#xff1a; 读取args&#xff0c;创建pid文件 找到java&#xff0c;启动model-server.jar程序&#xff0c;同时读取log-config文件&#xff…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...