【TensorRT】TensorRT C# API 项目更新 (2):优化安装方式和代码

1. 项目介绍

   NVIDIA® TensorRT™ 是一款用于高性能深度学习推理的 SDK,包括深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。基于 NVIDIA TensorRT 的应用程序在推理过程中的执行速度比纯 CPU 平台快 36 倍,使您能够优化在所有主要框架上训练的神经网络模型,以高精度校准低精度,并部署到超大规模数据中心、嵌入式平台或汽车产品平台。

  TensorRT 基于 NVIDIA CUDA® 并行编程模型构建,使您能够在 NVIDIA GPU 上使用量化、层和张量融合、内核调整等技术来优化推理。TensorRT 提供 INT8 使用量化感知训练和训练后量化和浮点 16 (FP16) 优化,用于部署深度学习推理应用程序,例如视频流、推荐、欺诈检测和自然语言处理。低精度推理可显著降低延迟,这是许多实时服务以及自主和嵌入式应用所必需的。TensorRT 与 PyTorch 和 TensorFlow 集成,因此只需一行代码即可实现 6 倍的推理速度。TensorRT 提供了一个 ONNX 解析器,因此您可以轻松地将 ONNX 模型从常用框架导入 TensorRT。它还与 ONNX 运行时集成,提供了一种以 ONNX 格式实现高性能推理的简单方法。

  基于这些优势,TensorRT目前在深度模型部署应用越来越广泛。但是TensorRT目前只提供了C++与Python接口,对于跨语言使用十分不便。目前C#语言已经成为当前编程语言排行榜上前五的语言,也被广泛应用工业软件开发中。为了能够实现在C#中调用TensorRT部署深度学习模型,我们在之前的开发中开发了TensorRT C# API。虽然实现了该接口,但由于数据传输存在问题,当时开发的版本在应用时存在较大的问题。

  基于此,我们开发了TensorRT C# API 2.0版本,该版本在开发时充分考虑了上一版本应用时出现的问题,并进行了改进。同时在本版本中,我们对接口进行了优化,使用起来更加简单,并同时提供了相关的应用案例,方便开发者进行使用。

  • TensorRT C# API 项目源码:
https://github.com/guojin-yan/TensorRT-CSharp-API.git
  • TensorRT C# API 项目应用源码:
https://github.com/guojin-yan/TensorRT-CSharp-API-Samples.git

2. 更新回顾

  由于该项目目前还没有完全开发完成,为了更好的方便大家使用,因此会在最新更新后提供给大家最新的资讯。如果大家在使用时有任何疑问,可以阅读之前发布的技术博客:

  • 技术博客一:《最新发布!TensorRT C# API :基于C#与TensorRT部署深度学习模型》

    分享了更新版的TensorRT C# API 相关信息,并对扩展接口进行改进,优化哦了模型推理数据加载方式,很大程度上压缩了数据处理时间;同时分型了最新版本的详细使用流程,以及提供了配套的使用案例,方便开发者们进行使用。

  • 技术博客二:《TensorRT C# API 项目更新 (1):支持动态Bath输入模型推理》

​ 支持了动态模型输入,此处主要是指的是动态Bath,更新了对动态输入模型的支持,

该项目在推出后,得到了大家而广泛支持,但也有不少开发者在使用中碰到了许多相关问题,因此针对这些问题,我们对内容进行了更新,主要更新了一下内容:

  • 项目配置方式:简化了项目配置流程,安装好相关依赖后,用户只需要下载代码文件便可以运行,无需再进行项目配置;
  • 优化了推理方式:优化了底层推理接口,使模型推理更加稳定。

3.项目配置方式

  项目中主要是需要开发者安装CUDA、CUDNN以及TensorRT,其中CUDA、CUDNN是我们开发者常用的库,相信大家也都已经安装过,如果没有安装过CUDA、CUDNN,可以自行百度教程进行安装,CUDA、CUDNN安装完成后,会在系统中增加相应的环境变量,如下图所示:

image-20240621125434413

  因此为了方便后续的项目配置,我们在安装TensorRT时,也需要将TensorRT相应的文件放在该目录下。

3.1 TensorRT下载

  下面我们下载对应版本的TensorRT,首先查看本电脑的CUDA版本,如上图中,CUDA_PATH_V12_2说明我们安装的CUDA版本版本是12.2,接下来访问下面链接进行下载

https://developer.nvidia.com/tensorrt/download

  进入到下载页面后,选择8.x系列,目前只支持8.x系列及以下系列,暂时不支持10.x系列。然后根据自己的CUDN版本选择对应的包进行下载,如下图所示:

image-20240621141234437

3.2 配置TensorRT库

  下载完成后解压到本地,如下图所示:

image-20240621144338464

  接下来将下载好的TensorRT部分内容复制到CUNDN目录下,主要是复制TensorRT目录下的includelib两个文件夹到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2目录下,具体目录根据自己的CUDA安装位置有关,如下图所示:

image-20240621144618124

  最后将lib目录下中的TensorRT的dll文件,全部复制到上级目录下的bin文件夹下,如下图所示:

image-20240621145023055

  到此为止,我们已经完全配置好了TensorRT,下面演示如何使用最新的项目生成本机运行的项目。

3.3 编译C++项目

  首先第一步下载项目源码,使用Git命令将源码下载到本地,如下图所示

git clone https://github.com/guojin-yan/TensorRT-CSharp-API.git

  然后使用Visual Studio 2022打开解决方案文件,如下图所示:

  该解决方案中包含两个项目,一个是C++项目,该项目是封装的TensorRT接口,将接口封装到动态链接库中;另一个是C#项目,该项目是读取动态链接库中的C++接口,然后重新封装该接口。

  最新的项目中我们将动态链接库、包含目录内知道项目中,开发者无需再进行重新配置,只要保证上文中CUDA、CUDNN以及TensorRT正确安装即可。所以下载完代码后,直接生成C++项目,此处选择生成,不要选择运行,如下图所示:

  最终可以看出生成的动态链接库文件名称以及文件路径。

  下面有一点后面我们需要注意,在后面使用时,我们需要将此处生成的dll文件复制到程序运行目录下。

3.4 编译C#项目

  接下来编译C#项目,C#项目此处也无须再修改,我们此处添加的是dll文件的绝对路径,因此在使用时,需要将上文生成的dll文件复制到运行目录下。如鼓励开发者觉得比较麻烦,依旧可以跟之前一样,只需要修改一下位置即可,修改NativeMethods.cs文件中的dll文件路径,该路径及上一步中C++项目生成的动态链接库文件,如下图所示:

image-20240621154308100

  接下来就可以运行C#项目,生成类库文件,如下图所示:

image-20240621154227766

  此处我们同时生成了.NET FrameWork 4.6、.NET FrameWork 4…72、.NET FrameWork 4.8、.NET 8.0、.NET 6.0、.NET 5.0、.NET 3.1,用户在后续使用时,根据生成版本进行选择即可。

  编译好该项目后,开发者后续便可以进行使用,使用方式与之前版本一致,此处不再进行赘述。

4. 程序运行稳定性测试

  之前在使用中有用户反馈模型推理在长时间运行时,推理时间波动较大,且再推理视频时,推理一段时间后,推理速度会有明显下降,对此,我们修改了底层源码,修复了这个问题,并进行了测试,如下图所示:

0d79b2203253ca815db43e8ab4b7e0ca

  此处测试了视频推理,以YOLOv8s为例,记录了视频前1500帧,可以看出。在修复后,模型推理时间趋于稳定,在7~10ms范围内波动,波动范围只有3ms,没有出现速度下降等问题。

5. 总结

  在本次更新中,我们针对开发者在使用过程中发出现的相关问题进行了更新,并优化了项目安装方式,方便开发者快速上手使用。最后如果各位开发者在使用中有任何问题,欢迎大家与我联系。

个人账号 - 2

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

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

相关文章

扣子/coze智能体开发的经验与避坑指南

近期,我计划几场关于分享智能体应用开发的活动。因此,我顺便总结了我在创建智能体过程中遇到的问题和解决方案,帮助大家避免类似的陷阱,提高智能体的性能和用户体验。以下是我总结的几点关键经验。 1. 人设与回复逻辑的提示词 在…

《C++ Primer》导学系列:第 8 章 - IO库

8.1 IO类 C标准库提供了一套丰富的输入输出&#xff08;IO&#xff09;类&#xff0c;用于处理数据的输入输出操作。这些类位于<iostream>头文件中&#xff0c;包括处理标准输入输出的istream和ostream类&#xff0c;处理文件输入输出的ifstream和ofstream类&#xff0c…

索引的分类和回表查询——Java全栈知识(29)

索引的分类和回表查询 Mysql 的索引按照类型可以分为以下几类&#xff0c;但是我们使用的 InnoDB 只支持主键索引&#xff0c;唯一索引&#xff0c;普通索引&#xff0c;并不支持全文索引。 1、聚集索引和二级索引 InnoDB 可以将索引分为两类分别是聚集索引和二级索引&…

编译原理大题自解(活前缀DFA、LR(0)分析表)

目录 4. (简答题) &#xff08;1&#xff09;给出识别活前缀的DFA &#xff08;2&#xff09;设计此文法的 LR(0)分析表 第一种解法 第二种解放 首先声明这是作者的写法&#xff08;不保证正确&#xff01;&#xff09;仅供参考。本题因为可能存在冲突的原因&#xff0c;所…

SpringCloud分布式微服务链路追踪方案:Zipkin

创作博客的目的是希望将自己掌握的知识系统地整理一下&#xff0c;并以博客的形式记录下来。这不仅是为了帮助其他有需要的人查阅相关内容&#xff0c;也是为了自己能够更好地巩固和加深对这些知识的理解。创作的时候也是对自己所学的一次复盘和总结&#xff0c;在创作的过程中…

【例子】webpack配合babel实现 es6 语法转 es5 案例 [通俗易懂]

首先来说一下实现 es6 转 es5 的一个简单步骤 1、新建一个项目&#xff0c;并且在命令行中初始化项目 npm init -y2、安装对应版本的 webpack webpack-cli(命令行工具) "webpack""webpack-cli"3、安装 Babel 核心库和相关的 loader "babel-core&qu…

PasteSpiderFile文件同步管理端使用说明(V24.6.21.1)

PasteSpider作为一款适合开发人员的部署管理工具&#xff0c;特意针对开发人员的日常情况做了一个PasteSpiderFile客户端&#xff0c;用于windows上的开发人员迅速的更新发布自己的最新代码到服务器上&#xff01; 虽然PasteSpider也支持svn/git的源码拉取&#xff0c;自动编译…

【自然语言处理系列】安装nltk_data和punkt库(亲测有效)

目录 一、下载nltk_data-gh-pages.zip数据文件 二、将nltk_data文件夹移到对应的目录 三、测试 四、成功调用punkt库 问题&#xff1a; 解决方案&#xff1a; 在使用自然语言处理库nltk时&#xff0c;许多初学者会遇到“nltk.download(punkt)”无法正常下载的问题。本…

Android Media Framework(七)MediaCodecService

Android引入Treble架构后&#xff0c;OpenMAX框架以HIDL Service的形式为System分区提供服务&#xff0c;本文将探讨该服务是如何启动&#xff0c;服务提供了什么内容&#xff0c;以及服务是如何被应用层所使用的。 1 概述 在Android的Treble架构中&#xff0c;为了确保系统的…

面试经典150题

打家劫舍 class Solution { public:int rob(vector<int>& nums) {int n nums.size();if(n 1){return nums[0];}vector<int> dp(n, 0);dp[0] nums[0];//有一间房可以偷//有两间房可以偷if(nums[1] > nums[0]){dp[1] nums[1];}else{dp[1] nums[0];}for …

react18 实现具名插槽

效果预览 技术要点 当父组件给子组件传递的 JSX 超过一个标签时&#xff0c;子组件接收到的 children 是一个数组&#xff0c;通过解析数组中各 JSX 的属性 slot &#xff0c;即可实现具名插槽的分发&#xff01; 代码实现 Father.jsx import Child from "./Child";…

【D3.js in Action 3 精译】第一部分 D3.js 基础知识

第一部分 D3.js 基础知识 欢迎来到 D3.js 的世界&#xff01;可能您已经迫不及待想要构建令人惊叹的数据可视化项目了。我们保证&#xff0c;这一目标很快就能达成&#xff01;但首先&#xff0c;我们必须确保您已经掌握了 D3.js 的基础知识。这一部分提到的概念将会在您后续的…

探秘神经网络激活函数:Sigmoid、Tanh和ReLU,解析非线性激活函数的神奇之处

引言 在神经网络中&#xff0c;激活函数扮演着至关重要的角色。它们赋予神经网络非线性的能力&#xff0c;使得网络具备学习和表示复杂函数关系的能力。本文将详细解析三种常见的激活函数&#xff1a;Sigmoid、Tanh和ReLU&#xff0c;揭开它们在神经网络中的奥秘。无论你是初学…

【十一】【QT开发应用】模拟腾讯会议登录界面设计UI

ui 加入会议的样式表 QPushButton { /* 前景色 */ color:#0054E6; /* 背景色 */ background-color:rgb(255,255,255); /* 边框风格 */ border-style:outset; /* 边框宽度 */ border-width:0.5px; /* 边框颜色 */ border-color:gray; /* 边框倒角 */ border-radius…

日常-----最爱的人

今日话题 大家好嗷&#xff0c;今天聊的技术可比之前的重要的多啊&#xff0c;哼哼&#xff0c;也不是今天&#xff0c;大家像我看齐嗷&#xff0c;我宣布个事情&#xff01;&#xff01;&#xff01; 于2024年6月21日晚上&#xff0c;本人遇到了这一生最爱的人 嘿嘿 这种事…

微信小程序 引入MiniProgram Design失败

这tm MiniProgramDesign 是我用过最垃圾的框架没有之一 我按照官网的指示安装居然能安装不成功,牛! 这里说明我是用js开发的 到以上步骤没有报错什么都没有,然后在引入组件的时候报错 Component is not found in path “./miniprogram _npm/vant/weapp/button/index” (using…

CSS阴影优化气泡框样式

<body> <div class"pop">气泡框</div> </body>body{display: flex;justify-content: center;align-items: center;height: 100% } .pop{display: flex;justify-content: center;align-items: center;background: #409eff;width: 150px;heigh…

03-Shell编程之循环语句与函数

目录 3.1 for循环语句 3.1.1for语句的结构 3.1.2 for语句应用实例 3.2 使用whlie循环语句 1.打印数字1到5 3.3 使用until循环语句 3.3.1until的实例 1.打印数字1到5&#xff08;使用until的逆向逻辑&#xff09; 2.等待用户输入特定内容 3.4 函数 3.4.1Shell函数的基…

自学C语言-10

第10章 指针 指针是C语言的一个重要组成部分&#xff0c;是C语言的核心、精髓所在。用好指针&#xff0c;可以在C语言开发中起到事半功倍的效果。一方面&#xff0c;可以提高程序的编译效率、执行速度&#xff0c;以及动态存储分配&#xff1b;另一方面&#xff0c;可使程序更加…

playwright录制脚本原理

Paywright录制工具UI 在上一篇博客中介绍了如何从0构建一款具备录制UI测试的小工具。此篇博客将从源码层面上梳理playwright录制原理。当打开playwright vscode插件时&#xff0c;点击录制按钮&#xff0c;会开启一个新浏览器&#xff0c;如下图所示&#xff0c;在新开浏览器页…