tensorRT部署之 代码实现 onnx转engine/trt模型

news/2024/11/15 3:05:48/

tensorRT部署之 代码实现 onnx转engine/trt模型

  • 前提已经装好显卡驱动、cuda、cudnn、以及tensorRT
  • 下面将给出Python、C++两种转换方式

1. C++实现

  • 项目属性配置好CUDA、tensoeRT库
  • 通常在实际应用中会直接读取onnx模型进行判断,如果对应路径已经存在engine模型,将直接通过tensorrt读入engine,如果没有,则对onnx进行编译生成engine模型后在进行读入
  • TensorRT在线加载模型,并序列化保存支持动态batch的引擎,实现源码可参考 TextandCode
  • 一篇超级详细的onnx基础教程(非常好):TextandCode
  • 代码实现:
#include <iostream>
#include <fstream>
#include "NvInfer.h"
#include "NvOnnxParser.h"// 实例化记录器界面。捕获所有警告消息,但忽略信息性消息
class Logger : public nvinfer1::ILogger
{void log(Severity severity, const char* msg) noexcept override{// suppress info-level messagesif (severity <= Severity::kWARNING)std::cout << msg << std::endl;}
} logger;void ONNX2TensorRT(const char* ONNX_file, std::string save_ngine)
{// 1.创建构建器的实例nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(logger);// 2.创建网络定义uint32_t flag = 1U << static_cast<uint32_t>(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);nvinfer1::INetworkDefinition* network = builder->createNetworkV2(flag);// 3.创建一个 ONNX 解析器来填充网络nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, logger);// 4.读取模型文件并处理任何错误parser->parseFromFile(ONNX_file, static_cast<int32_t>(nvinfer1::ILogger::Severity::kWARNING));for (int32_t i = 0; i < parser->getNbErrors(); ++i){std::cout << parser->getError(i)->desc() << std::endl;}// 5.创建一个构建配置,指定 TensorRT 应该如何优化模型nvinfer1::IBuilderConfig* config = builder->createBuilderConfig();// 6.设置属性来控制 TensorRT 如何优化网络// 设置内存池的空间config->setMemoryPoolLimit(nvinfer1::MemoryPoolType::kWORKSPACE, 16 * (1 << 20));// 设置低精度   注释掉为FP32if (builder->platformHasFastFp16()){config->setFlag(nvinfer1::BuilderFlag::kFP16);}// 7.指定配置后,构建引擎nvinfer1::IHostMemory* serializedModel = builder->buildSerializedNetwork(*network, *config);// 8.保存TensorRT模型std::ofstream p(save_ngine, std::ios::binary);p.write(reinterpret_cast<const char*>(serializedModel->data()), serializedModel->size());// 9.序列化引擎包含权重的必要副本,因此不再需要解析器、网络定义、构建器配置和构建器,可以安全地删除delete parser;delete network;delete config;delete builder;// 10.将引擎保存到磁盘,并且可以删除它被序列化到的缓冲区delete serializedModel;
}void exportONNX(const char* ONNX_file, std::string save_ngine)
{std::ifstream file(ONNX_file, std::ios::binary);if (!file.good()){std::cout << "Load ONNX file failed! No file found from:" << ONNX_file << std::endl;return ;}std::cout << "Load ONNX file from: " << ONNX_file << std::endl;std::cout << "Starting export ..." << std::endl;ONNX2TensorRT(ONNX_file, save_ngine);std::cout << "Export success, saved as: " << save_ngine << std::endl;}int main(int argc, char** argv)
{// 输入信息const char* ONNX_file  = "../weights/test.onnx";std::string save_ngine = "../weights/test.engine";exportONNX(ONNX_file, save_ngine);return 0;
}

http://www.ppmy.cn/news/517453.html

相关文章

redis协议与异步方式学习笔记

目录 1 交互方式 pipline2 广播机制2.1 概念演示2.2 使用场景 3 redis事物3.1 概念3.2 使用场景3.3 解决的问题3.3.1 背景&#xff1a;多线程竞争出现问题3.3.2 事务3.3.3 安全性事务 3.4两种类型的“事务”3.4.1 watch ... multi exec3.4.2 lua 脚本实现“原子”执行&#xff…

@4.verilog 参数

参数 参数化:参数用来定义时延和变量的宽度&#xff0c;以及状态的编码等 参数类型 parameter&#xff1a;通过例化传参&#xff0c;改变参数值 localparam&#xff1a; parameter 只能对参数赋值一次&#xff0c;使用defparam 实现 注 对于传多个参数时&#xff0c;如BUS_A…

(完美)华为麦芒4 RIO-AL00的usb调试模式在哪里打开的步骤

在我们使用PC通过数据线链接到安卓手机的时候&#xff0c;如果手机没有开启Usb调试模式&#xff0c;PC则没办法成功读到我们的手机&#xff0c;有时&#xff0c;我们使用的一些功能较强的APP好比之前我们使用的一个APP引号精灵&#xff0c;老版本就需要打开Usb调试模式下使用&a…

大数据学习笔记-HDFS(四)——HDFS架构

1、HDFS架构 Hadoop Distribute File System&#xff0c;Hadoop分布式文件系统&#xff0c;HDFS是Hadoop核心组件之一&#xff0c;作为生态圈最底层的分布式服务而存在。 HDFS解决的问题就是大数据如何存储。 架构图&#xff1a;主从架构&#xff08;master/slave&#xff0…

4. 参数配置

4. 参数配置 参数 查看参数 show parameter parameter_name;查看参数是静态参数还是动态参数 select name,value,isses_modifiable,issys_modifiable from v$system_parameter;-- isses_modifiable 和issys_modifiable 分别对应的是session级别修改的参数和system级别修改…

python函数的4种参数类型

总结 python 函数中的不同参数类型的使用方法。 在调用函数时&#xff0c;通常会传递参数&#xff0c;函数内部的代码保持不变&#xff0c;针对 不同的参数 处理 不同的数据。 有位置传参、关键字传参、默认值参数、多值参数等。 1、参数传递 形参和实参&#xff1a; 形参&…

Python 函数的4种参数

Python的函数参数有4种&#xff1a; 必选参数&#xff1a;函数调用时必须赋值的参数默认参数&#xff1a;函数定义时&#xff0c;赋予默认值的参数&#xff0c;位于必选参数之后。如def test(param,default3),default为默认参数&#xff0c;函数调用时&#xff0c;如果没有给d…

华为webview打不开页面【型号:HUAWEI 麦芒4 】

问题描述&#xff1a;webview打开一个页面后再打开第二个页面&#xff0c;首次可以打开&#xff0c;接下来所有webview界面都打不开 问题解决&#xff1a;是系统webview的问题&#xff0c;到华为应用市场搜索webview安装即可&#xff0c;手机华为市场可能找不到&#xff0c;到电…