已有的trt不适配,需要将onnx转为trt
注意:如果不使用Int8模式,onnx的parser代码几乎通用
构建阶段
运行阶段
记录器
getTRTLogger();
模型搭建的入口,网络的trt内部表示和引擎都是builder的成员方法生成的
builder.create_optimization_profile():创建用于dynamic shape输入的配置器
createInferBuilder()
builder.create_network():创建tensorrt网络对象
createNetworkV2()
在builderconfig下面进行细节设置
另外builder需要创建optimazation profile
在给定输入张量的最小最常见最大尺寸后,将设置的profile传给config
auto profile = builder->createOptimizationProfile();
profile->setDimensions();
config->addOptimizationProfile(profile);
进行设置网络属性
config=builder.create_builder_config()
auto config = std::unique_ptr(builder->createBuilderConfig());
config->addOptimizationProfile(profile);//添加用于dynamic shape输入的配置器
config->setFlag();
创建network(计算图)是API独需的因为其他两种方法使用parser从onnx导入,不用一层层添加
network=builder.create_network()
在onnx-parser中一旦模型parser解析完成,network就自动填好了,成为了serialized network
onnx-parser解析
createParser(*network, sample::gLogger.getTRTLogger();
parser->parseFromFile(modelFile.c_str(), static_cast(sample::gLogger.getReportableSeverity()));
build_serialized_network(network,config)
推理引擎,可执行的代码段
生成engine:
m_engine = std::unique_ptr(builder->buildEngineWithConfig(*network, *config), samplesCommon::InferDeleter());
context即GPU进程
创建context:
python:engine.create_execution_context()
m_context = std::unique_ptr(m_engine->createExecutionContext(), samplesCommon::InferDeleter());
仅dynamic shape需要
python:cudart.cudaMalloc(inputHost.nbytes)[1]
课程第四部分会对buffer部分的优化做介绍
拷贝到cuda buffer上执行再拷贝回host,这一步一般是B.解析trt中做,但是读取onnx后也可以做
engine->serialize()
遇到tensorrt不支持的onnx模型节点
已有trt,直接导入然后使用
parse TRT后得到engine和context
getTRTLogger()
createInferRuntime()
runtime->deserializeCudaEngine()
engine->createExecutionContext()