TensorRT C++ API用法
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用法相关推荐
- TensorFlow Keras API用法
TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...
- CompletableFuture API用法介绍(二)
文章目录 一.纯消费 API 1.thenAccep 2.thenAcceptBoth 3.runAfterBoth 4.thenRun(Runnable action) 二.组合API 1.then ...
- CompletableFuture API用法介绍(一)
文章目录 一.前言 二.CompletableFuture 1.主动完成计算 2.创建异步任务 3.计算完成时对结果的处理 whenComplete/exceptionally/handle 4.结果 ...
- JavaEE基础(02):Servlet核心API用法详解
本文源码:GitHub·点这里 || GitEE·点这里 一.核心API简介 1.Servlet执行流程 Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener) ...
- Jinja2安装与基本API用法
文章目录 简介 前提条件 安装 基本API用法 API 基础 Unicode 高级API 参考文档 简介 Jinja2是用于Python的库,旨在灵活,快速且安全地运行. 前提条件 Jinja2适用于 ...
- php 调用微信收货地址,php微信自动获取收货地址api用法实例详解
这篇文章主要介绍了php版微信自动获取收货地址api用法,结合实例形式分析了php版微信API接口调用与使用技巧,需要的朋友可以参考下 微信公众平台现在是越来越强大了,我们可以通过各种api接口来与平 ...
- Unity编辑器AssetDatabase函数API用法中文详解-Chinar教程
Chinar blog :www.chinar.xin AssetDatabase 函数用法汇总 本文提供全流程,中文翻译 助力快速理解 AssetDatabase API 用法 为初学者节省宝贵的时 ...
- 【玩转yolov5】使用TensorRT C++ API搭建yolov5s-v4.0网络结构(1)
注意:对于yolov5s-v4.0网络结构,上图仅作参考,实际结构以代码为准,存在少量差异! #需要一个全局的ILogger对象,用于记录日志信息 static Logger gLogger; #创建 ...
- Junit和Junit.Jupiter.api用法区别
Junit和Junit.Jupiter.api用法区别写在了文章的总结处,这里先简单的介绍一下Junit用法. Junit 5 = Junit Platform + Junit Jupiter + J ...
最新文章
- 你知道这些 985、211 院校的隶属吗?
- Centos 7 下 Corosync + Pacemaker + DRBD + psc + crmsh 实现 mysql 服务高可用
- 计算机网络实验(华为eNSP模拟器)——第十二章 VLAN集中管理协议(VCMP)
- java future用法_纯干货:Java学习过程中的21个知识点和技术点
- 安卓逆向_3 --- 篡改apk名称和图标、修改包名实现应用分身、修改资源去广告、去除re管理器广告
- python密码登录程序三次_Python实现账号密码输错三次即锁定功能简单示例
- 《MySQL必知必会》学习笔记——第七章(数据过滤)
- 通过ajax获取经纬度,通过百度地图获取经纬度
- 人工智能助力网络金融反欺诈,声纹识别受追捧
- 2019年下半年教师资格幼儿园《综合素质》真题与参考答案
- 米勒拉宾算法(素性测试)
- 《了不起的我》 自我发展的心理学 -- 陈海贤 读后感
- 论文笔记:主干网络——SENet
- Android深度探索--HAL与驱动开发----第五章读书笔记
- 【CSS基础】文字垂直居中
- Windows、Linux系统常用CMD命令大全
- 做好SEO必备的三步骤
- 000 我和网安的故事.doc
- 我爱Flask之url_for()方法和HTTP请求
- 浏览器输入baidu.com加载的过程是什么,听完我的回答和尚摇了摇头,就这?
热门文章
- linux怎么看文件是否orc格式,hive文件存储格式orc,parquet,avro对比
- python 重命名文件出现乱码_下载的文件名总是「乱码」?这里有各平台的解决方法...
- OpenCV图像处理(1)——指定文件夹写入图像
- enumerable java_ruby中的Enumerable的使用
- python正则表达式提取字符串密码_用python正则表达式提取字符串
- php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
- python链接器编译器实现_一个链接器的实现「一」
- sql数据库去重语法_浅谈sql数据库去重_MySQL
- 对计算机硬件的工作原理的认识,计算机硬件的认识与安装.doc
- Python数据结构与算法(1.2)——Python基础之变量与内置数据类型