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日

悬赏问题

  • ¥50 安装华大九天aether
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证