用tensorrt的python api序列化生成的engine可以用于c++部署吗
可以将通过使用TensorRT Python API序列化生成的Engine文件用于C++部署。 需要注意以下问题: 1.在C++中需要使用C++ API来进行反序列化和执行推理,具体可以参考TensorRT C++ API的文档。 2.需要注意在C++中使用的数据类型和数据格式,需要与Python中保持一致。 3.在C++中需要手动分配内存并绑定输入输出,具体方式可以参考以下示例代码:
//创建logger:日志记录器
auto logger = make_shared<nvinfer1::ILogger>();
//读取Engine文件并反序列化
ifstream engine_file("sample.engine", ios::binary);
if (!engine_file.good())
{
throw runtime_error("文件读取失败");
}
ostringstream buffer;
buffer << engine_file.rdbuf();
string serialized_engine = buffer.str();
unique_ptr<nvinfer1::IRuntime> runtime{ nvinfer1::createInferRuntime(*logger) };
unique_ptr<nvinfer1::ICudaEngine> engine{ runtime->deserializeCudaEngine(serialized_engine.data(), serialized_engine.size(), nullptr) };
// 分配主机和设备buffers
vector<void*> host_buffers(engine->getNbBindings());
vector<void*> device_buffers(engine->getNbBindings());
vector<int64_t> binding_sizes(engine->getNbBindings());
for (int32_t i = 0; i < engine->getNbBindings(); i++)
{
auto dims = engine->getBindingDimensions(i);
int32_t volume = accumulate(begin(dims), end(dims), 1, multiplies<int32_t>());
binding_sizes[i] = volume * sizeof(float);
cudaMalloc(&device_buffers[i], binding_sizes[i]);
host_buffers[i] = malloc(binding_sizes[i]);
if (engine->bindingIsInput(i))
{
//如果是输入参数,则将数据从主机内存拷贝到设备内存
cudaMemcpy(device_buffers[i], input_data, binding_sizes[i], cudaMemcpyHostToDevice);
}
}
//异步执行推理
unique_ptr<nvinfer1::IExecutionContext> context{ engine->createExecutionContext() };
context->enqueueV2(device_buffers.data(), cudaStream_t{ 0 }, nullptr);
for (int32_t i = 0; i < engine->getNbBindings(); i++)
{
if (!engine->bindingIsInput(i))
{
//如果是输出参数,则将数据从设备内存拷贝到主机内存
cudaMemcpy(host_buffers[i], device_buffers[i], binding_sizes[i], cudaMemcpyDeviceToHost);
}
}