用tensorrt的python api序列化生成的engine可以用于c++部署吗

用tensorrt的python api序列化生成的engine可以用于c++部署吗

  • 以下回答由chatgpt基于相关博客总结生成:

    可以将通过使用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);
        }
    }