WilL846 2023-04-30 00:40 采纳率: 75%
浏览 5

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

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-30 04:08
    关注
    • 以下回答由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);
          }
      }
      
    评论

报告相同问题?

问题事件

  • 创建了问题 4月30日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据