Python API vs C++ API of TensorRT
Python API vs C++ API of TensorRT
本质上,C++ API和Python API应该在支持您的需求方面接近相同。pythonapi的主要优点是数据预处理和后处理都很容易使用,因为您可以使用各种库,如NumPy和SciPy。 在安全性很重要的情况下,例如,在汽车中,C++ API应该被使用。有关C++ API的更多信息,请参见使用C++ API。
有关如何使用Python优化性能的更多信息,请参阅how Do I optimize My Python performance?来自TensorRT最佳实践指南。
Procedure
- Import TensorRT:
import tensorrt as trt
- Implement a logging interface through which TensorRT reports errors, warnings, and informational messages. The following code shows how to implement the logging interface. In this case, we have suppressed informational messages, and report only warnings and errors. There is a simple logger included in the TensorRT Python bindings.
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
使用TensorRT执行推理的第一步是从模型创建一个TensorRT网络。
实现这一点的最简单方法是使用TensorRT解析器库导入模型, (see Importing A Model Using A Parser In Python, Importing From Caffe Using Python, Importing From TensorFlow Using Python, and Importing From ONNX Using Python), which supports serialized models in the following formats:
- Caffe (both BVLC and NVCaffe)
- Supports ONNX releases up to ONNX 1.6, and ONNX opsets 7 to 11, and
- UFF (used for TensorFlow)
An alternative is to define the model directly using the TensorRT Network API, (see Creating A Network Definition From Scratch Using The Python API). This requires you to make a small number of API calls to define each layer in the network graph and to implement your own import mechanism for the model’s trained parameters.
下面的步骤说明了如何使用OnnxParser和pythonapi直接导入ONNX模型。 关于这个任务
有关更多信息,请参阅使用Python(introductive_parser_samples)示例将Caffe、TensorFlow和ONNX模型导入TensorRT的简介。
注:
一般来说,较新版本的OnnxParser设计为向后兼容,因此,遇到由早期版本的ONNX导出器生成的模型文件不会引起问题。当更改不向后兼容时,可能会出现一些异常。在本例中,将早期的ONNX模型文件转换为更高版本的支持版本。有关此主题的详细信息,请参阅ONNX Model Opset Version Converter。
用户模型也有可能是由一个支持比TensorRT附带的ONNX解析器支持的操作集更新的导出工具生成的。在这种情况下,检查发布到GitHub的TensorRT的最新版本onnx-tensorrt是否支持所需的版本。有关更多信息,请参阅Python中使用Object Detection With The ONNX TensorRT Backend In Python (yolov3_onnx)示例。
支持的版本由onnx_trt中的BACKEND_optset_version变量定义_后端.cpp. 从GitHub下载并构建最新版本的ONNXTensorRT解析器。可以在这里找到构建说明:用于TensorRT backend for ONNX后端。
在tensorrt7.0中,ONNX解析器只支持全维模式,这意味着必须使用explicitBatch标志集创建网络定义。有关详细信息,请参见使用动态形状Working With Dynamic Shapes。
builder的功能之一是搜索其CUDA内核目录,以获得最快的实现,因此有必要使用相同的GPU来构建优化引擎将运行的GPU。
关于这个任务
IBuilderConfig有许多属性,您可以设置这些属性来控制诸如网络运行的精度,以及自动调整参数,例如在确定哪个内核最快时,TensorRT应该为每个内核计时多少次(迭代次数越多,运行时间越长,但是对噪声的敏感度较低。)您还可以查询构建器,以找出硬件本机支持哪些混合精度类型。
一个特别重要的属性是最大工作空间大小。
层算法通常需要临时工作空间。此参数限制网络中任何层可以使用的最大大小。如果提供的划痕不足,则可能是TensorRT无法找到给定层的实现。
有关用Python构建引擎的更多信息,请参阅使用Python(introductive_parser_samples)示例将Caffe、TensorFlow和ONNX模型导入TensorRT的简介。
Procedure
- Build the engine using the builder object:
with trt.Builder(TRT_LOGGER) as builder, builder.create_builder_config() as config:
config.max_workspace_size = 1 << 20 # This determines the amount of memory available to the builder when building an optimized engine and should generally be set as high as possible.
with builder.build_engine(network, config) as engine:
# Do inference here.
When the engine is built, TensorRT makes copies of the weights.
- Perform inference. To perform inference, follow the instructions outlined in Performing Inference In Python.
- 4. Serializing A Model In Python
从这里开始,您可以序列化引擎,也可以直接使用引擎进行推断。在使用模型进行推理之前,序列化和反序列化模型是可选的步骤—如果需要,可以直接使用引擎对象进行推理。
关于这个任务
序列化时,您正在将引擎转换为一种格式,以便存储并在以后用于推断。要用于推断,只需对引擎进行反序列化。序列化和反序列化是可选的。由于从网络定义创建引擎可能很耗时,因此可以避免每次应用程序重新运行时重新生成引擎,方法是序列化一次引擎并在推断时反序列化它。因此,在构建引擎之后,用户通常希望序列化它以备以后使用。
注意:序列化引擎不能跨平台或TensorRT版本移植。引擎是特定于确切的GPU模型,他们是建立在(除了平台和TensorRT版本)。
- Serialize the model to a modelstream:
serialized_engine = engine.serialize()
- Deserialize modelstream to perform inference. Deserializing requires creation of a runtime object:
with trt.Runtime(TRT_LOGGER) as runtime: engine = runtime.deserialize_cuda_engine(serialized_engine)
It is also possible to save a serialized engine to a file, and read it back from the file:
- Serialize the engine and write to a file:
- with open(“sample.engine”, “wb”) as f:
f.write(engine.serialize())
- Read the engine from the file and deserialize:
- with open(“sample.engine”, “rb”) as f, trt.Runtime(TRT_LOGGER) as runtime:
engine = runtime.deserialize_cuda_engine(f.read())
下面的步骤说明了如何在Python中执行推理,现在您有了一个引擎。
Procedure
为输入和输出分配一些主机和设备缓冲区。本例假设context.all_binding_dimensions == True,并且引擎在binding_index=0时有一个输入,在binding_index=1时有一个输出:
# Determine dimensions and create page-locked memory buffers (i.e. won't be swapped to disk) to hold host inputs/outputs.
h_input = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(0)), dtype=np.float32)
h_output = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(1)), dtype=np.float32)
# Allocate device memory for inputs and outputs.
d_input = cuda.mem_alloc(h_input.nbytes)
d_output = cuda.mem_alloc(h_output.nbytes)
# Create a stream in which to copy inputs/outputs and run inference.
stream = cuda.Stream()
创建一些空间来存储中间激活值。由于引擎保存网络定义和训练参数,因此需要额外的空间。这些在执行上下文中保存:
with engine.create_execution_context() as context:
# Transfer input data to the GPU.
cuda.memcpy_htod_async(d_input, h_input, stream)
# Run inference.
context.execute_async_v2(bindings=[int(d_input), int(d_output)], stream_handle=stream.handle)
# Transfer predictions back from the GPU.
cuda.memcpy_dtoh_async(h_output, d_output, stream)
# Synchronize the stream
stream.synchronize()
# Return the host output.
return h_output
一个引擎可以有多个执行上下文,允许一组权重用于多个重叠的推理任务。例如,您可以使用一个引擎和每个流一个上下文来处理并行CUDA流中的图像。每个上下文都将在与引擎相同的GPU上创建。
Python API vs C++ API of TensorRT的更多相关文章
- python访问cloudstack的api接口
1.CloudStack API 如同 AWS API 一样,CloudStack API 也是基于 Web Service,可以使用任何一种支持 HTTP 调用的语言(例如 Java,python, ...
- python调用openstack的api,create_instance的程序解析
python调用openstack的api,create_instance的程序解析 2017年10月17日 15:27:24 CloudXli 阅读数:848 版权声明:本文为博主原创文章,未经 ...
- Python+Flask搭建mock api server
Python+Flask搭建mock api server 前言: 近期由于工作需要,需要一个Mock Server调用接口直接返回API结果: 假如可以先通过接口文档的定义,自己模拟出服务器返回结果 ...
- Python获得百度统计API的数据并发送邮件
Python获得百度统计API的数据并发送邮件 小工具 本来这么晚是不准备写博客的,当是想到了那个狗子绝对会在开学的时候跟我逼逼这个事情,所以,还是老老实实地写一下吧. Baidu统计API的使 ...
- python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用
python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/r ...
- Python 调用图像融合API
Python 调用图像融合API 本文记录使用Python,调用腾讯AI开放平台的图像融合API.官网给出的Demo用的是PHP,博主作为Python的粉丝,自然想用它来和『最好的』的语言一较高下,顺 ...
- Python自动化开发 - RESTful API
本节内容 1. RESTful 简介 2. RESTful 设计指南 3. Django REST Framework 最佳实践 4. 理论拓展与开放平台 5. API文档化与测试 一 R ...
- P4python: python interface to Perforce API
P4python is the python interface to Perforce API, it helps to do Perforce operations through python. ...
- Python多线程豆瓣影评API接口爬虫
爬虫库 使用简单的requests库,这是一个阻塞的库,速度比较慢. 解析使用XPATH表达式 总体采用类的形式 多线程 使用concurrent.future并发模块,建立线程池,把future对象 ...
随机推荐
- hdu4971 流-最大权闭包
题意: 给了一些任务,然后给了一些完成某些任务的限制,然后又给了限制之间的拓扑关系,最后问你最大收益. 思路: 很直白,就是流的一个应用,最大权闭包,没涉及到什么想法的地方,建 ...
- 路由协议之RIP
目录 RIP协议 RIP的路由汇总和过滤 RIP的认证 RIP的防环机制 华为/思科中的配置 RIP协议 RIP协议是一种内部网关协议(IGP),底层是贝尔曼福特算法,是一种动态路由选择协议,用于自治 ...
- PhotoShop 第一课 功能认识
功能认识 1.基本界面 可以对各工具栏进行编辑,对工具/栏目进行勾选添加和整合并搭建自己的专属操作页面. 2.画布设置 拍照或者画画都需要一个东西来呈现这个东西叫做画布(可以通过导航栏-文件-新建画布 ...
- 半自动二进制协议模糊工具 Peach 使用
链接:https://bbs.ichunqiu.com/thread-54487-1-1.html
- WIN64内核编程-的基础知识
WIN64内核编程基础班(作者:胡文亮) https://www.dbgpro.com/x64driver 我们先从一份"简历"说起: 姓名:X86或80x86 性别:? 出生 ...
- Linux-鸟菜-5-目录配置-FHS
Linux-鸟菜-5-目录配置-FHS 这节内容比较休闲,主要就是介绍Linux的目录配置,也就是那些目录通常是干啥的,这个比较重要,需要我们去了解.但是我觉得通常看一遍记不住啥,也就记个大概,主要还 ...
- 【python】Leetcode每日一题-森林中的兔子
[python]Leetcode每日一题-森林中的兔子 [题目描述] 森林中,每个兔子都有颜色.其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色.我们将这些回答放在 answers ...
- 还不懂 redis 持久化?看看这个
Redis 是一个内存数据库,为了保证数据不丢失,必须把数据保存到磁盘,这就叫做持久化. Redis 有两种持久化方法: RDB 方式以及 AOF 方式 RDB 持久化 前言 RDB持久化把内存中的数 ...
- JUC 并发类概览
JUC 并发类及并发相关类概览,持续补充... AQS 内部有两个队列,一个等待队列(前后节点),一个条件队列(后继节点),其实是通过链表方式实现: 等待队列是双向链表:条件队列是单向链表:条件队列如 ...
- 有趣的css—简单的下雨效果
简单的下雨效果 前言 最近在b站上看到一个下雨效果的视频,感觉思路很清奇,我也按照自己的思路做了一个简单的下雨效果. 由于我制作GIF图片的工具最多只支持制作33FPS的GIF图,所以看起来可能有一点 ...