tensorRT 7.0 学习笔记(二)——c++ api

本文详细介绍了如何使用TensorRT进行模型转换和网络构建。内容包括创建Logger记录日志,通过API或Parser创建INetwork,如使用CaffeParser、ONNXParser和UFFParser加载不同格式的模型。接着,展示了从IBuilder到ICudaEngine的构建过程,包括设置BuilderConfig、最大工作区大小以及序列化和反序列化模型的方法。此外,还提供了Caffe、ONNX和UFF模型加载的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.创建Looger 用于记录转换过程中log

2.创建INetwork

创建Network有两种方法:1.直接用tensorrt的api搭建网络 2.使用parser(解析器)将已有的模型转换成Network

2.1使用api创建Network(略)

可以参考:

https://github.com/NVIDIA/TensorRT/blob/master/samples/opensource/sampleMNISTAPI/sampleMNISTAPI.cpp 官方例子

 

2.2使用parser 转换模型

转换模型的最终目标是生成 ICudaEngine,这样可以将ICudaEngine 序列化保存 也可以利用ICudaEngine 生成InferContext进行推理

转换过程的主要过程:

IBuilder--->parser--->Network--->builderConfig--->ICudaEngine

首先创建 Ibuilder;

然后根据模型格式不同创建不同的parser(caffe onnx uff);

然后调用: builder->createNetworkV2(0U); 创建一个空的INetWork

然后调用 builder->createBuilderConfig(); 创建一个BuilderConfig

builderConfig是一个结构体,里面定义了 模型的workspace,是否量化(如果量化的话还需要设置校准器(caliborator)) 等

最后调用 ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config); 创建出 ICudaEngine

 

根据格式不同,创建不同的network/parser:

ONNX
nvinfer1::INetworkDefinition* network = builder->createNetworkV2(1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH)); auto parser = nvonnxparser::createParser(*network, gLogger);
UFF
nvinfer1::INetworkDefinition* network = builder->createNetworkV2(0U);auto parser = nvuffparser::createUffParser();
Caffe
nvinfer1::INetworkDefinition* network = builder->createNetworkV2(0U);auto parser = nvcaffeparser1::createCaffeParser();

来自 <https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#c_topics>

 

加载模型的例子:

1.使用parser->parse加载caffe模型:

1.1 create

Ibuilder * builder=createInferBuilder(gLogger)

INetworkDefinition* network=builder->createNetWorkV2(0U)

1.2.parser:

ICaffeParser *parser=createCaffeParser();

1.3.parse and get blob-tensor map

Const IBlobNameToTensor * blobNCameToSensor=parser->parse("deploy file","modelFiule",DataType:kFLOAT)

 

2.使用uffParser加载tensorflow model:

2.1.创建 builder 和 network

IBuilder* builder = createInferBuilder(gLogger);
INetworkDefinition* network = builder->createNetworkV2(0U);

2.2创建 uff parser

IUFFParser* parser = createUffParser();

2.3.注册输入输出:

parser->registerInput("Input_0", DimsCHW(1, 28, 28), UffInputOrder::kNCHW);
parser->registerOutput("Binary_3");

2.4 parse:

parser->parse(uffFile, *network, nvinfer1::DataType::kFLOAT);

 

3.使用 onnx parser 载入模型:

3.1.crate builder/network

IBuilder* builder = createInferBuilder(gLogger);
const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); 
INetworkDefinition* network = builder->createNetworkV2(explicitBatch);

3.2.创建parser

nvonnxparser::IParser* parser =
nvonnxparser::createParser(*network, gLogger);

3.3parse:

parser->parseFromFile(onnx_filename, ILogger::Severity::kWARNING);

 

3.ICudaEngine

创建:

IBuilderConfig* config = builder->createBuilderConfig();
config->setMaxWorkspaceSize(1 << 20);
ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);

注:

对于 parser/network/config/builder 调用destroy() 释放资源

序列化与反序列化:

序列化:

IHostMemory *serializedModel = engine->serialize();
// store model to disk
//IHostMemory 是字节型数据,可以通过其 data() 获取数据的指针,通过size()获取其字节数。
serializedModel->destroy();

反序列化:

IRuntime* runtime = createInferRuntime(gLogger);
ICudaEngine* engine = runtime->deserializeCudaEngine(modelData, modelSize, nullptr);

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值