写一个tensorrt的c++部署模板
时间: 2023-08-29 15:13:38 浏览: 112
这是一个基本的TensorRT C++部署模板,您可以根据自己的需要进行修改:
```c++
#include "NvInfer.h"
#include "NvOnnxParser.h"
#include "NvInferRuntimeCommon.h"
#include <iostream>
#include <fstream>
#include <sstream>
using namespace nvinfer1;
using namespace std;
void printUsage()
{
cout << "Usage: ./trt_engine <onnx_model_path> <trt_engine_path>" << endl;
}
int main(int argc, char** argv)
{
if(argc != 3)
{
printUsage();
return -1;
}
// 创建一个Builder对象
IBuilder* builder = createInferBuilder(gLogger);
// 创建一个OnnxParser对象
IParser* parser = nvonnxparser::createParser(*builder, gLogger);
// 从ONNX模型文件中解析网络
const std::string onnxModelPath(argv[1]);
const auto parsed = parser->parseFromFile(onnxModelPath.c_str(), static_cast<int>(gLogger.getReportableSeverity()));
// 如果解析失败,则输出错误信息并退出
if (!parsed)
{
cout << "Failed to parse ONNX model " << onnxModelPath << endl;
return -1;
}
// 构建一个TensorRT引擎
builder->setMaxBatchSize(1);
builder->setMaxWorkspaceSize(1 << 30); // 1GB
ICudaEngine* engine = builder->buildCudaEngine(*parsed);
// 释放Parser对象
parser->destroy();
// 保存TensorRT引擎
const std::string enginePath(argv[2]);
ofstream engineFile(enginePath, ios::binary);
if (!engineFile)
{
cout << "Failed to open output engine file: " << enginePath << endl;
return -1;
}
IHostMemory* serializedEngine = engine->serialize();
engineFile.write(reinterpret_cast<const char*>(serializedEngine->data()), serializedEngine->size());
serializedEngine->destroy();
// 释放引擎和Builder对象
engine->destroy();
builder->destroy();
return 0;
}
```
这个模板使用了TensorRT的C++ API,首先创建了一个Builder对象和一个OnnxParser对象。然后从ONNX模型文件中解析网络,构建一个TensorRT引擎,并将其保存到文件中。最后释放Parser对象、引擎和Builder对象。
阅读全文