ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【TensorRT】官方文档onnx序列化教程与推理教程

2026/9/19 13:08:24 拓冰建站 浏览量
【TensorRT】官方文档onnx序列化教程与推理教程

官方文档onnx序列化教程与推理教程

  • 一、构建TensorRT序列化模型
    • 1、搭建阶段(三步走)
      • 1.1 创建网络
      • 1.2 使用ONNX解析器导入模型
      • 1.3 构建推理引擎
    • 2、解析onnx模型
    • 3、构建推理引擎
  • 二、反序列化模型
  • 三、执行推理

一、构建TensorRT序列化模型

本博客主要说明的是TensorRT C++ API,从我们获取到onnx模型开始的流程。C++ API可以通过引用头文NvInfer.h来进行访问(使用其命名空间nvinfer1),代码示例:

#include "NvInfer.h"using namespace nvinfer1;

需要说明的是,TensorRT C++的接口类都以I为前缀开头,例如ILoggerIBuilder,等等。如果在此之前不存在,则TensorRT第一次调用CUDA时会自动创建CUDA上下文。在第一次调用TensorRT之前,最好自己创建和配置CUDA上下文。

并且由于需要展示各对象的存在周期,实例代码中没有使用智能指针,但是建议在实际使用中加上智能指针来配合TensorRT接口。

1、搭建阶段(三步走)

要创建构建器,首先必须实例化ILogger接口。这个例子捕获所有警告消息,但忽略信息性消息:

inline const char* severity_string(nvinfer1::ILogger::Severity t) {switch (t) {case nvinfer1::ILogger::Severity::kINTERNAL_ERROR: return "internal_error";case nvinfer1::ILogger::Severity::kERROR:   return "error";case nvinfer1::ILogger::Severity::kWARNING: return "warning";case nvinfer1::ILogger::Severity::kINFO:    return "info";case nvinfer1::ILogger::Severity::kVERBOSE: return "verbose";default: return "unknow";}
}class My_Logger : public nvinfer1::ILogger           
{
public:virtual void log(Severity severity, const char* msg) noexcept override{// suppress info-level messages// 捕获所有警告类消息并输出if (severity <= Severity::kWARNING)// 打印带颜色的字符,格式如下:// printf("\033[47;33m打印的文本\033[0m");// 其中 \033[ 是起始标记//      47    是背景颜色//      ;     分隔符//      33    文字颜色//      m     开始标记结束//      \033[0m 是终止标记// 其中背景颜色或者文字颜色可不写// 部分颜色代码 https://blog.csdn.net/ericbar/article/details/79652086printf("\033[31m%s: %s\033[0m\n", severity_string(severity), msg);}
} my_logger;

然后你可以使用刚刚实例化的一个my_logger作为参数来实例化一个builder

IBuilder* builder = createInferBuilder(my_logger); 

1.1 创建网络

创建构建器之后,优化模型的第一步是创建网络定义:

uint32_t flag = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); INetworkDefinition* network = builder->createNetworkV2(flag);

为了使用ONNX解析器导入模型,需要使用kEXPLICIT_BATCH标志。有关更多信息,请参阅显式批处理与隐式批处理部分。

1.2 使用ONNX解析器导入模型

现在,我们可以通过ONNX模型来填充网络定义,ONNX解析器API位于文件nvonnxparser.h中,解析器位于nvonnxparser c++命名空间中:

#include “NvOnnxParser.h”using namespace nvonnxparser;

我们可以通过创建一个ONNX解析器来填充网络定义:

IParser* parser = createParser(*network, my_logger);

然后,我们可以读取ONNX模型路径,并处理各类问题:

const char* ONNX_MODEL = ";
//virtual bool parseFromFile(const char* onnxModelFile, int verbosity);
bool parser_status = parser->parseFromFile(ONNX_MODEL, static_cast<int32_t>(ILogger::Severity::kWARNING));
for (int32_t i = 0; i < parser.getNbErrors(); ++i)
{
std::cout << parser->getError(i)->desc() << std::endl;
}

需要注意的是,TensorRT网络定义的一个重要方面是它包含指向模型权重的指针,这些指针由构建器复制到优化的引擎中。由于网络是使用解析器创建的,所以解析器拥有权重占用的内存,因此在构建器运行之前,不可以删除解析器对象。


1.3 构建推理引擎

(未完待续,今天太晚了,上床睡觉了)

2、解析onnx模型

3、构建推理引擎

二、反序列化模型

三、执行推理