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 版