TensorRT(7):python版本使用入门

本文详细介绍了如何使用TensorRT的Python API在线加载ONNX模型,序列化保存为TRT模型,以及反序列化加载已保存的模型进行推断。通过示例代码展示了从读取图像、模型转换到执行推断的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


TensorRT系列传送门(不定期更新): 深度框架|TensorRT



本文以onnx分类模型为例,简单介绍TRT-python版本的使用流程,这里不涉及量化,就以fp32为例,验证在线加载onnx模型、序列化保存为trt模型、加载序列后的模型等。

TensorRT的使用过程包括两个阶段, build和 deployment
在这里插入图片描述
build阶段主要完成模型转换,从caffe或者tf或者pyTorch到TensorRT

一、TRT在线加载模型,并构建推断引擎的步骤

主要分为四步:

  • 1、建立一个logger日志,必须要有,但又不是那么重要
  • 2、创建一个builder
  • 3、创建一个netwok,这时候netWork只是一个空架子
  • 4、建立一个 Parser,caffe模型、onnx模型和TF模型都有对应的paser,顾名思义,就用用来解析模型文件的
  • 5、建立 engine,进行层之间融合或者进度校准方式,可以fp32、fp16或者fp8
  • 6、建议一个context,这个是用来做inference推断的。上面连接engine,下对应推断数据,所以称之为上下文联系器(博主自取的)
    (PS:感谢晖神提供流程图)
    在这里插入图片描述

二、在线加载onnx模型,序列化保存到本地

主要功能:
1、opencv读取图像,减均值除方差,在NHWC转NCHW
2、trt解析onnx模型
3、保存序列化后的模型
4、建立engine,推断模型、生成结果

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""                  
*  * *** *  * *  *      
*  *  *   **  *  *             
****  *   **  *  *                 
*  *  *   **  *  *         
*  * **  *  * ****  

@File     :inferenceWithTrt.py  
@Date     :2021/3/18 下午1:18  
@Require  :   
@from     :https://blog.youkuaiyun.com/hjxu2016/
@Funtion  :用trt接口推断onnx模型
"""

import pycuda
import pycuda.driver as cuda
import pycuda.autoinit
import onnx
import onnxruntime
import tensorrt as trt
import cv2
import numpy as np
 
# 为输入输出分配内存

def read_img():
    bgr_img = cv2.imread('./Data/validation/0-back/dog.4.jpg')

    bgr_img = cv2.resize(bgr_img, (224, 224))
    rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB)
    # img = Image.open("./Data/validation/0-back/dog.4.jpg")
    # img = img.resize((224, 224))
    x = np.transpose(rgb_img, (2, 0, 1))
    x = x/255.
    return x

TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
onnx_model_file = "./saved_weights/senet_50.onnx"
EXPLICIT_BATCH = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
builder = trt.Builder(TRT_LOGGER)  # 创建一个builder
config = builder.create_builder_config() # 创建一个congig
config.max_workspace_size = 1<<20
network = builder.create_network(EXPLICIT_BATCH) # 创建一个network
parser = trt.OnnxParser(network, TRT_LOGGER)

model = open(onnx_model_file, 'rb')
if not parser.parse(model.read()):
    for error in range(parser.num_errors):
        print(parser.get_error(error))

engine = builder.build_cuda_engine(network) # 创建engine

# 是否需要序列化保存模型
if False:
    saved_trt_path = "./saved_weights/senet_50.trt"
    with open(saved_trt_path, "wb") as f:
        f.write(engine.serialize())
# 构建context
context = engine.create_execution_context() # 创建context用来执行推断

三、反序列化直接加载保存后的trt模型

saved_trt_path = "./saved_weights/senet_50.trt"
f = open(saved_trt_path, "rb") 
runtime = trt.Runtime(TRT_LOGGER) 
engine = runtime.deserialize_cuda_engine(f.read())
context = engine.create_execution_context() # 创建context用来执行推断

四、构建cuda数据,推断trt模型

# h指设备端数据,d指的是cuda端数据
h_input = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(0)), dtype=trt.nptype(trt.float32))
h_output = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(1)), dtype=trt.nptype(trt.float32))
d_input = cuda.mem_alloc(h_input.nbytes)
d_output = cuda.mem_alloc(h_output.nbytes)
stream = cuda.Stream()
#读取数据
x = read_img().astype(trt.nptype(trt.float32)).ravel()
np.copyto(h_input, x)
cuda.memcpy_htod_async(d_input, h_input, stream)
context.execute_async(bindings=[int(d_input), int(d_output)], stream_handle=stream.handle)
# 从GPU中返回output。
cuda.memcpy_dtoh_async(h_output, d_output, stream)
# 同步流。
stream.synchronize()
print(h_output)
<think>好的,我现在需要回答用户关于TensorRT使用指南和优化技巧的问题。首先,我得回顾一下用户提供的引用内容,确保信息准确。用户引用了五个来源,主要涉及TensorRT的功能、优化方法、最佳实践以及应用场景。 首先,TensorRT是NVIDIA推出的推理优化工具,核心功能包括模型压缩、计算图优化和硬件加速。根据引用5,这些技术能显著提升推理速度和降低资源消耗。接下来,我需要整理使用TensorRT的基本步骤,可能包括模型导入、优化配置、生成引擎和部署。引用3提到TensorRT提供API和解析器导入模型,然后生成优化后的运行时引擎,所以这部分需要详细说明。 然后是优化技巧,用户可能想知道具体如何提高性能。引用4提到提高吞吐量和减少延迟的技术,可以结合最佳实践指南(引用2)中的内容。比如混合精度推理,使用FP16或INT8量化,这需要结合TensorRT的支持来讨论。另外,层融合(Layer Fusion)和内存优化也是关键点,引用5提到计算图优化,这可能包括层融合。动态形状支持适用于可变输入尺寸,如自然语言处理中的不同序列长度,这也需要提到。 性能调优方面,需要提到批处理(Batch Size)调整,以及使用Profiler工具分析瓶颈,如引用4中的性能最佳实践。应用场景方面,引用5提到自动驾驶、工业检测等,可以举例说明不同场景下的优化策略。 最后,按照用户要求生成相关问题,需要覆盖核心概念、优化方法、性能调优、应用场景和最佳实践。确保问题相关且能引导进一步学习。 需要注意的是,所有数学表达式要用$...$格式,独立公式用$$...$$,但当前内容可能涉及较少数学,但如果有提到比如量化公式,可能需要处理。例如,INT8量化的公式可能需要用LaTeX表示,但根据引用内容,可能不需要深入数学细节。 另外,确保回答结构清晰,分点说明,帮助用户逐步了解TensorRT使用和优化。同时,引用标记要自然添加,比如在提到模型导入时引用3,优化技巧时引用4和5,性能调优引用2和4等。 可能还需要检查是否有遗漏的关键点,例如模型转换工具(如ONNX)、动态库的使用,或者特定API的调用,但根据现有引用,可能不需要太深入代码细节,但用户的问题是关于使用指南和优化技巧,所以应保持实用。 总结下来,回答的结构应该是: 1. TensorRT简介和核心功能 2. 使用指南步骤 3. 优化技巧(混合精度、量化、层融合等) 4. 性能调优建议 5. 应用场景 6. 相关问题生成 确保每个部分都有对应的引用支持,并且语言简洁明了,符合中文表达习惯。</think>### TensorRT 深度学习推理引擎使用指南与优化技巧 TensorRT 是 NVIDIA 推出的高性能推理优化工具,专为在 GPU 上高效部署深度学习模型设计。以下是其核心功能、使用步骤和优化技巧的详细说明。 --- #### **一、TensorRT 的核心功能** 1. **模型压缩**:通过剪枝、量化(如 INT8)减少模型参数量和计算量[^5]。 2. **计算图优化**:合并冗余层(层融合)、消除无效操作,提升计算效率[^5]。 3. **硬件级加速**:针对 NVIDIA GPU 架构优化内核调度和内存分配[^3]。 --- #### **二、TensorRT 使用指南** 1. **模型导入** - 使用 TensorRT 的解析器(如 ONNX-TensorRT 或框架原生接口)将训练好的模型(PyTorch/TensorFlow 等)转换为 TensorRT 格式[^3]。 - 示例代码片段(ONNX 模型导入): ```python import tensorrt as trt with trt.Builder(TRT_LOGGER) as builder: network = builder.create_network() parser = trt.OnnxParser(network, TRT_LOGGER) with open("model.onnx", "rb") as f: parser.parse(f.read()) ``` 2. **构建优化引擎** - 配置优化参数(精度模式、最大批处理大小等),生成推理引擎: ```python config = builder.create_builder_config() config.set_flag(trt.BuilderFlag.FP16) # 启用 FP16 加速 engine = builder.build_engine(network, config) ``` 3. **部署推理** - 序列化引擎并加载到推理运行时: ```python with open("engine.plan", "wb") as f: f.write(engine.serialize()) # 加载引擎并执行推理 runtime = trt.Runtime(TRT_LOGGER) with open("engine.plan", "rb") as f: engine = runtime.deserialize_cuda_engine(f.read()) ``` --- #### **三、优化技巧** 1. **混合精度推理** - 使用 FP16 或 TF32 精度加速计算(需 GPU 支持),可提升吞吐量 2-3 倍[^4]。 - 启用方法:`config.set_flag(trt.BuilderFlag.FP16)` 2. **INT8 量化** - 通过校准数据减少模型精度至 INT8,降低内存占用和延迟。适用于对精度损失不敏感的场景[^5]。 - 公式:$$ x_{\text{int8}} = \text{round}\left( \frac{x_{\text{float}}}{s} \right) $$,其中 $s$ 为缩放因子。 3. **动态形状支持** - 为可变输入尺寸(如 NLP 中的序列长度)配置动态维度范围: ```python profile = builder.create_optimization_profile() profile.set_shape("input", (1, 3, 224, 224), (8, 3, 224, 224), (32, 3, 224, 224)) config.add_optimization_profile(profile) ``` 4. **层融合与内存优化** - TensorRT 自动合并卷积、激活函数等连续操作为单一内核,减少显存访问次数[^5]。 --- #### **四、性能调优建议** - **批处理(Batch Size)**:增大批处理提高 GPU 利用率,但需平衡延迟[^4]。 - **异步推理**:使用 CUDA Stream 并行执行数据传输与计算[^4]。 - **Profile 工具**:通过 `trt.Profiler` 分析各层耗时,针对性优化瓶颈层[^2]。 --- #### **五、应用场景** - **高吞吐场景**:视频流分析、批量图像处理(工业检测)。 - **低延迟场景**:自动驾驶实时决策、在线推荐系统[^5]。 - **边缘设备**:Jetson 系列嵌入式 GPU 部署[^3]。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值