TensorRT 简介

TensorRT 是 英伟达公司 根据自己的 硬件设备 面向 AI工作者 推出的 一种 模型部署方案

同时 可以对网络进行 压缩、优化,它通过 combines layers、kernel 优化选择,以及根据指定精度执行归一化和转换成最优的 matrix math 方法,改善网络延迟、吞吐量和效率,实现模型加速,官方称 可以达到 6倍以上;

它支持 多种 深度学习 框架,如 tf、pytroch等,即 它 可以从 深度学习框架中 直接 读取 网络结构 和 权重,没有框架的开销;  【不同的深度学习框架有自己的模型定义方式,TensoRT要获取模型的网络结构和参数权重,必然需要先能够“读懂”框架的“语言”】

它本质上是一个 推理框架

TensorRT 依赖于Nvidia的深度学习硬件环境,可以是GPU也可以是DLA,如果没有的话则无法使用

更可喜的是它全面支持 python;

 

windows10 下安装 TensorRT

安装教程 还是 官网,下图为官网部分截图

 说明

1. 在 TensorRT8 以后才支持 在 windows 的 python 操作

2.经测试,无需安装 PyCUDA,可能后面应用时候需要,到时候再说

3.TensorRT 只支持 部分 CUDA 版本      【刚开始没看官网,白折腾半天】

4.注意对 深度学习框架版本 的 支持

 

安装步骤

1. 安装好 cuda 和 cudnn

2. 下载 tensorRT,https://developer.nvidia.com/tensorrt,      【windows 下 python 接口 只能下载 版本8】

3.解压

4.把 lib 里 所有 dll 库 拷贝到 cuda 安装目录的 bin 目录下,或者 把 lib 目录放到 环境变量的 path 里

5.进入 解压后的python目录,选择对应的 tensorrt 版本,pip 安装

pip install tensorrt-8.2.3.0-cp38-none-win_amd64.whl

6.其他非必要步骤 

如果需要读取 onnx 格式模型文件,还需安装 onnx_graphsurgeon,进入该目录

pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl

同理执行

pip install graphsurgeon-0.4.5-py2.py3-none-any.whl
pip install uff-0.6.9-py2.py3-none-any.whl

7.测试是否安装成功

import tensorrt as trt
print(trt.__version__)

 

TensorRT 加速原理 

简单理解下,把 3 次 1x1 卷积 合并了

了解即可 

 

 TensorRT 使用方法

通过 使用流程方法 可进一步理解 TensorRT 是干嘛的

部署流程分为 预处理阶段 和 推理阶段,具体如下:

1. 导出 深度学习 网络定义 和 权重参数 

2. 解析 深度学习 网络定义 和 权重参数    【这两步说明 支持 多种框架】

3. 根据 显卡算子 构造出最优执行计划

4. 将最优执行计划 序列化存储

5. 反序列化 最优执行计划

6. 进行推理

 

补充说明

1. 步骤 3 说明 tensorrt 是和 硬件/显卡、环境/cuda 绑定的,如果 硬件、环境 发生变换,需要重新部署

2. 虽说 tensorrt 支持 多种框架,但 通常 会把 tf、torch 等框架 的模型和参数转换成 onnx 格式,然后用 tensorrt 部署,

因为 onnx 不像 tf、torch 那样需要安装对应的包,onnx 可认为是一种通用 语言,可以把 各种框架 转换成 该 语言,方便后续操作    【具体参考我的其他博客】

 

预推理阶段

该阶段是 结合 网络结构、参数 和 软硬件环境 生成 最优执行计划,并且 序列化 为 xxx.engine 文件;     【时间较长,故序列化】

可以使用 tensorrt 自带的 trtexec.exe 实现(bin目录下),也可用 代码实现;

 

命令行实现方式

trtexec --onnx=xxx.onnx --saveEngine=xxx.engine --fp16

fp16 模型量化的方式,还可取 int8,不推荐,虽然速度快,但精度损失较大

 

python 代码实现预推理

# 导入必用依赖
import tensorrt as trt
# 创建logger:日志记录器
logger = trt.Logger(trt.Logger.WARNING)
 
# 创建构建器builder
builder = trt.Builder(logger)
# 预创建网络
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
# 加载onnx解析器
parser = trt.OnnxParser(network, logger)
success = parser.parse_from_file(onnx_path)
for idx in range(parser.num_errors):
  print(parser.get_error(idx))
if not success:
  pass  # Error handling code here
# builder配置
config = builder.create_builder_config()
# 分配显存作为工作区间,一般建议为显存一半的大小
config.max_workspace_size = 1 << 30  # 1 Mi
serialized_engine = builder.build_serialized_network(network, config)
# 序列化生成engine文件
with open(engine_path, "wb") as f:
   f.write(serialized_engine)
   print("generate file success!")

 

推理部署阶段

该阶段是 反序列化 最优执行计划,然后进行推理;

在 推理阶段,tensorrt 只关注 网络定义和权重参数,对于 输入和输出 需 另外导入;

 

核心代码

#导入必用依赖
import tensorrt as trt
import pycuda.autoinit  #负责数据初始化,内存管理,销毁等
import pycuda.driver as cuda  #GPU CPU之间的数据传输
#创建logger:日志记录器
logger = trt.Logger(trt.Logger.WARNING)
#创建runtime并反序列化生成engine
with open(“sample.engine”, “rb”) as f, trt.Runtime(logger) as runtime:
    engine = runtime.deserialize_cuda_engine(f.read())
#分配CPU锁页内存和GPU显存
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)
d_input = cuda.mem_alloc(h_input.nbytes)
d_output = cuda.mem_alloc(h_output.nbytes)
#创建cuda流
stream = cuda.Stream()
#创建context并进行推理
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

 

官方示例

TensorRT-8.4.1.5\samples\python 

 

小结

本文只是 基本教程,TensorRT 还有很多高级用法,比如 不仅可以载入模型,也可以自定义模型,比如支持动态 batch 等

 

 

 

 

参考资料:

https://docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html    官网 安装

https://blog.csdn.net/hjxu2016/article/details/122868139    TensorRT(10):python版本安装

https://blog.csdn.net/Yang_4881002/article/details/124292512  NVIDIA TensorRT (python win10)安装成功分享   

 

https://www.eet-china.com/mp/a125060.html   TensorRT8.4.xPythonAPI安装配置与测试      安装与 应用案例

https://zhuanlan.zhihu.com/p/165359425           tensorRT 的安装与使用

https://github.com/zhaogangthu/keras-yolo3-ocr-tensorrt    上篇文章的代码

 

https://blog.csdn.net/JianguoChow/article/details/122684310  TensorRT(二)TensorRT使用教程(Python版)    【使用方法 主要参考】

https://zhuanlan.zhihu.com/p/371239130  TensorRT详细入门指北,如果你还不了解TensorRT,过来看看吧!     【很全,有点多了,慢慢消化吧】

https://blog.csdn.net/JianguoChow/article/details/122684310    使用教程 Python 版