TensorRT推理——(一)转换成onnx模型

本文介绍了如何将PyTorch的ResNet50模型转换为ONNX格式,包括设置BatchSize,使用torch.onnx.export进行转换,验证ONNX模型格式,简化模型以及对比转换前后的精度。此外,还提到了使用ONNXRuntime进行模型验证和NETRON进行模型可视化。

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

一、 转换ONNX步骤

使用TensorRT推理肯定是在英伟达GPU环境上进行推理的。

  • 设置Batch Size
  • 转换模型
  • 验证转换前后精度

二、转换成onnx

1. torch.onnx.export转换ONNX

pytoch计算图是静态的,先编译后执行。

import torch
import torch.onnx
import torchvision.models as models
# 输入sahpe (和输入shape一样,数据内容随机,Tensor类型)
dummy_input=torch.randn(BATCH_SIZE, 3, 224, 224)
# device设置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
dummy_input = dummy_input.to(device)
# 加载model
resnet50_model = models.resnet50(pretrained=True, progress=False).to("cuda").eval()
# 设置Batch Size
BATCH_SIZE = 32

# 使用torch.onnx.export转换
torch.onnx.export(resnet50_model,           # loaded torch model
                  dummy_input,              # input shape
                  "resnet50_pytorch.onnx",  # export onnx model name path
                  opset_version=11,         # op version
                  training=torch.onnx.TrainingMode.EVAL,  # 以推理模式导出模型
                  do_constant_folding=True, # 是否使用“常量折叠”优化。常量折叠将使用一些算好的常量来优化一些输入全为常量的节点
                  input_names=["input"],    # 按顺序分配onnx图输入节点名称,可有多个输入
                  output_names=["output"],  # 按顺序分配onnx图输出节点名称,可有多个输出
                  # dynamic_axes: 设置动态维度,key为input_names output_names的名字,value中的key为对应哪些维度是动态的,value中的value为给对应维度取的名称
                  dynamic_axes={"input": {0:"batch_size", 1:"channel", 2:"height", 3:"height"}},
                  verbose=False)   

2. 验证导出的ONNX模型格式是否正确

如果有错误的话该函数会直接报错。模型正确的话,控制台中应该会打印出"Model correct"。

onnx_model = onnx.load(onnx_model_path)  # load onnx model
onnx.checker.check_model(onnx_model)  # check onnx model

使用onnxsim对onnx模型后进行简化。就是把conv和bn合在一块,以及一些计算出来是常量的模块直接折叠之类的,可以加快onnx模型推理。如果你需要的时tensorrt,那么可能不太需要这步,因为tensorrt也做了这些优化。

import onnxsim
onnx_model = onnx.load(ONNX_MODEL_PATH)
onnx_sim_model, check = simplify(onnx_model)
assert check, "Simplified ONNX model could not be validated"
onnx.save(onnx_sim_model, ONNX_SIM_MODEL_PATH)
print('ONNX file simplified!')

对动态batch的onnx模型进行简化:

import onnxsim
onnx_model = onnx.load(ONNX_MODEL_PATH)
onnx_sim_model, check = simplify(onnx_model, dynamic_input_shape=True, input_shapes={"images":[1, 3, 224, 224]})
assert check, "Simplified ONNX model could not be validated"
onnx.save(onnx_sim_model, ONNX_SIM_MODEL_PATH)
print('ONNX file simplified!')

3. 验证模型转换前后的精度

使用onnxruntime和onnxruntime-gpu跑一下模型,前、后处理要和转换前的模型一致。
也有将EfficientNMS作为插件做成一个End to End的模型进行推理。

4. 将转换前后的模型放入到NETRON上查看转换前后的差别,便于排错。

ref:

https://blog.youkuaiyun.com/m0_38043555/article/details/114479282
https://github.com/Linaom1214/TensorRT-For-YOLO-Series

### ONNX 模odel 使用教程及相关信息 #### 什么是ONNXONNX(Open Neural Network Exchange)是种开放式的神经网络交换格式,旨在使不同框架之间的模型互操作成为可能。通过将模型换为ONNX格式,开发者可以在不同的机器学习工具之间轻松迁移模型[^1]。 --- #### PyTorchONNX换流程 为了将PyTorch模型换为ONNX模型,可以按照以下方法实现: ```python import torch import torch.onnx # 定义或加载PyTorch模型 model = ... # 替换为实际的模型实例 model.eval() # 将模型设置为评估模式 # 创建示例输入张量 x = torch.randn(1, 3, 224, 224) # 假设这是个1x3x224x224的4D张量 # 导出模型ONNX文件 torch.onnx.export( model, # 被运行的模型 x, # 模型输入 "model.onnx", # 输出文件名 export_params=True, # 是否导出训练好的参数 opset_version=10, # ONNX版本号 do_constant_folding=True, # 执行常量折叠优化 input_names=['input'], # 输入名称列表 output_names=['output'], # 输出名称列表 dynamic_axes={'input': {0: 'batch_size'}, # 动态轴配置 'output': {0: 'batch_size'}} ) ``` 上述代码展示了如何将单输入的PyTorch模型换为ONNX模型[^3]。如果模型具有多输入,则需调整`torch.onnx.export()`函数中的相应部分。 --- #### ONNX模型的加载与测试 旦成功生成`.onnx`文件,可以通过如下方式加载并验证其功能: ```python import onnxruntime as ort import numpy as np # 初始化ONNX Runtime会话 session = ort.InferenceSession("model.onnx") # 准备输入数据 input_name = session.get_inputs()[0].name dummy_input = np.random.rand(1, 3, 224, 224).astype(np.float32) # 获取推理结果 outputs = session.run(None, {input_name: dummy_input}) print(outputs) ``` 此脚本利用`onnxruntime`库来加载和推断已换的ONNX模型。 --- #### 可视化ONNX模型结构 要直观理解ONNX模型的内部架构及其使用的运算符,可借助Netron工具进行可视化分析。以下是具体步骤: 1. 下载并安装[Netron](https://github.com/lutzroeder/netron)。 2. 启动Netron应用程序并将目标`.onnx`文件拖入界面。 3. 查看模型图层、节点以及所涉及的操作符详情。 这种方法有助于确认模型是否按预期构建,并识别潜在问题。 --- #### ONNX与其他框架的交互 除了从PyTorch换外,还可以进步将ONNX模型迁移到其他平台,比如TensorRT、Core ML或者自定义C++应用中。例如,在某些项目中提到过种路径——即先由PyTorchONNX再经中间处理得到TNN模型用于嵌入式设备部署[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值