ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深度学习 之 模型部署【2】-TensorRT 入门

2022-08-20 14:30:22  阅读:226  来源: 互联网

标签:入门 tensorrt TensorRT cuda https 深度 安装 trt


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 版

标签:入门,tensorrt,TensorRT,cuda,https,深度,安装,trt
来源: https://www.cnblogs.com/yanshw/p/16461169.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有