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

基于Tensorrt C++ API 构建YOLOV5实现engine以及推理

一、主流的深度学习推理架构有哪些。

OpenVINO是由英特尔开发的开源工具套件,旨在优化和加速在各种英特尔架构(如CPU、GPU和FPGA)上的深度学习推理,特别侧重于计算机视觉任务。该工具包支持来自流行框架(如TensorFlow和PyTorch)的模型,将它们转换为适合在英特尔硬件上部署的中间表示。
ONNX(Open Neural Network Exchange)是一套表示深度神经网络模型的开放格式,由微软、Facebook和亚马逊等科技公司联合开发的跨平台深度学习框架,它借助中间表示的方式将深度学习框架之间的模型和权重参数相互转换,使得用户可以方便地将自己训练好的模型迁移到其他框架或硬件平台上使用。
TensorRT是NVIDIA推出的用于深度学习模型优化的高性能库,旨在最大程度地提高深度学习推理的效率和吞吐量。TensorRT可以将训练好的神经网络模型转换为高度优化的代码,以便在GPU上进行实时推理。TensorRT针对不同类型的层使用了一系列高效的算法和技巧来加速计算。TensorRT可以通过与CUDA和cuDNN等NVIDIA库的集成,以及利用GPU硬件加速来进一步提高性能。
Mediapipe 是由 Google Research 开发的一款开源框架,旨在帮助开发者轻松地构建、测试和部署复杂的多模态、多任务的机器学习模型。它特别擅长于实时处理和分析音频、视频等多媒体数据。

二、TensorRT介绍

TensorRT是英伟达针对自家平台做的一个加速包,可以认为 TensorRT 是一个只有前向传播的深度学习框架。这个框架可以将 TensorFlow,Pytorch,Caffe2 等框架训练出的神经网络模型解析,然后与 TensorRT 中对应的层进行一一映射,把其他框架的模型统一全部转换到 TensorRT 中,然后在 TensorRT 中可以针对 NVIDIA 自家 GPU 实施优化策略,并进行部署加速。根据官方文档,使用TensorRT,在CPU或者GPU模式下其可提供10X乃至100X的加速。
TensorRT主要做了这么两件事情,来提升模型的运行速度:
1、TensorRT支持INT8和FP16的计算。深度学习网络在训练时,通常使用 32 位或 16 位数据。TensorRT则在网络的推理时选用不这么高的精度,达到加速推断的目的。
2、TensorRT对于网络结构进行了重构,把一些能够合并的运算合并在了一起,针对GPU的特性做了优化。

三、visual studio的环境配置

1.cuda库
2.cudnn库
3.tensorrt库
4.opencv gpu库
依赖库为:

cuda.lib
cudart.lib
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
opencv_world455.lib


模型部署推理时,涉及Trt与CUDA版本匹配的问题,本文记录一下如何查询匹配的CUDA,cuDNN和TensorRT版本,并配置安装。

40系卡推荐版本:CUDA-11.8,cuDNN-8.6.0,TensorRT-8.5.3.1
30系卡推荐版本:CUDA-11.1,cuDNN-8.2.1,TensorRT-8.2.4.2

四、tensorrt  C++以搭建MLP网络结构

1.构建引擎engine,并将其保存为文件形式。

1.1)yolo模型导出成 ONNX 格式。
1.2)把 ONNX 格式模型输入给 TensorRT,并指定优化参数。
1.3)使用 TensorRT 优化得到 TensorRT Engine。

#include "NvInfer.h"
#include "NvOnnxParser.h" // onnxparser
#include "logger.h"
#include "common.h"
#include "buffers.h"
#include "cassert"

/*
1. Create builder
2. Create Network

*/

int main(int argc, char **argv)
{
    if (argc != 2)  // 命令行参数要等于2 
    {
        std::cerr << "usage:  ./build [onnx_file_path]" << argv[0] << std::endl;
        return -1;
    }

    // onnx_file_path
    const char* onnx_file_path = argv[1];
    // 1. Create Builder
    auto builder = std::unique_ptr<nvinfer1::IBuilder>(nvinfer1::createInferBuilder(sample::gLogger.getTRTLogger()));
    // nvinfer::IBuilder *builder = nvinfer1::createInferBuilder(logger);
    if (!builder)
    {
        std::cerr << "create builder failed" << std::endl;
        return -1;
    }

    // 2. Set the input and output names of the network
    auto network = std::unique_ptr<nvinfer1::INetworkDefinition>(builder->createNetworkV2(1));
    if (!network)
    {
        std::cerr << "create network failed" << std::endl;
        return -1;
    }

    // 3. Parse Onnx configuration
    auto parser = std::unique_ptr<nvonnxparser::IParser>(nvonnxparser::createParser(*network, sample::gLogger.getTRTLogger()));
    auto parsed = parser->parseFromFile(onnx_file_path, static_cast<int>(sample::gLogger.getReportableSeverity()));
    if (!parsed)
    {
        std::cerr << "parse onnx file failed" << std::endl;
        return -1;
    }

    // 4. Set Image input size 
    // This program only have one input which is one Image at once (1, 3, 640, 640)
    auto input = network->getInput(0);
    auto profile = builder->createOptimizationProfile();
    // set KMIN, KMAX, KOPT
    profile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kMIN, nvinfer1::Dims4{1, 3, 640, 640});
    profile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kMAX, nvinfer1::Dims4{

http://www.kler.cn/news/337815.html

相关文章:

  • PhpStudy-PHP5.4.45后门漏洞应用程序(C++/base64/winhttp)
  • OmniCorpus数据集:最大(百亿级别)多模态数据集
  • 深入理解C语言中的内存分配函数:malloc、calloc、realloc
  • Modern CMake 简明教程(5)- 安装
  • Redis篇(面试题 - 连环16炮)(持续更新迭代)
  • 【笔记】I/O总结王道强化视频笔记
  • WSL--安装各种软件包
  • 《Linux从小白到高手》进阶实操篇:Linux找回Root用户密码
  • 掌握这17个Python自动化操作,简化你的日常工作流程,提升工作效率!
  • FDS-112 土壤盐分传感器 三针 自带温度补偿功能
  • 【爬虫】网站反debugger、内存爆破以及网站限制开发者工具
  • 教培机构如何向知识付费转型
  • github命令行管理工具推荐
  • kubernetes基础操作(pod生命周期)
  • mysql系统常用参数查询命令
  • Python去除字符串中的括号
  • 网文:孙子兵法看人性
  • ACT调试pycharm报错
  • 手写mybatis之数据源池化技术实现
  • 高级算法LLM大模型算法特训:带你转型AI大模型算法工程师