TensorRT C++ API用法

文章目录

  • TensorRT C++ API用法
    • 1、C++ API vs Python API
    • 2、C++实例TensorRT对象
    • 参考

1、C++ API vs Python API

  本质上,TensorRT的C++接口和Python接口在满足你的需要时应该是接近完全一致的,C++接口应该被用在对性能有很大需求的场景,也同时被用在安全很重要的场景,比如自动驾驶。

  Python接口最大的好处就是在做数据预处理和后处理的时候比较方便,因为你可以使用各种各样的Python库,比如NumPy和SciPy。

2、C++实例TensorRT对象

  执行inference操作,你需要使用IExecutionContext对象。在创建IExecutionContext对象之前,你需要创建一个ICudaEngine对象(engine)。

  有两种方式来创建engine:

  • 解析训练好的模型。这种情况下engine可以被随意的序列化并且保存用于后续的使用

    • caffe模型解析生成engine
    • onnx模型解析生成engine
    • uuf模型(TensorFlow生成的)解析生成engine
  • 通过从磁盘读取序列化的engine。这种情况下,性能是更好的,因为解析模型和创建中间对象的步骤已经跳过。

  需要创建一个全局的ILogger对象,被用作TensorRT API各种方法的参数。创建ILogger对象的示例代码:

class Logger : public ILogger
{void log(Severity severity, const char* msg) override{// suppress info-level messagesif (severity != Severity::kINFO)std::cout << msg << std::endl;}
} gLogger;

  createInferBuilder(gLogger)是一个全局的TensorRT接口,用于创建IBuilder对象,通过iLogger作为输入参数来创建IBuilder如下图所示:

  iBuilder定义的createNetwork方法被用于创建一个iNetworkDefinition对象,如下图所示:

  把INetwork定义 作为输入 来创建parser,有三种pasers可选:Caffe,ONNX,或UFF:

  • ONNX:auto parser = nvonnxparser::createParser(*network, gLogger);
  • Caffe:auto parser = nvcaffeparser1::createCaffeParser();
  • UFF:auto parser = nvuffparser::createUffParser();

  调用iPaser的**parse()**方法来读取model file然后构建TensorRT的network,解析model file流程如下图所示:

  用上一步得到的 network 作为输入来调用IBuilder里面的buildCudaEngine()方法来创建ICudaEngine对象,如图所示:

  这样得到的engine对象就可以随意的序列化并且存储到文件中了,如下图所示:

  engine对象调用**createExecutionContext()**方法得到一个IExecutionContext对象,这个对象用于执行inference,如下图所示:

  如果序列化的engine文件已经生成好了在磁盘中,那么就可以直接加载engine文件来生成engine了,可以跳过上述的大多数步骤,直接通过调用全局TensorRT接口中的createInferRuntime(gLogger)方法来创建一个IRuntime对象如下图所示:

  对于TensorRT runtime的更多信息可以看下IRuntime class reference。然后可以通过调用**deserializeCudaEngine()**方法来创建engine即可。推理用法和哪种方式创建engine无关,都是一样的。

  尽管能够避开创建CUDA context,(默认的context将由你来创建),但这是不明智的,还是建议在创建一个runtime或builder对象之前先创建并配置CUDA context。

  builder或runtime将通过GPU context创建,涉及到创建线程。尽管在context不存在的情况下会默认的创建一个context,但是对于在创建一个runtime或builder对象之前去创建并配置一个CUDA context依然是明智之举。

参考

1、TensorRT开发者手册

2、https://devblogs.nvidia.com/speed-up-inference-tensorrt/

TensorRT C++ API用法相关推荐

  1. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

  2. CompletableFuture API用法介绍(二)

    文章目录 一.纯消费 API 1.thenAccep 2.thenAcceptBoth 3.runAfterBoth 4.thenRun(Runnable action) 二.组合API 1.then ...

  3. CompletableFuture API用法介绍(一)

    文章目录 一.前言 二.CompletableFuture 1.主动完成计算 2.创建异步任务 3.计算完成时对结果的处理 whenComplete/exceptionally/handle 4.结果 ...

  4. JavaEE基础(02):Servlet核心API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.核心API简介 1.Servlet执行流程 Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener) ...

  5. Jinja2安装与基本API用法

    文章目录 简介 前提条件 安装 基本API用法 API 基础 Unicode 高级API 参考文档 简介 Jinja2是用于Python的库,旨在灵活,快速且安全地运行. 前提条件 Jinja2适用于 ...

  6. php 调用微信收货地址,php微信自动获取收货地址api用法实例详解

    这篇文章主要介绍了php版微信自动获取收货地址api用法,结合实例形式分析了php版微信API接口调用与使用技巧,需要的朋友可以参考下 微信公众平台现在是越来越强大了,我们可以通过各种api接口来与平 ...

  7. Unity编辑器AssetDatabase函数API用法中文详解-Chinar教程

    Chinar blog :www.chinar.xin AssetDatabase 函数用法汇总 本文提供全流程,中文翻译 助力快速理解 AssetDatabase API 用法 为初学者节省宝贵的时 ...

  8. 【玩转yolov5】使用TensorRT C++ API搭建yolov5s-v4.0网络结构(1)

    注意:对于yolov5s-v4.0网络结构,上图仅作参考,实际结构以代码为准,存在少量差异! #需要一个全局的ILogger对象,用于记录日志信息 static Logger gLogger; #创建 ...

  9. Junit和Junit.Jupiter.api用法区别

    Junit和Junit.Jupiter.api用法区别写在了文章的总结处,这里先简单的介绍一下Junit用法. Junit 5 = Junit Platform + Junit Jupiter + J ...

最新文章

  1. 你知道这些 985、211 院校的隶属吗?
  2. Centos 7 下 Corosync + Pacemaker + DRBD + psc + crmsh 实现 mysql 服务高可用
  3. 计算机网络实验(华为eNSP模拟器)——第十二章 VLAN集中管理协议(VCMP)
  4. java future用法_纯干货:Java学习过程中的21个知识点和技术点
  5. 安卓逆向_3 --- 篡改apk名称和图标、修改包名实现应用分身、修改资源去广告、去除re管理器广告
  6. python密码登录程序三次_Python实现账号密码输错三次即锁定功能简单示例
  7. 《MySQL必知必会》学习笔记——第七章(数据过滤)
  8. 通过ajax获取经纬度,通过百度地图获取经纬度
  9. 人工智能助力网络金融反欺诈,声纹识别受追捧
  10. 2019年下半年教师资格幼儿园《综合素质》真题与参考答案
  11. 米勒拉宾算法(素性测试)
  12. 《了不起的我》 自我发展的心理学 -- 陈海贤 读后感
  13. 论文笔记:主干网络——SENet
  14. Android深度探索--HAL与驱动开发----第五章读书笔记
  15. 【CSS基础】文字垂直居中
  16. Windows、Linux系统常用CMD命令大全
  17. 做好SEO必备的三步骤
  18. 000 我和网安的故事.doc
  19. 我爱Flask之url_for()方法和HTTP请求
  20. 浏览器输入baidu.com加载的过程是什么,听完我的回答和尚摇了摇头,就这?

热门文章

  1. linux怎么看文件是否orc格式,hive文件存储格式orc,parquet,avro对比
  2. python 重命名文件出现乱码_下载的文件名总是「乱码」?这里有各平台的解决方法...
  3. OpenCV图像处理(1)——指定文件夹写入图像
  4. enumerable java_ruby中的Enumerable的使用
  5. python正则表达式提取字符串密码_用python正则表达式提取字符串
  6. php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
  7. python链接器编译器实现_一个链接器的实现「一」
  8. sql数据库去重语法_浅谈sql数据库去重_MySQL
  9. 对计算机硬件的工作原理的认识,计算机硬件的认识与安装.doc
  10. Python数据结构与算法(1.2)——Python基础之变量与内置数据类型