TensorRT实战-基本框架

简介: 上篇博文4_TensorRT概况主要讲了Nvida TensorRT的编程API,本篇主要通过一个简单、完整的例子来讲解如何将一个Caffe模型(GoogleNet模型)通过TensorRT进行推理加速。

上篇博文4_TensorRT概况主要讲了Nvida TensorRT的编程API,本篇主要通过一个简单、完整的例子来讲解如何将一个Caffe模型(GoogleNet模型)通过TensorRT进行推理加速。


系统环境


本示例运行的系统环境如下:


  • 硬件环境:Jetson TX2


  • 软件环境:


  • JetPack:V4.2
  • CUDA:CUDA ToolKit for L4T V10.0
  • cuDNN:
  • cuDNN on Target 7.3
  • TensorRT On Target 5.0
  • Computer Vison:
  • OpenCV on Target 3.3.1
  • VisionWorks on target  1.6
  • MultiMedia API:  32.1


TensorRT基本框架


SampleGoogleNet类实现了基于GoogleNet模型的TensorRT网络构建、engine创建、推理等接口。


class SampleGoogleNet
{ 
  public:
      SampleGoogleNet(const samplesCommon::CaffeSampleParams& params)
          : mParams(params)
      {
      }
      //!
      //! 创建TensorRT网络
      //!
      bool build();
      //!
      //! 运行TensorRT推理引擎
      //!
      bool infer();
      //!
      //! 清理运行时创建的状态、资源
      //!
      bool teardown();
      samplesCommon::CaffeSampleParams mParams;
  private:
      std::shared_ptr<nvinfer1::ICudaEngine> mEngine = nullptr; //用于运行网络TensorRT引擎
      //!
      //! 该函数为GoogleNet解析一个Caffe模型,并创建一个TensorRT网络
      //!
      void constructNetwork(SampleUniquePtr<nvinfer1::IBuilder>& builder, SampleUniquePtr<nvinfer1::INetworkDefinition>& network, SampleUniquePtr<nvcaffeparser1::ICaffeParser>& parser);
};


配置参数


构建TensorRT时,需要几个比较重要的参数,这些参数一般在TensorRT应用启动时由命令行传入或者使用默认的配置参数。大部分参数都是在构建TensorRT网络时需要的配置参数,先分别列出如下:


  • batchSize:批量输入的数量


  • dalCore:是否使用DLA(Deep Learning Accelerate


  • dataDirs:网络模型数据存放的位置


  • inputTensorNames:用作输入的Tensor的数量


  • outputTensorNames:用作输出的Tensor的数量


  • 下面这两个参数用于基于Caffe的神经网络配置:


  • prototxtFileName:网络原型配置文件


  • weightsFileName:网络权重文件


构建(网络、推理引擎)


SampleGoogleNet::build(),该函数通过解析caffe模型创建GoogleNet网络,并构建用于运行GoogleNet (mEngine)的引擎。


//创建用于推理的Builder
  auto builder = SampleUniquePtr<nvinfer1::IBuilder>(nvinfer1::createInferBuilder(gLogger));
    if (!builder)
        return false;
  //通过builder创建网络定义
    auto network = SampleUniquePtr<nvinfer1::INetworkDefinition>(builder->createNetwork());
    if (!network)
        return false;
  //创建用于解析caffe网络模型的parser
    auto parser = SampleUniquePtr<nvcaffeparser1::ICaffeParser>(nvcaffeparser1::createCaffeParser());
    if (!parser)
        return false;
  //通过builder、network、parser、配置参数构建网络定义
    constructNetwork(builder, network, parser);
  constructNetwork函数定义如下:
  {
    const nvcaffeparser1::IBlobNameToTensor* blobNameToTensor = parser->parse(
        locateFile(mParams.prototxtFileName, mParams.dataDirs).c_str(),//加载网络原型配置文件
        locateFile(mParams.weightsFileName, mParams.dataDirs).c_str(),//加载网络训练权重文件
        *network,//网络定义
        nvinfer1::DataType::kFLOAT);//权重和张量的精度类型为FP32 format
    //遍历outputTensorNames,通过blobNameToTensor->find函数转换为对应的Tensor,最后通过markOutput将该Tensor标记为网络的输出量。
      for (auto& s : mParams.outputTensorNames)
          network->markOutput(*blobNameToTensor->find(s.c_str()));
    //根据batchSize设置最大的batchsize。
      builder->setMaxBatchSize(mParams.batchSize);
    //设置最大的工作空间大小。
      builder->setMaxWorkspaceSize(16_MB);
    //根据dlaCore决定是否启用DLA功能。
      samplesCommon::enableDLA(builder.get(), mParams.dlaCore);
  }
  //根据构建好的网络定义创建Cuda推理引擎。
    mEngine = std::shared_ptr<nvinfer1::ICudaEngine>(builder->buildCudaEngine(*network), samplesCommon::InferDeleter());
    if (!mEngine)
        return false;


推理


SampleGoogleNet::infer(),这个函数是示例的主要执行函数。它分配缓冲区、设置输入并执行引擎。


//创建RAII缓冲区(BufferManager类处理主机和设备(GPU)缓冲区分配和释放)管理结构。
  //BufferManager这个RAII类处理主机和设备缓冲区的分配和释放,主机和设备缓冲区之间的memcpy来辅助推理,调试转储来验证推
    //理。BufferManager类用于简化缓冲区管理以及缓冲区与引擎之间的任何交互
    samplesCommon::BufferManager buffers(mEngine, mParams.batchSize);
  //创建推理引擎运行上下文
    auto context = SampleUniquePtr<nvinfer1::IExecutionContext>(mEngine->createExecutionContext());
    if (!context)
        return false;
    //获取主机缓冲区并将主机输入缓冲区设置为所有零
    for (auto& input : mParams.inputTensorNames)
        memset(buffers.getHostBuffer(input), 0, buffers.size(input));
    //将数据通过memory从主机输入缓冲区拷贝到设备输入缓冲区
    buffers.copyInputToDevice();
  //执行推理 
    bool status = context->execute(mParams.batchSize, buffers.getDeviceBindings().data());
    if (!status)
        return false;
    //推理完成之后,将数据通过memcopy从设备输出缓冲区拷贝到主机输出缓冲区
    buffers.copyOutputToHost();


资源清理


nvcaffeparser1::shutdownProtobufLibrary();资源清理主要涉及到parser所使用的protobuf的清理。


总结


本文通过一个十分简单的示例,讲解了如何将一个网络模型部署到TensorRT上的编码过程。需要注意的是,文中所使用的网络模型为Caffe,使用到的parser也为ICaffeParser,TensorRT同时还支持ONX、UFF格式的parser,后续会总结如何通过这两类parser导入其他不同的网络模型,例如,tensorflow等。在执行推理时,需要涉及到数据在GPU缓存与CPU缓存之间的拷贝过程,该过程比较繁琐,文中使用BufferMannager很好的封装了这些过程,后续再开发TensorRT网络时可能借鉴这一思想。


相关文章
|
机器学习/深度学习 存储 并行计算
一篇就够:高性能推理引擎理论与实践 (TensorRT)
本文分享了关于 NVIDIA 推出的高性能的深度学习推理引擎 TensorRT 的背后理论知识和实践操作指南。
16269 9
一篇就够:高性能推理引擎理论与实践 (TensorRT)
|
11月前
|
机器学习/深度学习 缓存 PyTorch
131_推理加速:ONNX与TensorRT深度技术解析与LLM模型转换优化实践
在大语言模型(LLM)时代,高效的推理加速已成为部署高性能AI应用的关键挑战。随着模型规模的不断扩大(从BERT的数亿参数到GPT-4的数千亿参数),推理过程的计算成本和延迟问题日益突出。ONNX(开放神经网络交换格式)和TensorRT作为业界领先的推理优化框架,为LLM的高效部署提供了强大的技术支持。本文将深入探讨LLM推理加速的核心原理,详细讲解PyTorch模型转换为ONNX和TensorRT的完整流程,并结合2025年最新优化技术,提供可落地的代码实现与性能调优方案。
2209 4
|
JSON 安全 前端开发
跨域详解及Spring Boot 3中的跨域解决方案
本文介绍了Web开发中的跨域问题,包括概念、原因、影响以及在Spring Boot 3中的解决方案。跨域是由浏览器的同源策略限制引起的,阻碍了不同源之间的数据传输。解决方法包括CORS、JSONP和代理服务器。在Spring Boot 3中,可以通过配置CorsFilter来允许跨域请求,实现前后端分离项目的正常运行。
1468 3
 跨域详解及Spring Boot 3中的跨域解决方案
|
安全 Windows
机器狗的新面孔:开机登录时出现0x0000008E蓝屏错误2
机器狗的新面孔:开机登录时出现0x0000008E蓝屏错误2
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
并行计算 C++ Windows
windows10下visual studio 2019安装以及cuda11配置
windows10下visual studio 2019安装以及cuda11配置
3064 0
|
6天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1529 0
|
6天前
|
人工智能 自然语言处理 安全
阿里云AI数智鉴密:AI 生成内容如何拿到一张"防篡改的身份证"
隐形水印 + C2PA签名:让AI生成内容“持证上岗”。
1136 0
|
15天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
3806 4
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考