当前位置: 首页 > news >正文

TensorRT安装部署指南(Windows10)

TensorRT安装部署指南

时间:2023/11/01
说明:本指南针对在装有NVIDIA显卡的Windows10系统的计算机上,安装TensorRT推理加速工具,将pytorch中导出的onnx模型转换为trt模型文件,并在python语言中进行模型推理。


一、TensorRT安装

TensorRT官方安装指南:https://docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html#installing-zip

注意

  1. 官方给出了pip、RPM、Tar文件、Zip文件等多种安装方式。需要注意,通过zip文件安装是目前 Windows 的唯一选项。Zip文件从官网下载。下载完成后,只需要按照官方安装指南中给出的步骤进行安装和环境配置。
  2. 安装TensorRT前需要确保已经安装对应的CUDA和cuDNN依赖。CUDA和cuDNN的安装方法可以参考:CUDA和cudnn安装教程。

二、将ONNX模型转换为TensorRT引擎

将ONNX模型转换成TensorRT的最简单的方法就是使用{TensorRT}/bin下的命令行工具trtexec

trtexec --onnx=model.onnx --saveEngine=model.trt

这里的--onnx--saveEngine分别代表onnx模型的路径保存trt模型的路径。此外,再介绍两个比较常用的trtexec命令行工具参数:

  • --explicitBatch:告诉trtexec在优化时固定输入的 batch size(将从onnx文件中推断batch size的具体值,即与导出onnx文件时传入的batch size一致)。当确定模型的输入batch size时,推荐采用此参数,因为固定batch size大小可以使得trtexec进行额外的优化,且省去了指定“优化配置文件”这一额外步骤(采用动态batch size时需要提供“优化配置文件”来指定希望接收的可能的batch size大小的范围);
  • --fp16:采用FP16精度,通过牺牲部分模型准确率来简化模型(减少显存占用和加速模型推理)。TensorRT支持TF32/FP32/FP16/INT8多种精度(具体还要看GPU是否支持)。FP32是多数框架训练模型的默认精度,FP16对模型推理速度和显存占用有较大优化,且准确率损失往往可以忽略不计。INT8进一步牺牲了准确率,同时也进一步降低模型的延迟和显存要求,但需要额外的步骤来仔细校准,来使其精度损耗较小。

三、在Python API使用TensorRT模型进行推理

使用Python API运行TensorRT模型推理需要安装pycuda包:

pip install pycuda

注:若pycuda安装失败,尝试到https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycuda 下载python版本对应的最新的本地安装文件安装
然后参照官方给的示例代码运行TensorRT模型推理:tutorial-runtime.ipynb
下面给出Unet语义分割模型运行tensorrt推理的主要代码:
(1) 导入TensorRT推理需要的库

import pycuda.driver as cuda
import pycuda.autoinit
import tensorrt as trt

(2) 加载TensorRT引擎

def load_engine(self, engine_file_path):TRT_LOGGER = trt.Logger()assert os.path.exists(engine_file_path)print("Reading engine from file {}".format(engine_file_path))with open(engine_file_path, "rb") as f, trt.Runtime(TRT_LOGGER) as runtime:return runtime.deserialize_cuda_engine(f.read())

(3) 进行推理

def engine_infer(self, engine, input_image):"""engine: load_engine函数返回的trt模型引擎input_image: 模型推理输入图像,尺寸为(batch_size, channel, height, width)output:Unet模型推理的结果,尺寸为(batch_size, class_num, height, width)"""batch_size = input_image.shape[0]image_channel = input_image.shape[1]image_height = input_image.shape[2]image_width = input_image.shape[3]with engine.create_execution_context() as context:# Set input shape based on image dimensions for inferencecontext.set_binding_shape(engine.get_binding_index("input"), (batch_size, image_channel, image_height, image_width))# Allocate host and device buffersbindings = []for binding in engine:binding_idx = engine.get_binding_index(binding)size = trt.volume(context.get_binding_shape(binding_idx))dtype = trt.nptype(engine.get_binding_dtype(binding))if engine.binding_is_input(binding):input_buffer = np.ascontiguousarray(input_image)input_memory = cuda.mem_alloc(input_image.nbytes)bindings.append(int(input_memory))else:output_buffer = cuda.pagelocked_empty(size, dtype)output_memory = cuda.mem_alloc(output_buffer.nbytes)bindings.append(int(output_memory))stream = cuda.Stream()# Transfer input data to the GPU.cuda.memcpy_htod_async(input_memory, input_buffer, stream)# Run inferencecontext.execute_async_v2(bindings=bindings, stream_handle=stream.handle)# Transfer prediction output from the GPU.cuda.memcpy_dtoh_async(output_buffer, output_memory, stream)# Synchronize the streamstream.synchronize()output = np.reshape(output_buffer, (batch_size, self.num_classes, image_height, image_width))return output

注意事项

(1)TensorRT是硬件相关的

不同显卡(不同GPU),其核心数量、频率、架构、设计都是不一样的,TensorRT需要对特定的硬件进行优化,不同硬件之间的优化是不能共享的。

(2)TensorRT支持哪几种权重精度

支持FP32、FP16、INT8、TF32等,这几种类型都比较常用。

  • FP32:单精度浮点型,深度学习中最常见的数据格式,训练推理都会用到;
  • FP16:半精度浮点型,相比FP32占用内存减少一半,有相应的指令值,速度比FP32要快很多;
  • TF32:第三代Tensor Core支持的一种数据类型,是一种截短的 Float32 数据格式,将FP32中23个尾数位截短为10bits,而指数位仍为8bits,总长度为19(=1+8 +10)。保持了与FP16同样的精度(尾数位都是 10 位),同时还保持了FP32的动态范围指数位都是8位);
  • INT8:整型,相比FP16占用内存减小一半,有相应的指令集,模型量化后可以利用INT8进行加速。

相关文章:

  • 采集Prestashop独立站采集Prestashop独立站
  • 【数据结构】树与二叉树(十一):二叉树的层次遍历(算法LevelOrder)
  • S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)
  • 多个微信快速同步发圈
  • 每日一练:Python中如何使用enumerate 函数创建带索引的元组
  • 什么是Ribbon的饥饿加载?有什么优势?
  • LeetCode_线段树_中等_307.区域和检索 - 数组可修改
  • 【PG】PostgreSQL 目录结构
  • 向量的范数、矩阵的范数
  • Apipost IDEA插件如何使用
  • keep-alive缓存,三级路由不生效
  • 摔杯算法(要求用最少的测试次数找出恰巧会使杯子破碎的楼层。)
  • ChatGPT的prompt技巧 心得
  • 【Git系列】Github指令搜索
  • WebSocket技术解析:实现Web实时双向通信的利器
  • [译]前端离线指南(上)
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Angular数据绑定机制
  • CentOS 7 修改主机名
  • java中具有继承关系的类及其对象初始化顺序
  • mongodb--安装和初步使用教程
  • node-glob通配符
  • React Transition Group -- Transition 组件
  • 搭建gitbook 和 访问权限认证
  • 分类模型——Logistics Regression
  • 工作中总结前端开发流程--vue项目
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 深度解析利用ES6进行Promise封装总结
  • 怎样选择前端框架
  • 最近的计划
  • ​io --- 处理流的核心工具​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #1015 : KMP算法
  • (1)(1.11) SiK Radio v2(一)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (接口封装)
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)winform之ListView
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET NPOI导出Excel详解
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net开发时的诡异问题,button的onclick事件无效
  • .net中应用SQL缓存(实例使用)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .sdf和.msp文件读取
  • ?.的用法
  • ??javascript里的变量问题
  • @AutoConfigurationPackage的使用
  • @SentinelResource详解