gpt4 book ai didi

TensorRTC#API项目介绍:基于C#与TensorRT部署深度学习模型

转载 作者:撒哈拉 更新时间:2024-04-01 14:50:21 56 4
gpt4 key购买 nike

TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型

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. 接口介绍

  下面简单介绍一下该项目封装的接口:

  • class Nvinfer 。

  • 模型推理类: 该类主要是封装了转换后的接口,用户可以直接调用该类进行初始化推理引擎.

  • **public static void OnnxToEngine(string modelPath, int memorySize) ** 。

    • 模型转换接口:可以调用封装的TensorRT中的ONNX 解释器,对ONNX模型进行转换,并根据本机设备信息,编译本地模型,将模型转换为TensorRT 支持的engine格式。
    • string modelPath: 本地ONNX模型地址,只支持ONNX格式,且ONNX模型必须为确定的输入输出,暂不支持动态输入。
    • int memorySize: 模型转换时分配的内存大小
  • **public Nvinfer(string modelPath) ** 。

    • Nvinfer 初始化接口: 初始化Nvinfer类,主要初始化封装的推理引擎,该推理引擎中封装了比较重要的一些类和指针。
    • string modelPath: engine模型路径。
  • **public Dims GetBindingDimensions(int index)/GetBindingDimensions(string nodeName) ** 。

    • 获取节点维度接口: 通过端口编号或者端口名称,获取绑定的端口的形状信息.
    • int index: 绑定端口的编号
    • string nodeName: 绑定端口的名称
    • return Dims: 接口返回一个Dims结构体,该结构体包含了节点的维度大小以及每个维度的具体大小。
  • public void LoadInferenceData(string nodeName, float[] data)/LoadInferenceData(int nodeIndex, float[] data) 。

    • 加载待推理数据接口: 通过端口编号或者端口名称,将处理好的带推理数据加载到推理通道上。
    • string nodeName: 待加载推理数据端口的名称。
    • **int nodeIndex: **待加载推理数据端口的编号。
    • float[] data: 处理好的待推理数据,由于目前使用的推理数据多为float类型,因此此处目前只做了该类型接口。
  • public void infer() 。

    • 模型推理接口: 调用推理接口,对加载到推理通道的数据进行推理。
  • public float[] GetInferenceResult(string nodeName)/GetInferenceResult(int nodeIndex) 。

    • 获取推理结果: 通过端口编号或者端口名称,读取推理好的结果数据。
    • string nodeName: 推理结果数据端口的名称。
    • **int nodeIndex: **推理结果数据端口的编号。
    • return float[]: 返回值为指定节点的推理结果数据。

3. 安装流程

  下面演示一下安装方式,下文所有演示都是基于以下环境进行配置的:

  • 操作系统:Windows 11 。

  • 编译平台:Visual Studio 2022 。

  • 显卡型号:RTX 2060 。

  • CUDA型号:12.2 。

  • Cudnn:8.9.3 。

  • TensorRT:8.6.1.6 。

  对于CUDA以及Cudnn的安装此处不再作过多演示,大家可以自行安装.

3.1 TensorRT安装

  首先确定安装的CUDA版本,在命令提示符中输入nvcc -V指令,便可以获取安装的CUDA版本.

  接下来访问TensorRT Download | NVIDIA Developer下载安装包,此处安装8.x系列,安装最新的版本8.6,如下图所示,通过下载Zip文件进行安装,大家可以根据自己的CUDN版本进行下载.

  由于下载的是编译好的文件,因此在下载完成后,大家可以将其解压到常用的安装目录,然后将路径添加到环境变量即可,下面路径为本机安装的TensorRT路径,将其添加到本机的Path环境变量中.

D:\Program Files\TensorRT\TensorRT-8.6.1.6\lib

3.2 下载项目源码

  由于CUDA以及TensorRT程序集文件较大,无法打包成NuGet Package,因此需要用户自己进行编译.

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

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

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

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

3.3 配置C++项目

  接下来配置C++项目,主要分为以下几步:

第一步:设置项目输出类型

  C++项目主要用于生成动态链接库文件,因此将配置类型改为动态库(.dll).

第二部:设置包含目录

  当前C++项目主要使用两个依赖库,主要是CUDA(CUDNN)以及TensorRT,因此此处主要配置这两个依赖项,用户根据自己的安装情况进行配置即可.

  以下是本设备CUDA(CUDNN)以及TensorRT的包含目录位置,用户在使用时这需要根据自己本机安装情况进行设置即可.

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\include
D:\Program Files\TensorRT\TensorRT-8.6.1.6\include

第三步:设置库目录

  下面设置安装的CUDA(CUDNN)以及TensorRT的库目录情况,如下图所示.